Question C # 4.0 - Comment gérer les paramètres de chaîne facultatifs


Ce code n'est pas valide:

private void Foo(string optionalString = string.Empty)
{
   // do foo.
}

Mais ce code est:

private void Foo(string optionalString = "")
{
   // do foo.
}

Pourquoi? Parce que string.Empty est un champ en lecture seule, pas une constante, et que les paramètres par défaut des paramètres facultatifs doivent être une constante à la compilation.

Donc, sur ma question ... (bien, souci)

C'est ce que j'ai dû faire:

private const string emptyString = "";

private void Foo(string optionalString = emptyString)
{
   // do foo.
   if (!string.IsNullOrEmpty(optionalString))
      // etc
}

Comment gérez-vous les paramètres de chaîne facultatifs?

Pourquoi ne peuvent-ils pas faire String.Empty une constante de compilation?


15
2017-08-31 05:41


origine


Réponses:


Ummm ... qu'est-ce qui ne va pas avec string optionalParm = "" encore? Pourquoi est-ce que c'est mauvais? Pensez-vous vraiment que vous avez besoin d’une constante symbolique pour une chaîne vide dans ce cas? Qu'en est-il de ça alors?

const int Zero = 0;

void SomeMethod(int optional = Zero) { }

Est-ce que cela vous semble idiot?


11
2017-08-31 05:47



si vous n'aimez pas la valeur "", vous pouvez utiliser la valeur par défaut (chaîne).
J'ai joué avec et c'est permis.

private static void foo(string param = default(string)) {
    if (!string.IsNullOrEmpty(param)) // or param != default(string)
        Console.WriteLine(param);
}

4
2017-09-23 07:34



La meilleure façon de les gérer consiste à:

private void Foo(string optionalString = "")
{
   // do foo.
}

Donc, vous ne pouvez pas utiliser String.Empty. Tout le monde reconnaît "", mais si j'ai trouvé optionalString = nullString Je ne saurais pas quoi penser. Si rien d'autre, nommez la chose emptyString- ce n'est pas nul!


2
2017-08-31 05:48



Avertissement d'analyse de code 1026 dit de ne pas utiliser les paramètres facultatifs. Il est préférable d'utiliser des méthodes de surcharge, comme ceci:

private void Foo()
{
   Foo(string.Empty);
}
private void Foo(string optionalString)
{
   // do foo.
   if (!string.IsNullOrEmpty(optionalString))
      // etc
}

1
2017-09-29 20:36



Je réponds à cette question.

Why can they not make String.Empty a compile-time constant?

Voici le code de désassemblage via Reflector of String.cs dans mscorlib.dll

public static readonly Empty;
static String()
{
    Empty = "";
    WhitespaceChars = new char[] { 
        '\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
        ' ', ' ', ' ', ' ', '​', '\u2028', '\u2029', ' ', ''
     };
}

Donc, dans la plate-forme Windows, string.Empty est exactement "". Mais savez-vous que Martian a une définition différente pour Empty et WhitespaceChars dans son OS.


0
2017-08-31 06:07



Si vous êtes prêt à jouer à la perte et à traiter les caractères nuls, "" et les espaces blancs identiques, vous pouvez définir par défaut null. Cela devient très pratique lorsque le nom d'utilisateur et le mot de passe sont des champs facultatifs en raison d'une possibilité de connexion sécurisée à une base de données. Vous pouvez changer cette logique pour réinitialiser les chaînes null et donc modifier l'assertion et le if. La partie importante est d'avoir une convention cohérente.

private void RunSql(string serverName, string databaseName, string userName = null, string password = null)
{
    userName = Strip(userName);
    password = Strip(password);

    // The `MsTest` assert - works in both `Debug` and `Release` modes.
    Assert.AreEqual<bool>(
        userName == String.Empty,
        password == String.Empty,
        "User name and password should be either both empty or both non-empty!");
   Assert.IsFalse(String.IsNullOrWhiteSpace(serverName));
   Assert.IsFalse(String.IsNullOrWhiteSpace(databaseName));

   var cmdBuilder = new StringBuilder();
   cmdBuilder.AppendFormat("sqlcmd -E -S {0} -d {1} ", serverName, databaseName);
   if (userName.Length > 0)
   {
       cmdBuilder.AppendFormat("-U {0} -P {1} ", userName, password);
   }

   // Complete the command string.
   // Run the executable.
}

// Cannot think of a good name. Emptify? MakeNullIfEmpty?
private string Strip(string source)
{
    if (String.IsNullOrWhiteSpace(source))
    {
        return String.Empty;
    }

    return source;
}

0
2018-04-05 16:08