.net 7.0的新特性中,有一个使用表达式体返回值的操作。请看如下代码:

private string _userName="";
public string UserName{
    get=>_userName;
    set=>_userName=value;
}

public TEntity entity=>new TEntity();

这样看起来是不是和使用等号(=)获取值一样的方便。

但是,请不要认为使用表达式体(=>)获取值和用等号(=)获取值是一样的概念,那你会被坑惨!

针对引用类型来说,因为使用表达式体(=>)获取的值都不是同一个对象,而使用等号(=)获取的值都是同一个对象。每次使用表达式体(=>)获取的值都是一个全新的,而使用等号(=)获取的都是同一个。

被坑了才知道去了解!

测试实例如下:

        public class MyClass
        {
            public object ExpressionObject => new object();
            public object NormalObject = new object();
        }


        static void Main(string[] args)
        {
            MyClass tmp =new MyClass();
            //对比同一个实例的表达式返回对象是否相同,结果是 引用对象不相同
            object eobj1 = tmp.ExpressionObject;
            object eobj2 = tmp.ExpressionObject;
            Console.WriteLine($"=>表达式的结果: {eobj1 == eobj2}");

            //对比同一个实例的直接赋值对象是否相同,结果是 引用相同的对象
            object nobj1 = tmp.NormalObject;
            object nobj2 = tmp.NormalObject;
            Console.WriteLine($"=等号赋值的结果:{nobj1 == nobj2}");

            Console.ReadKey();
        }

测试结果:

 

特别要记得这点,如果是在并发同步编程中,一定要记得这点区别。因为锁对象不一致的情况下,程序是要报SynchronizationLockException这个异常的,内容是"Object synchronization method was called from an unsynchronized block of code." 

 

 posted on 2018-09-27 18:17  F风  阅读(282)  评论(0编辑  收藏  举报