Reputation: 9396
To check whether a string is empty I use
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!");
All the above statements produces the same output. What is the optimal method that I should use?
var s = Convert.ToString(test);
s = test.ToString(CultureInfo.InvariantCulture);
Again, both statements does the same thing. What is the best method to use?
I tried debugging and how to benchmark the performance of a C# statement?
Upvotes: 8
Views: 986
Reputation: 26386
I would go for String.IsNullOrWhiteSpace
or String.IsNullOrEmpty
.
Length
, Count
and Any
could fail if test
is null
with object null reference
]
Unless you are sure your string won't be null, then you will have to check if string is null before testing the length or count or calling any method on the variable.
In these scenario, .Length
is not the same as String.IsNullOrWhiteSpace
string test = " ";
test.Length == 0; //false
String.IsNullOrWhiteSpace(test); //true
Upvotes: 3
Reputation: 1014
For one variable, results are:
String.IsNullOrEmpty(test)
< String.IsNullOrWhiteSpace(test)
<< test.Length==0
<<< !(test.Any())
≡test.Count() == 0
test.ToString(CultureInfo.InvariantCulture)
< Convert.ToString(test)
(Order of 10 times)I used the following code snippet to test the above.
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();
}
Infact String.IsNullOrEmpty(test)
is the best as pointed out by somebody in the comments above... :)
Upvotes: 1
Reputation: 27944
First of all the 4 statemens are not giving the same output on all inputs. Try null and the first 3 will throw an exception. And try whithspaces the last one will give you a failty result. So you really have to think about what you want. The best way to go are normally the:
string.IsNullOrEmpty
string.IsNullOrWhiteSpace
Only if you are doing this a few million times you should have a look on how to optimize your code further.
Here some test result, but this can differ on any .net version:
Test results for 100 million iterations:
Equality operator ==: 796 ms
string.Equals: 811 ms
string.IsNullOrEmpty: 312 ms
Length: 140 ms [fastest]
Instance Equals: 1077 ms
Upvotes: 10
Reputation: 67296
As far as I'm aware:
.Any()
: has the intent of checking whether any objects exist in an array. And since string is an array of char, this works. And is part of Linq
.Length
: has the intent of giving you the length of the array of char.
So, yes the same behavior, but slightly different intents.
BTW, you should really use String.IsNullOrWhitespace
to check strings as empty. At least that is my preference so that if you have a string of many whitespace characters you don't have to trim first.
Upvotes: 1