例如我们这里有一个类

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或反射改变内存的情况。但是在本文所说的环境下不必考虑。

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

C# 中的readonly属性的更多相关文章

  1. ASP.NET2.0中对TextBox的Enable和ReadOnly属性的限制

    在以前的ASP.NET 1.x版本中,设置为ReadOnly的TextBox控件在客户端更改了值后,在服务器端仍然可以得到修改后的值,但在ASP.NET 2.0中,这种做法已经限制.这是为了提高应用程 ...

  2. Extjs4 关于设置form中所有子控件为readOnly属性的解决方案

    之前在网上找了一堆,但那些确实没法用,后来考虑了一下,发现主要是网上提供的假设form中只有一层控件,没有考虑到布局稍微复杂的form情形,此处采用递归的形式实现对form中所有控件(grid及but ...

  3. readonly属性在各浏览器中的区别

    有个项目需求是正常显示时为只读,不可修改: 点击修改按钮后,可修改表单元素. 首先想到的是readonly属性,其用于规定输入字段为只读,不能修改.在javascript中消除readonly值,可将 ...

  4. IOS中@property的属性weak、nonatomic、strong、readonly等介绍

    iOS开发中@property的属性weak nonatomic strong readonly等介绍 //property:属性://synthesize:综合; @property与@synthe ...

  5. [BS-04] 在iOS中对系统定义的类的readonly属性可通过KVC进行赋值

    系统提供的类的readonly属性可通过KVC进行赋值 UITabBarController.h @interface UITabBarController : UIViewController &l ...

  6. vue中如何动态添加readonly属性

    动态绑定input的readonly属性 1 <inpu :readonly="status ? false : 'readonly'"> status 为 false ...

  7. jquery取<input>的readOnly属性,O要大写

    今天在jquery中取input的readonly属性时,发现 我这样写$(“#input”).readonly取这个属性时,总是undefined,后来一想,难道html中的属性only没有大写,是 ...

  8. 使用js设置input标签只读 readonly 属性

    先上代码: <html> <head> <title> test </title> <meta charset="utf-8" ...

  9. HTML5 中的新属性autocomplete="off"失效的解决方法(兼容firefox,IE,360)

    因为业务需求,在写一个注册页面的时候,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便.加了HTML5 中的新属性autocomplete="off" ,但是并没有产 ...

随机推荐

  1. 【转】Python 面向对象(初级篇)

    [转]Python 面向对象(初级篇) 51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

  2. xpath 中 [<Element a at 3985984dj343>]

    在写爬虫用xpath抓取数据的时候出现了这个问题,列表中都是很多个 < element > 首先这不是报错,也不是你的xpath语法有错. 将这个数据列表循环,循环出的item就是你想要的 ...

  3. Apollo 代码的编译演示

    Apollo 代码的编译演示 官方的文档 -- 运行线下演示 如果你没有车辆及车载硬件, Apollo还提供了一个计算机模拟环境,可用于演示和代码调试. 线下演示需要设置docker的release环 ...

  4. 【笔记】[WIN7x64] ThinkPad E420开机不能按设置关闭触控板的问题

    将win7x32重装为Win7x64后,TouchPad(以下简称TP)就不能在开机时按照在控制面板-鼠标中的设置关闭TP, 从而每次开机都必须去点开控制面板->鼠标 才能关闭TP.因为通常不用 ...

  5. 最新版Kali Linux虚拟机安装Open-vm-tools替代VMware tools

    自从Kali 2.0发布之后,会经常遇到安装vmware tools无法成功,或者提示安装成功了但是仍旧无法进行文件拖拽.复制和剪切的问题. 今天给新电脑装系统,重新下载了最新版,Kali 2017. ...

  6. js获取当前星期几

    使用Date对象的getDay方法可以获取当前日期的星期数. getDay() 方法可返回表示星期的某一天的数字. 示例: var date = new Date(); alert(date.getD ...

  7. LNMP环境部署

    说明: 操作系统:CentOS 5.6 32位 准备篇: 一.配置好IP.DNS .网关,确保使用远程连接工具能够连接服务器 二.配置防火墙,开启80端口.3306端口 vi /etc/sysconf ...

  8. url加密和解密

    .NET中加密和解密有两种方式 string file="文件上(传)篇.doc";string Server_UrlEncode=Server.UrlEncode(file);s ...

  9. oracle数据库定时任务dbms_job的用法详解

    本文来源:Ruthless <oracle数据库定时任务dbms_job的用法详解> 一.dbms_job涉及到的知识点   1.创建job: variable jobno number; ...

  10. js小方法积累,将一个数组按照n个一份,分成若干数组

    // 把一个数组按照一定长度分割成若干数组 function group(array, subGroupLength) { let index = 0; let newArray = []; whil ...