与string.Empty(c#)相比的最佳性能

Nik*_*RIP 2 .net c#

两者之间有什么区别吗?

if(string.Empty.Equals(text))
Run Code Online (Sandbox Code Playgroud)

if(text.Equals(string.Empty))
Run Code Online (Sandbox Code Playgroud)

关于性能,意外行为或可读性?

Ode*_*ded 5

这些将具有相同的性能特征.

如果textnull,你的第二行抛出一个NullReferenceException.

我个人发现:

if(text == string.Empty)
Run Code Online (Sandbox Code Playgroud)

比您的选项更具可读性.

还有内置的:

if(string.IsNullOrEmpty(text))
Run Code Online (Sandbox Code Playgroud)

对于.NET 4.0:

if(string.IsNullOrWhitespace(text))
Run Code Online (Sandbox Code Playgroud)


ken*_*n2k 5

我建议使用

if (string.IsNullOrEmpty(text))
{
}
Run Code Online (Sandbox Code Playgroud)

因为我认为它更具可读性,这是IMO中最重要的(实际上结果对于null值不一样,但是你的第二个版本会为这个特定的测试用例抛出异常).

我不知道生成的IL是否有任何差异,但无论如何,这样的微优化(如果有的话)显然不会使你的应用程序更快.


编辑:

我刚刚好奇地测试了它:

private static void Main(string[] args)
{
    Stopwatch z1 = new Stopwatch();
    Stopwatch z2 = new Stopwatch();
    Stopwatch z3 = new Stopwatch();

    int count = 100000000;

    string text = "myTest";

    z1.Start();
    for (int i = 0; i < count; i++)
    {
        int tmp = 0;
        if (string.Empty.Equals(text))
        {
            tmp++;
        }
    }
    z1.Stop();

    z2.Start();
    for (int i = 0; i < count; i++)
    {
        int tmp = 0;
        if (text.Equals(string.Empty))
        {
            tmp++;
        }
    }
    z2.Stop();

    z3.Start();
    for (int i = 0; i < count; i++)
    {
        int tmp = 0;
        if (string.IsNullOrEmpty(text))
        {
            tmp++;
        }
    }
    z3.Stop();

    Console.WriteLine(string.Format("Method 1: {0}", z1.ElapsedMilliseconds));
    Console.WriteLine(string.Format("Method 2: {0}", z2.ElapsedMilliseconds));
    Console.WriteLine(string.Format("Method 3: {0}", z3.ElapsedMilliseconds));

    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

不确定测试是否相关,因为测试微优化总是比它看起来更复杂,但这里有一些结果:

Method 1: 611
Method 2: 615
Method 3: 336
Run Code Online (Sandbox Code Playgroud)

方法1和方法2与预期相同,方法3,更易读的解决方案IMO,看起来是最快的,所以请选择;)


Dar*_*rov 5

关于性能,他们的行为会相同.关于意外行为,第二个可能会抛出NullReferenceExceptionif text = null.if (!string.IsNullOrEmpty(text))虽然实现同样的事情(相同的性能,相同的结果)没有不希望的意外行为和NRE的可能性似乎更自然.