首页 / 知识
关于C:const和readonly有什么区别? public, private, protected
2023-04-14 22:41:00

What is the difference between const and readonly?除了
有细微的差别。考虑在
因此,如果您确信常量的值不会改变,请使用
但是如果你有一个常数,它可能会改变(例如w.r.t.精度)。或者在有疑问时,使用
更新:阿库需要得到一个提及,因为他首先指出了这一点。我还需要把我学到的东西插上。有效C-比尔·瓦格纳 有个警察来了!如果引用另一个程序集中的常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,调用程序集中的常量就不会改变! 常量
只读实例字段
静态只读字段
只需添加,引用类型的只读只会使引用只读,而不是值。例如:
这就解释了。摘要:const必须在声明时初始化,readonly可以在构造函数上初始化(因此,根据所使用的构造函数,有不同的值)。 编辑:关于细微差别,请参见上面的Gishu's Gotcha。 有一个小的只读的gotcha。可在构造函数内多次设置只读字段。即使在两个不同的链接构造函数中设置了该值,仍然允许这样做。
常量成员在编译时定义,不能在运行时更改。常量使用
康斯特
只读
常量是编译时常量,而readonly允许在运行时计算值并在构造函数或字段初始值设定项中设置值。因此,"const"始终是常量,但"read only"一旦被分配就是只读的。 C团队的Eric Lippert有更多关于不同类型不变性的信息 下面是另一个链接,演示const是如何不安全的版本,或者与引用类型相关。 总结:
只读:值可以在运行时通过ctor更改。但不是通过成员函数 常数:以防静电。值不能从任何位置更改(ctor、函数、运行时等,不可从何处更改) 另一个问题是:只读值可以通过反射被"不正确"的代码更改。
我可以使用反射更改C中的私有只读继承字段吗? 我相信所有对象的 它们都是常量,但在编译时也可以使用常量。这意味着区别的一个方面是可以使用常量变量作为属性构造函数的输入,但不能使用只读变量。 例子:
我们办公室的一名团队成员就何时使用const、static和readonly提供了以下指导:
最后一个注意事项:常量字段是静态的,但反转不是真的。 标记为const的变量只不过是强类型定义宏,在编译时const变量引用将替换为内联文本值。因此,只能以这种方式使用某些内置基元值类型。标记为read only的变量可以在运行时在构造函数中设置,并且在运行时也强制执行它们的只读性。与此相关联的性能开销很小,但这意味着您可以对任何类型(甚至引用类型)使用readonly。 此外,const变量本质上是静态的,而readonly变量可以根据需要特定于实例。 在C.NET中,const和readonly字段之间存在显著差异。 常量在默认情况下是静态的,需要用常量值初始化,以后不能修改。构造函数中也不允许更改值。它不能与所有数据类型一起使用。对于ex-datetime。它不能与datetime数据类型一起使用。
只读可以声明为静态,但不是必需的。声明时不需要初始化。它的值可以使用构造函数进行分配或更改。因此,它在用作实例类成员时具有优势。两个不同的实例化可能具有不同的只读字段值。对于前
然后,只读字段可以用即时特定的值初始化,如下所示:
这里,实例objone的readonly字段值为5,objtwo的readonly字段值为10。使用const是不可能的。 另一种方法。 由于const实际上只处理基本数据类型,如果您想处理类,可能会感到"被迫"使用readonly。但是,小心陷阱!readonly表示不能用另一个对象替换该对象(不能使它引用另一个对象)。但是任何引用对象的进程都可以自由地修改对象内部的值! 所以不要困惑地认为readonly意味着用户不能改变事情。在C中没有简单的语法来防止类的实例化改变其内部值(据我所知)。 常量将作为文本值编译到使用者中,而静态字符串将作为对所定义值的引用。 作为练习,尝试创建一个外部库并在控制台应用程序中使用它,然后更改库中的值并重新编译它(不重新编译使用者程序),将dll放到目录中并手动运行exe,您会发现常量字符串没有更改。 常数 我们需要在定义const字段时为其提供值。然后,编译器将常量的值保存在程序集的元数据中。这意味着一个常量只能为诸如boolean、char、byte等基元类型定义。常量始终被视为静态成员,而不是实例成员。 只读 只读字段只能在运行时解析。这意味着我们可以使用字段声明类型的构造函数为值定义一个值。编译器会验证只读字段不是由构造函数以外的任何方法写入的。 有关这两个方面的详细信息,请参阅本文 康斯特 只读 区别在于静态只读字段的值是在运行时设置的,因此对于程序的不同执行,它可以有不同的值。但是,const字段的值设置为编译时常量。 记得:对于引用类型,在这两种情况下(静态和实例),只读修饰符只会阻止您为字段分配新的引用。它不会使引用指向的对象不可变。 有关详细信息,请参阅本主题的C常见问题:http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx const和readonly是相似的,但它们并不完全相同。常量字段是编译时常量,这意味着该值可以在编译时计算。只读字段允许在构造类型期间运行某些代码的其他方案。构造后,无法更改只读字段。 例如,const成员可用于定义如下成员:
因为像3.14和0这样的值是编译时常量。但是,考虑一下您定义类型并希望提供它的一些fab前实例的情况。例如,您可能希望定义一个颜色类,并为常见颜色(如黑色、白色等)提供"常量"。使用const成员是不可能的,因为右手边不是编译时常量。我们可以对常规静态成员执行此操作:
但是没有什么可以阻止一个有颜色的客户去弄脏它,也许是通过交换黑白值。不用说,这会给颜色类的其他客户机带来恐慌。"只读"功能解决了这种情况。通过在声明中简单地引入readonly关键字,我们保留了灵活的初始化,同时防止客户机代码乱放。
有趣的是,const成员总是静态的,而readonly成员可以是静态的,也可以不是静态的,就像正则字段一样。 可以将单个关键字用于这两个目的,但这会导致版本控制问题或性能问题。假设我们对此(const)使用了一个关键字,开发人员写道:
另一个开发人员编写的代码依赖于:
现在,生成的代码是否依赖于a.c是编译时常量这一事实?也就是说,交流电的使用可以简单地用0代替吗?如果您对此说"是",那么这意味着a的开发人员无法更改a.c的初始化方式——这将在未经许可的情况下将a的开发人员的双手绑在一起。如果你对这个问题说"不",那么就会错过一个重要的优化。也许A的作者肯定A.C永远是零。使用const和readonly允许的开发人员指定意图。这有助于更好的版本控制行为和更好的性能。 只读:该值将仅从类的构造函数初始化一次。const:只能在任何函数中初始化一次 主要地,您可以在运行时将一个值赋给静态只读字段非常量值,而常量值则必须赋给常量值。 常量变量在编译时声明和初始化。病房后不能更改该值。只读变量将仅从类的静态构造函数初始化。只读仅在希望在运行时分配值时使用。 还有一件事要补充人们上面所说的。如果程序集包含只读值(例如readonly maxfoocount=4;),则可以通过使用不同的值(例如readonly maxfoocount=5;)发送该程序集的新版本来更改调用程序集所看到的值。 但使用const,在编译调用者时,它将被折叠到调用者的代码中。 如果你已经达到了这一水平,你就已经准备好接受比尔·瓦格纳的书,有效的C:50种提高你的C的具体方法。#它详细地回答了这个问题(以及其他49件事)。 简而言之,const是编译时,readonly是运行时。 关键区别在于const是定义的c等价物。这个数字被替换为A-LA预编译程序。readonly实际上被视为一个变量。 当项目A依赖于项目B中的公共常数时,这种区别尤其相关。假设公共常数发生了变化。现在,您选择const/readonly将影响项目A的行为: const:项目A不捕获新值(当然,除非用新const重新编译),因为它是用子脚本中的常量编译的。 只读:项目A总是要求项目B提供它的变量值,因此它将在B中获取公共常量的新值。 老实说,我建议您对几乎所有的东西都使用readonly,除了真正的通用常量(例如pi,inches_to_cm)。对于任何可能改变的东西,我说用readonly。 希望这有帮助,艾伦。 |
最新内容
相关内容
创建自定义命令linux?
创建自定义命令linux?,工具,状态,命令,系统,代码,标准,数据,位置,电脑,材料,LINUX中,创建文件夹、文件命令及清除命令。1、创建文件夹mkdir命linux自定义命令行?
linux自定义命令行?,系统,工作,名称,百度,命令,管理,工具,位置,信息,终端,Linux基本命令行操作(一)1、linux系统常用操作命令linux系统常用操linux配置自定义命令?
linux配置自定义命令?,服务,系统,状态,策略,周期,地方,标准,新增,环境,工具,Linux:Python编写Linux自定义命令工具state是命令执行结果的状态,r自定义命令linux命令?
自定义命令linux命令?,工具,系统,数据,命令,新增,代理,通信,地方,信息,时间,大学生程序员必备的十款工具程序员10款生产力工具快来看看 Idea-Ilinux命令行定义参数?
linux命令行定义参数?,系统,信息,名称,实时,命令,百分比,工作,周期,选项,参数,在linux系统中每一个命令都只有一种参数可以设定对吗?Linux命令linux自定义简写命令?
linux自定义简写命令?,系统,工作,命令,标准,地址,基础,信息,软件,目录,文件,基本linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出linux命令简写自定义?
linux命令简写自定义?,系统,状态,命令,代码,工具,发行,标准,软件,文件,别名,Linux:Python编写Linux自定义命令工具1、首先我们先认识一下cat指linux用户自定义命令?
linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,材料,如何创建linux命令”快捷方式”或”自定义1、使用命令ln创建linux初始化硬盘命令?
linux初始化硬盘命令?,系统,工作,设备,工具,信息,基础,地址,电脑,命令,数据,linux基础命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出linux自定义快捷命令?
linux自定义快捷命令?,系统,首次,位置,时间,文件,命令,链接,快捷键,终端,桌面,在linux里如何建立一个快捷方式,连接到另一个目录ln -s bbb的文linux自定义全局命令?
linux自定义全局命令?,环境,系统,命令,别名,新增,信息,地方,文件,定义,用户,如何创建linux命令”快捷方式”或”自定义使用命令ln创建或者右击pythonCookie和Session有什么区别?
pythonCookie和Session有什么区别?,信息,地址,时间,新浪,网站,数据,百度,风险,培训,服务,一、存取方式不同cookie中只能存储ASCII字符串。如果