String中的==与Empty

1.String中的==与Equals方法执行结果一样吗?

我们都知道对于引用类型“==”比较的是引用而不是具体的值,但c#中有一种神奇的叫做操作符重载的东西。官方对String类中的==进行了重载,源码如下:

    /// <summary>
    /// 确定两个指定的字符串是否具有相同的值。
    /// </summary>
    /// 
    /// <returns>
    /// 如果 <paramref name="a"/> 的值与 <paramref name="b"/> 的值相同,则为 true;否则为 false。
    /// </returns>
    /// <param name="a">要比较的第一个字符串,或 null。</param><param name="b">要比较的第二个字符串,或 null。</param><filterpriority>3</filterpriority>
    [__DynamicallyInvokable]
    public static bool operator ==(string a, string b)
    {
      return string.Equals(a, b);
    }

是不是不可思议?是的,==操作符内部调用了Equals方法。下面是测试代码

    public static void Main(String[] args)
    {
        string s1 = new string(new char[] { 'a' });
        string s2 = new string(new char[] { 'a' });
        Console.WriteLine("s1==s2?"+(s1==s2)); 
        Console.WriteLine("s1.Equals(s2)?"+s1.Equals(s2)); 


        Console.ReadKey();
    }

查看s1和s2的内存地址发现是两个不同的引用,但是==的执行结果是true

                            

 

2.String.Empty和""有区别吗?

 Empty为String类的只读常量,但是源码中并没有看到如何赋值。在vs中试了一下发现这两个的值是相等的,并没有看出来有啥区别。

 所以说Empty肯定是占用了内存空间的,是引用类型。只能说Empty的写法要好于"",使用后者的话在多行代码中很容易由于其中多了一个空格而产生不可预知的错误。如:" ",查起来会比较麻烦。

 代码如下:

 

    public static void Main(String[] args)
    {
        string s3 = string.Empty;
        string s4 = "";
        Console.WriteLine(s3==s4);
        Console.ReadKey();
    }

 

     

顺便说一下,由于字符串的不可变性。上面s3和s4的引用地址是同一个~

 

posted on 2017-01-16 10:32  xxyxpy  阅读(278)  评论(0)    收藏  举报