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

  • 相关阅读:
    登陆澳洲一周年记
    开源项目:SQL Monitor 3.0.8
    数据处理利器SSIS入门与进阶
    自动输出SQL Server对象依赖列表到EXCEL文件
    .NET开源数据库的前世和今生(上)
    分布式文件快速搜索技术细节分析(开源/并行)
    ROS与ROS2通讯机制的区别
    快速理解ROS2通信
    Linux解决The following packages have unmet dependencies
    ROS 移植到各种平台教程
  • 原文地址:https://www.cnblogs.com/williamwsj/p/9714780.html
Copyright © 2011-2022 走看看