• 关于C#中readonly


    关于C#中readonly的一点小研究

    关于C#中readonly的一点小研究

     

     

     

    可能园子里有不少文章已经说明了这个问题了,但是我在这里写这篇博客只是写写自己的一些体会,也权当是整理归纳,高手莫见笑。

    ===============正文分割线==================

    现在正在学《编译原理》课,老师让我们根据给出的语言定义自己开发一个编译器,本人对C#还是比较熟悉的所以优先选择C#作为开发工具。本人用的是VS2012配Resharper,这是一个很好用的代码分析及重构的工具,简化了不少工作,但也有些问题一直都搞不懂。例如,在这个类中,Resharper一直提示“将字段设为readonly”。

    从字面上看,readonly即“只读”的,这就造成了误解,让我误以为readonly的变量是不可编辑的,因此一直没敢用这条建议。

    但是既然这么提示了,总应该是有道理的。因此我就查了很多资料,包括在园子里提问,在加上自己的一点研究,终于算是搞懂了意思。

    例如我们这里有一个类

    复制代码
        class TestClass2
        {
            private int someValue;
    
            public void ChangeValue(int newValue)
            {
                someValue = newValue;
            }
    
            public int ShowValue()
            {
                return someValue;
            }
        }
    复制代码

    而在另一个类中使用它

    复制代码
        class TestClass
        {
            private readonly TestClass2 tc; // 注意此处tc是readonly的
    
            public TestClass()
            {
                tc = new TestClass2();
            }
    
            public void ChangeTCValue(int value)
            {
                tc.ChangeValue(value);
            }
    
            public void Show()
            {
                Console.WriteLine("{0}", tc.ShowValue());
            }
        }
    复制代码

    我们看到虽然tc这个字段是readonly的,但是可以使用方法来改变tc中someValue的值。似乎这个“只读”失去了意义,因为可以修改它的值的话还叫什么“只读”呢?

    非也!

    从上面的代码中我们可以看到,tc的类型是TestClass2,是一个引用类型。而引用类型是必须用new关键字为它分配了一块内存以后它才能在后续代码中工作的。也就是说,tc这个变量仅仅是一块内存地址罢了。图示如下:

    也就是说,这里的“readonly” tc只是无法再重新更改它的引用,但它所引用对象的属性是可以改变的。

    那么为什么不用const呢?还是因为tc是引用,是动态分配内存的,不可能在编译阶段就确定它的地址,这点和值类型(包括string)是完全不一样的。

    综上所述,可以得出结论:readonly修饰的字段,其初始化仅是固定了其引用(地址不能修改),但它引用的对象的属性是可以更改的。

    当然,这里的“地址不能修改”指的是在代码中不能再对readonly变量进行再赋值,实际运行情况中可能会遇到GC或反射改变内存的情况。但是在本文所说的环境下不必考虑。(2013-9-27 14:30修改)

    所以,大胆放心的用readonly吧,这样还可以防止不必要的再赋值,保证了这个对象的安全性。

    PS:这样的两个类之间的关系事实上就是UML中的组合关系

     
     
    分类: .NET随笔
    标签: C#readonly语法

  • 相关阅读:
    SQL查询,点击三维图层,查询属性信息
    title标签的使用
    idea快捷键大全
    intellij idea创建第一个动态web项目
    IDEA设置为黑色背景(今天开始使用idea,并记录点滴,记录坑)
    Eclipse导出Jar包(包含外部包)
    获取当前系统时间
    JS实现的ajax和同源策略
    缓存
    Restful Framework (四)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3343001.html
Copyright © 2020-2023  润新知