Question

Je travaillais juste sur du code et je me suis surpris à faire cette erreur

if (stringName == "firstName" || "lastName")
   // Do code 

évidemment, cela est faux et devrait être

if (stringName == "firstName" || stringName == "lastName")
   // Do code 

mais cela me fait penser à la lisibilité, le premier serait-il plus facile? Peut-être que si vous avez une logique qui pourrait dire, sauf si un nouveau nom de chaîne est spécifié, utilisez le premier?

Vraiment pas une question, je suis juste curieux de savoir s’il ya quelque chose que je ne comprends pas bien dans la logique qui sous-tend la compilation d’une telle déclaration.

Était-ce utile?

La solution

Le problème est que si fonctionne sur les booléens.

stringName == "quot FirstName" renvoie un booléen.
" lastName " est un littéral de chaîne.

|| est un booléen court-circuité ou un opérateur prenant des booléens des deux côtés.

En d'autres termes, vous souhaitez modifier la définition de || , ce qui est généralement une mauvaise idée.

En théorie, l’analyseur pourrait déduire ce que vous voulez dire ... mais cela devient rapidement ambigu.

if (stringName == firstName || lastName)

Ça a l'air correct, non? Mais qu'est-ce que lastName exactement?

Et si je faisais ça?

const bool lastName = false;

De même, & amp; & amp; est le contraire de || , mais stringName == firstName & amp; & amp; lastName n'est pas le contraire de la logique ci-dessus et n'aurait en fait aucun sens.

Autres conseils

Je pense que votre proposition brouillerait les règles d'analyse de l'expression. Désormais, le '==' devient un opérateur quadreny (?) plutôt qu'un opérateur binaire. Cependant, je me suis retrouvé dans l'absence de l'opérateur 'IN' de SQL, et j'ai utilisé quelque chose comme ceci:

if (stringName.In("foo", "bar", "baz"))
{

}

// in an extension method class
public static bool In<T>(this T value, params T[] values)
{
    return values.Contains(value);
}

Demander au compilateur de deviner les intentions du programmeur lorsque le code est clairement erroné afin de le réparer est une très, très mauvaise idée.

Même avec des parenthèses, cela n’a aucun sens. stringName == ("firstName" || "lastName") donne à penser que vous souhaitez tester la vérité des deux chaînes et que ces chaînes sont toujours vraies, puis comparez cette valeur booléenne. résultat avec la chaîne stringName .

Si vous ajoutez des parenthèses comme ceci (nom de chaîne == "quotName") || "lastName" , la condition sera toujours vraie, car "lastName" est toujours vrai, que StringName soit égal à "firstName" .

J'aime la façon dont Ruby le fait:

["firstName", "lastName"].include? stringName

Vous pouvez toujours utiliser Contains comme d'autres l'ont suggéré ou écrire une méthode d'extension String à l'endroit où vous pourriez le faire:

stringName.EqualsOneOf(new[] {"firstName", "lastName"})

La raison pour laquelle ils n'autorisaient pas une telle syntaxe était probablement due à la lisibilité. Si vous regardez le code pour la première fois et que vous n'êtes pas dans votre meilleur état d'esprit, vous ne verrez peut-être pas tout de suite que vous comparez NomChaîne à la fois " ; firstName " et " lastName " . Cela rend simplement vos intentions bien plus définies.

Là encore, les parenthèses pourraient résoudre ce problème.

Cela ne fonctionnerait que si opérateur || (chaîne, chaîne) renvoyait une sorte de collection de chaînes et que vous aviez une surcharge égale à qui prenait une chaîne et cette collection de chaînes et vérifié que la chaîne est dans la collection. On dirait que beaucoup de travail est fait en coulisse pour une construction très rarement utilisée.

Surtout que vous pouvez déjà faire quelque chose comme:

if(new string[]{"firstName","lastName"}.Contains(stringName))
    // code

Je trouve que la fonction Contains () résout ce problème, par exemple:

string[] ValidNames = new string[] { "firstName", "lastName"};

if(ValidNames.Contains(stringName))
{
    //Do Code
}

Cela ne me dérangerait pas que la syntaxe SQL ressemble à celle de:

if(stringName in ("firsName", "lastName"))
{
}

C’est pourquoi, par habitude, je fais toujours:

if ((stringName == "firstName") || (stringName == "lastName"))
   // Do code

Au bout d'un moment, cela devient une seconde nature.

Lorsque le FCL contient la richesse nécessaire pour créer la grande variété de réponses vue dans ce fil, vous n'avez pas besoin d'une syntaxe C # plus flexible, car la lisibilité devient rapidement une caractéristique de la manière dont vous créez la réponse parmi toutes les richesses. Cela se résume souvent à des choix entre des appels de méthode et d’objets.

Voici un exemple (un autre parmi beaucoup d'autres) permettant de localiser une ou plusieurs chaînes simultanément dans un tableau de chaînes, ou d'appliquer tout autre critère que vous jugez utile pour cet ensemble de chaînes. Les commentaires d'indentation, d'espacement et de code jouent un rôle important dans la compréhension de cet exemple de code, comme pour tout code.

        bool found = Array.Exists(
            // array of strings to search
            new[] { "c#", ".net", "programming", "design patterns", "work", "play", "bits", "bytes", "break" },
            // criteria - can even satisfy multiple conditions simultaneously if desired
            str => (str == ".NET" || str == "work") //look for ".NET" or "work"
            );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top