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等知名电商优惠活动和商品的网站,更精明的剁手,从我最优惠开始

  • 相关阅读:
    Vue 路由的编程式导航与history模式
    Vue 路由配置、动态路由
    Vue 组件传值
    Vue 组件以及生命周期函数
    Vue 封装js
    记一次proc_open没有开启心得感悟
    面向内容的标记语言--markdonw
    浅谈索引
    mysql主从配置
    centos7下操作防火墙
  • 原文地址:https://www.cnblogs.com/zhangkai2237/p/2771542.html
Copyright © 2011-2022 走看看