zoukankan      html  css  js  c++  java
  • .net 表达式返回值和等号赋值的区别

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

  • 相关阅读:
    解决ORA01502 state unusable错误成因
    Remoting.Corba
    NHibernate 处理 oracle 的long数据类型
    NET下连接SYBASE数据库
    JavaScript 的变量作用域及闭包
    PowerDesigner的样式设置
    NHibernate学习 (转)
    性能调优:数据库设计规范化的五个要求
    利用 ADO.NET 连接到 Informix(转)
    sqlnet.expire_time
  • 原文地址:https://www.cnblogs.com/williamwsj/p/9714780.html
Copyright © 2011-2022 走看看