8 votes

Quelle est la méthode la plus optimale pour vérifier si une chaîne est vide ?

Pour vérifier si une chaîne est vide, j'utilise

var test = string.Empty; 
if (test.Length == 0) Console.WriteLine("String is empty!");
if (!(test.Any())) Console.WriteLine("String is empty!");
if (test.Count() == 0) Console.WriteLine("String is empty!");
if (String.IsNullOrWhiteSpace(test)) Console.WriteLine("String is empty!");
  1. Toutes les déclarations ci-dessus produisent le même résultat. Quelle est la méthode optimale que je dois utiliser ?

    var s = Convert.ToString(test);    
    s = test.ToString(CultureInfo.InvariantCulture);
  2. Encore une fois, les deux déclarations font la même chose. Quelle est la meilleure méthode à utiliser ?

J'ai essayé de déboguer et comment évaluer les performances d'une instruction C# ?

10voto

peer Points 11386

Tout d'abord, les 4 statemens ne donnent pas la même sortie sur toutes les entrées. Essayez null et les 3 premiers jetteront une exception. Et si vous essayez whithspaces, le dernier vous donnera un résultat erroné. Vous devez donc vraiment réfléchir à ce que vous voulez. La meilleure façon de procéder est normalement le :

string.IsNullOrEmpty
string.IsNullOrWhiteSpace

Ce n'est que si vous faites cela plusieurs millions de fois que vous devez chercher à optimiser votre code.

Voici quelques résultats de tests, mais ils peuvent varier selon la version de .net :

Résultats des tests pour 100 millions d'itérations :

Equality operator ==:   796 ms 
string.Equals:          811 ms 
string.IsNullOrEmpty:   312 ms 
Length:                 140 ms  [fastest]
Instance Equals:       1077 ms 

source

3voto

codingbiz Points 15211

Je choisirais String.IsNullOrWhiteSpace o String.IsNullOrEmpty .

Length , Count y Any pourrait échouer si test es null con object null reference ]

Mise à jour

À moins que vous ne soyez sûr que votre chaîne ne sera pas nulle, vous devrez vérifier si la chaîne est nulle avant de tester la longueur ou le nombre ou d'appeler une méthode sur la variable.

Dans ce scénario, .Length n'est pas la même chose que String.IsNullOrWhiteSpace

string test = "    ";
test.Length == 0;  //false
String.IsNullOrWhiteSpace(test); //true

1voto

Davin Tryon Points 16838

Pour autant que je sache :

.Any() : a pour but de vérifier si des objets existent dans un tableau. Et comme string est un tableau de chars, cela fonctionne. Et fait partie de Linq

.Length : a pour but de vous donner la longueur du tableau de chars.

Donc, oui, le même comportement, mais des intentions légèrement différentes.

D'ailleurs, vous devriez vraiment utiliser String.IsNullOrWhitespace pour vérifier que les chaînes de caractères sont vides. C'est du moins ce que je préfère, de sorte que si vous avez une chaîne contenant de nombreux caractères d'espacement, vous n'avez pas besoin de la couper d'abord.

1voto

Viral Jain Points 578

Pour une variable, les résultats sont :

  1. String.IsNullOrEmpty(test) < String.IsNullOrWhiteSpace(test) << test.Length==0 <<< !(test.Any())test.Count() == 0
  2. test.ToString(CultureInfo.InvariantCulture) < Convert.ToString(test) (Ordre de 10 fois)

J'ai utilisé l'extrait de code suivant pour tester ce qui précède.

static void Main(string[] args)
    {
        var test = string.Empty;
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        if (test.Length == 0)
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (!(test.Any()))
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (String.IsNullOrWhiteSpace(test))
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (String.IsNullOrEmpty(test))
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        if (test.Count() == 0)
        {
            sw.Stop();
            Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        }
        sw.Restart();
        var s = Convert.ToString(test);
        sw.Stop();
        Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        sw.Restart();
        s = test.ToString(CultureInfo.InvariantCulture);
        sw.Stop();
        Console.WriteLine("String is empty!  " + sw.ElapsedTicks);
        Console.ReadKey();
    }

En fait, String.IsNullOrEmpty(test) est le meilleur, comme l'a souligné quelqu'un dans les commentaires ci-dessus... :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X