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

  • 相关阅读:
    平凡的世界
    MySql启动,提示:Plugin 'FEDERATED' is disabled....Cannot allocate memory for the buffer pool
    MySql开启慢查询报错:Could not open /var/log/slow_query.log for logging (error 13).
    ie浏览器,背景色兼容解决方法
    基于Bootstrap、Jquery的自适应导航栏
    chmod、chown、chgrp的意思
    Can't connect to MySQL server on localhost (0)
    mysql-bin引起mysql不能启动
    文件类型检测
    从数据库中查询规则
  • 原文地址:https://www.cnblogs.com/williamwsj/p/9714780.html
Copyright © 2011-2022 走看看