zoukankan      html  css  js  c++  java
  • C#中String类型的不变性

      今天同事问了我一个问题,如下:

    static void Main(string[] args)
            {
                People people1 = new People();
                people1.Name = "BeforePeopleChange";
                string str = "BeforeStringChange";
    
                ChangeString(str);
                ChangePeople(people1);
    
                Console.WriteLine(people1.Name);
                Console.WriteLine(str);
                
                Console.ReadKey();
            }
    
            public sealed class People
            {
                public string Name { get; set; }
            }
    
            public static void ChangeString(string str)
            {
                str = "AfterStringChange";
            }
    
            public static void ChangePeople(People model)
            {
                model.Name = "AfterPeopleChange";
            }        

    运行结果如下:

    问题是String和People都是引用类型,为什么在另一个方法中修改他们的值,String不变而People变呢。

    实际上String类型是C#中的基元类型,他是一种特殊的引用类型,是不可变的,英文叫做immutable。所以在ChangeString方法中改变str的值会在托管堆中重新创建一块内存,将修改后的值存在新创建的那块内存中。而People仅仅是普通的引用类型,ChangePeople方法会直接修改people1所引用的那块内存,所以会出现这个问题。

    移步我最优惠网,尽享全网折扣商品。

    PS:我最优惠网是一个汇集京东、天猫、Amazon等知名电商优惠活动和商品的网站,更精明的剁手,从我最优惠开始

  • 相关阅读:
    problems_mysql
    skills_mysql
    knowledge_mysql
    knowledge_impala
    oozie的常见错误
    problems_kafka
    problems_flume
    kafka在zookeeper默认使用/为根目录,将/更换为/kafka
    java学习笔记总略
    大公司怎么开发和部署前端代码——作者:张云龙[知乎兴趣转载]
  • 原文地址:https://www.cnblogs.com/zhangkai2237/p/2771542.html
Copyright © 2011-2022 走看看