• 引用类型里面的静态字段注意细节


    今天在技术交流群聊天的时候,一个多年开发经验的妹子群友发出了一个问题。因为这段时间,都在看基础知识,所以就很好奇,也就跟大家一起讨论起来。

    代码大概如下:

    如上代码,很简单,输出是10 。估计妹子是晕头了,总是纠结为什么不是5。

    然后热心的群主(不是我),给妹子解释一会。然后告诉妹子,也有输出5的例子。啪啪啪,敲出如下:

    然后群里又开始炸开锅,说为啥引用类型改变值了,输出为啥没变,如是,本屌,就把代码也敲了一遍,一看输出却是10.代码如下:

    要是不细心看,还真以为有鬼呢,原来本屌多打了一个static.

    好啦,现在更加疑惑啦,一向不求甚解的本屌,今天却突然想搞个明白,如是就祭出法宝,调试。

    调试之后,发现没加static的那个例子,为啥输出5,是因为

    public void change2(a a1)
    {
    a1 = new a() { testa = 10 };
    // a1.testa = 10;
    }

    这个方法,重新实例化了a1,也就是给a1重新绑定了一个引用地址。因为a1是在这个方法里面实例化的,因为作用域,在如下控制台输出的时候并没有返回这个新引用,输出的时候,还是之前的老地址,如是解惑了为啥输出5,而不是10 。这里要注意的是 引用类型的重新实例化,改变了新引用地址,但是要注意作用域,这里新手容易出错。

    a a1=new a();
    new Program().change2(a1);
    Console.WriteLine(a1.testa);

    好了,解决了困惑一,下面来讨论下困惑2 ,为啥字段多了个static ,输出的内容就不一样了呢。

    好吧,还是调试,但是调试并没有看出什么门道,脑海中想起了,前几天书中所看到的类中的静态字段的知识。如是,就啪啪啪,打出下面的代码:

    发现,在同一作用域呢,多次实例化类,类中的静态字段的值,不管是哪个实例改变静态字段的值,所有的实例的静态字段的值,都会发生改变。这就是最需要注意的地方。

    加上技术群群号:256718021。这是个C#技术交流群,群主人是个大神,人非常好,大家可以进去,讨论交流,加上瞎扯淡。哈哈。

  • 相关阅读:
    Redis大集群扩容性能优化实践
    INET_ATON(expr)
    无类别域间路由 Classless Inter-Domain Routing CIDR 可变长子网掩码 VLSM Variable Length Subnet Mask
    把[]byte转成string
    不用 H5,闲鱼 Flutter 如何玩转小游戏?
    重度使用Flutter研发模式下的页面性能优化实践
    Flutter 打包与转译 编译 Flutter 即将占领整个 Web 开发
    interface {} is uint, not []uint8
    MySQL查看数据库性能常用命令_Running_Tiger的博客-CSDN博客_mysql 查看数据库 https://blog.csdn.net/qq_41455420/article/details/82802090
    vivo全球商城时光机
  • 原文地址:https://www.cnblogs.com/MrYuanly/p/5007476.html
Copyright © 2020-2023  润新知