.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."