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

  • 相关阅读:
    asterisk 使用 g729 g723
    读书笔记《一线架构师》
    能和LoadRunner匹敌的VS2010/2012Web负载测试
    总结 设计模式,企业应用架构模式,架构模式
    聊聊Memcached的应用
    WPF小试牛刀
    读书笔记《Hadoop开源云计算平台》
    高性能与可扩展
    闲聊下架构、框架,以及架构师...
    自己写框架 实践 (Event Framework)
  • 原文地址:https://www.cnblogs.com/williamwsj/p/9714780.html
Copyright © 2011-2022 走看看