10
votes

Est-il possible d'inclure une variable C # dans une variable de chaîne sans utiliser de concaténateur?

fait .NET 3.5 C # Permettez-nous d'inclure une variable dans une variable de chaîne sans avoir à utiliser le concaténateur + (ou String.Format (), pour cette affaire).

Par exemple (dans le pseudo, je ' m Utilisation d'un symbole $ Pour spécifier la variable): p> xxx pré>

sortie: p>

La date est le 4/12/2011 11:56:39 AM P> blockQuote>

edit strud> p>

en raison de la poignée des réponses suggérées string.format (), je ne peux supposer que mon message original n'était pas clair quand je mentionné " ... (ou string.format (), pour cette affaire) em>". Pour être clair, je suis bien conscient de la méthode String.Format (). Cependant, dans mon projet spécifique que je travaille sur, String.Format () ne m'aide pas (c'est en fait pire que le concaténateur +). P>

aussi, je déduit que la plupart / tous de vous vous demandez quel est le motif derrière ma question (je suppose que je ressentirais la même chose si je lisais ma question tel quel). P>

Si vous êtes l'un des curieux, voici le court-circuité : P>

Je crée une application Web exécutée sur un périphérique Windows CE. En raison de la fonctionnalité du serveur Web, je crée l'ensemble du contenu de la page Web (CSS, JS, HTML, etc.) dans une variable de chaîne. Par exemple, mon code géré .CS peut avoir quelque chose comme ceci: P>

string GetPageData()
    {
    string title = "Hello";
    DateTime date = DateTime.Now;

    string html = @"
    <!DOCTYPE html PUBLIC ...>
    <html>
    <head>
        <title>$title</title>
    </head>
    <body>
    <div>Hello StackO</div>
    <div>The date is $date</div>
    </body>
    </html>
    ";

}


4 commentaires

Qu'est-ce que vous avez contre le concaténator? Qu'est-ce que le pauvre speak plus signalez-vous à vous? Toute sa vie, c'est coincé faire l'exemple exactement, au moins que vous pouvez faire est l'utiliser.


@Ramhound - ha! Je veux dire aucun manque de respect envers le pauvre petit signe plus. Pour le motif derrière ma question, lisez ma réponse à @conqenator.


L'idée n'est pas mauvaise mais je ne le ferais jamais. Dès que vous renommez vos variables, cela ne fonctionnerait plus.


@ T3CHB0T - Si refactoring le gère bien, alors pas de soucis


14 Réponses :


0
votes
string.Format("The date is {0}", DateTime.Now.ToString())

8 commentaires

Pourquoi avoir un code supplémentaire? Surtout compte tenu de cela est un site de questions et de réponses. Quelqu'un vous copiera et beaucoup plus de gens devront y faire face.


Ça épargne sur la boxe du DateTime


@Yuriy Faktorovich: Conversion de la valeur en chaîne évite la boxe. Si vous ne le faites pas explicitement, cela se fera implicitement, il n'ya donc aucun code supplémentaire créé. Parfois, il est préférable de montrer ce que le code fait avec le code source réel au lieu de faire de le compilateur à créer le même code implicitement. Dans l'ensemble, ce n'est pas un cas de coupe claire où une façon est clairement meilleure que l'autre.


Si seul le réflecteur était toujours libre, je pouvais donc voir s'il s'agit de la boxe ou non.


@Brandon: "@ guffa - merci. Je n'allais pas répondre ..." _ - Vous savez que c'est ce que les icônes de flèche 'Up' sont pour @Yuriy: Monodis / ildasme montrera qu'il est ( IL_000B: ldloc.0; iL_000C: boîte [mscorlib] system.dateTime )


@Yuriy Faktorovich - Découvrez ILSPY


@Yuriy Faktorovich: the string.format ne prend que le type objet pour les paramètres de données, de sorte que tout type de valeur doit être en boîte à envoyer à la méthode.


L'OP ne veut pas utiliser .format



3
votes

Non, ça ne le fait pas. Il y a des moyens autour de cela, mais ils ont vaincu le but. La chose la plus facile pour votre exemple est xxx


0 commentaires

3
votes
string output = "the date is $d and time is $t";
output = output.Replace("$t", t).Replace("$d", d);  //and so on

7 commentaires

"Sans avoir à utiliser [...] string.format ()"


Sur votre question. Non, mais je suis curieux pourquoi tu le veux comme ça.


Je crée une application Web en cours d'exécution sur un périphérique Windows CE. Longue histoire courte, je crée l'ensemble du contenu de la page Web (CSS, JS, HTML) dans une variable de chaîne. Comme vous pouvez l'imaginer, la chaîne var devient assez laide avec tous les concats + pour y compris mes variables dans la chaîne var. Cela faciliterait ma vie si nous pouvions utiliser la syntaxe en ligne PHP / ColdFusion.


Vous pouvez utiliser des porteurs de places tels que #variablename (comme dans votre question), puis utilisez` string.replace () `? ..


@Jed qui ressemble à une question totalement différente. Vous devriez probablement utiliser un StressBuilder. Avoir de longues chaînes comme ça pourrait éventuellement polluer le loh.


@ROBINMABEN - Beaucoup de langues sont équipées de la fonctionnalité "Variable intérieure". Je voudrais utiliser ceci pour construire des commandes SQL facile à lire car cela est beaucoup plus lisible que les requêtes paramétrisées. (Pas de soucis, la sécurité est manipulée.) So suggéré remplacer () n'est pas un équivalent de ce qui est donné dans la réponse acceptée - Imagine expression suivie de 5 Remplacer par rapport à Simple "My String". PHPIT (Nouveau {A, B, C, D, E}) sans aucun code supplémentaire. Ceci est également plus sûr, vous ne pouvez pas mélanger accidentellement l'ordre des paramètres (comme avec {0}, {1}); Vous pouvez également lancer une exception FixMe si le param n'est pas dans la chaîne, etc. :)


@Miroxlav: Utilisation Vues de rasoir Voulez-vous résoudre le problème immédiatement, je suppose.



-1
votes

ou combiné: xxx pré>

info supplémentaire (en réponse à Brandonzeider ): p>

Yep, c'est gentil - un important pour les gens de Réalisez que la conversion de chaîne est automatiquement effectuée. L'ajout manuellement de tostring est cassé, par exemple: p>

string value = null;
Console.WriteLine("The value is '{0}'", value); // OK
Console.WriteLine("The value is '{0}'", value.ToString()); // FAILURE


4 commentaires

Il n'y a rien qui dit que le formatage devrait toujours être capable de gérer une valeur null. Si la valeur n'est pas censée être nulle, il n'y a pas de valeur ajoutée dans la manipulation du cas où il est null.


Mec ... surmonter ça. DateTime.now ne peut pas être nul. Est-ce que je t'ai coupé dans la circulation ou quelque chose?


Pense qu'il voulait dire le type nullable type DateTime ?? . De toute façon, je ne me soucie pas beaucoup pour une réponse. Je préfère beaucoup que le c # est NPT php commentaires effectué précédemment :).


N'hésitez pas à être en désaccord. Je ne t'ai pas taillé non plus; D'une manière ou d'une autre, vous m'avez demandé de clarifier. Ceci j'ai fait.



2
votes

La réponse courte et simple est: non!


3 commentaires

Bien qu'il soit un peu trop simple. C'est est short.


Pourquoi est-ce trop simple? Toutes les autres réponses ignorent évidemment que l'auteur a un format exclu et des fonctions similaires.


Techniquement, la réponse est trop simplifiée lorsque vous envisagez la base de la fonctionnalité requise (voir la réponse acceptée).



0
votes

Non, mais vous pouvez créer une méthode d'extension sur l'instance de chaîne pour créer la dactylographie plus courte.

string s = "The date is {0}".Format(d);


0 commentaires

12
votes

non, malheureusement c # n'est pas php.
Au bon côté, c # n'est pas php.


1 commentaires

Heureusement, c # tire le meilleur de PHP :) String Interpolation est maintenant disponible dans C # 6.0 et Visual Basic 14.



0
votes

string.format CODE> (et des fonctions de formatage similaires telles que stringbuilder.appendormat code>) sont le meilleur moyen de le faire en termes de flexibilité, de codage pratique et (généralement) Performance:

string s = string.Format("The date is {0}", d);


1 commentaires

Vérifiez Ce site asnwer sur la solution Comment réaliser quelle option OP demandée tout en conservant la syntaxe de String.Format {0: HH: mm} (dans ce cas {maintenant: hh: mm} )



0
votes

0 commentaires

0
votes

Si vous essayez simplement d'éviter la concaténation de chaînes immuables, ce que vous recherchez est stringbuilder .

Utilisation: p>

string parameterName = "Example";
int parameterValue = 1;
Stringbuilder builder = new StringBuilder();
builder.Append("The output parameter ");
builder.Append(parameterName);
builder.Append("'s value is ");
builder.Append(parameterValue.ToString());
string totalExample = builder.ToString();


0 commentaires

8
votes

presque, avec une petite méthode d'extension.

string foo = "Bar";
int cool = 2;

var result = "This is a string $foo with $cool variables"
             .PHPIt(new { 
                    foo, 
                    cool 
                });

//result == "This is a string Bar with 2 variables"


0 commentaires

3
votes

Basé sur la grande réponse de @jesperpalm J'ai trouvé une autre solution intéressante qui utilise une syntaxe similaire comme dans la méthode normale string.format : xxx

Cela vous donne la possibilité d'ajouter la mise en forme habituelle: xxx


1 commentaires

Je vois une valeur ajoutée ici dans l'activation de string.format () Spécificateurs de format.



0
votes

Depuis C # 6.0 Vous pouvez écrire chaîne "Le titre est \ {titre}" qui fait exactement ce dont vous avez besoin.


1 commentaires

Le C # 6.0 appuie-t-il le refactoring pour de telles cordes? Sinon, il est assez dangereux de coder le nom de la variable dans une chaîne.



0
votes

Vous pouvez utiliser quelque chose comme celui-ci comme mentionné dans la documentation C #. Interpolation de chaîne xxx


0 commentaires