8

要检查字符串是否为空,我使用

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. 上述所有语句产生相同的输出。我应该使用什么最佳方法?

    var s = Convert.ToString(test);    
    s = test.ToString(CultureInfo.InvariantCulture);
    
  2. 同样,这两个语句都做同样的事情。最好的使用方法是什么?

我尝试了调试以及如何对 C# 语句的性能进行基准测试?

4

4 回答 4

10

首先,这 4 个语句在所有输入上都没有给出相同的输出。尝试 null ,前 3 个将引发异常。并尝试 whithspaces 最后一个会给你一个失败的结果。所以你真的必须考虑你想要什么。最好的方法通常是:

string.IsNullOrEmpty
string.IsNullOrWhiteSpace

只有当您这样做几百万次时,您才应该了解如何进一步优化您的代码。

这里有一些测试结果,但这在任何 .net 版本上都可能不同:

1亿次迭代的测试结果:

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

来源

于 2012-11-07T09:19:46.057 回答
3

我会选择String.IsNullOrWhiteSpaceString.IsNullOrEmpty

Length,如果是]可能Count会失败Anytestnullobject null reference

更新

除非您确定您的字符串不会为空,否则您必须在测试长度或计数或调用变量上的任何方法之前检查字符串是否为空。

在这些情况下,.Length不一样String.IsNullOrWhiteSpace

string test = "    ";
test.Length == 0;  //false
String.IsNullOrWhiteSpace(test); //true
于 2012-11-07T09:18:57.353 回答
1

据我所知:

.Any(): 旨在检查数组中是否存在任何对象。由于 string 是一个 char 数组,所以这很有效。并且是 Linq 的一部分

.Length: 旨在为您提供 char 数组的长度。

所以,是的,相同的行为,但意图略有不同。

顺便说一句,你真的应该用它String.IsNullOrWhitespace来检查字符串是否为空。至少这是我的偏好,所以如果你有一串很多空白字符,你不必先修剪。

于 2012-11-07T09:12:08.740 回答
1

对于一个变量,结果是:

  1. String.IsNullOrEmpty(test)< String.IsNullOrWhiteSpace(test)<< test.Length==0<<< !(test.Any())≡<code>test.Count() == 0
  2. test.ToString(CultureInfo.InvariantCulture)< Convert.ToString(test)(10次的顺序)

我使用以下代码片段来测试上述内容。

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();
    }

String.IsNullOrEmpty(test)正如上面评论中有人指出的那样,事实上是最好的...... :)

于 2012-11-07T09:32:33.867 回答