C# 类和只读成员

Posted

技术标签:

【中文标题】C# 类和只读成员【英文标题】:C# class and readonly members 【发布时间】:2011-06-05 09:04:23 【问题描述】:

在 C# 中编写类时,如果所有私有成员变量仅在构造函数中分配并且不会在类中的其他地方更改,那么将所有私有成员变量标记为私有只读是否是个好主意?或者这是矫枉过正?

【问题讨论】:

感谢所有 cmets。我将继续并将我的成员标记为只读。干杯。 【参考方案1】:

是的,我个人认为这是个好主意。我尽量保持类型不可变,声明一个变量readonly 是一个很好的开始。当然,这不是全部和全部 - 如果该变量是可变的(例如 StringBuilder 或数组),那么它真的没有太大帮助。我仍然会将变量设置为只读,以表明我不想更改变量本身的值 - 并防止自己在同一个班级的其他地方意外地这样做,可能是几个月或几年后。

【讨论】:

您是 Java 和 C# 方面的专家。这本质上是这个 Java 问题的 C# 等价物。 ***.com/questions/137868/…我想知道为什么这里的讨论似乎比 Java 的要温和得多。 @RAY:不,请记住,Java 中的 final 不仅仅适用于变量 - 它是 C# 中 readonlysealed 的组合...如果您开始询问伙计们,是否应该密封课程,你会看到更激烈的争论...... 是的。链接的问题专门询问了本地和类变量(参数和字段),尽管......【参考方案2】:

是的,这就是readonly 的具体指示。如果您已经知道(或至少可以假设)您不会将其分配到其他任何地方,那么将其标记为readonly 是个好主意。毕竟,删除 readonly 比以后添加要容易。

【讨论】:

【参考方案3】:

是的 - 您不会遇到问题,因为它们的值稍后会被其他不知道它们应该是只读的开发人员编写的代码修改。

【讨论】:

【参考方案4】:

哇,这是一个多么好的问题,一个纯粹会用意见来回答的问题。我的观点是我总是只为变量创建属性。一个例子如下。

private int _myInt;
private int myInt getreturn _myInt;

【讨论】:

这仍然允许变量在类中发生变异 - 这并不表明开发人员打算在其他方法中对其进行变异。【参考方案5】:

如果我只初始化一个变量并且从不写它,我会把它设为 const。

http://en.csharp-online.net/const,_static_and_readonly

【讨论】:

如果值不是编译时常量或实例字段,则不能将其设为 const。 对,我认为 const 更有效,因为它编译时。如果成员不能是 const,则需要另一个路由,例如 readonly。否则,我会将其设为 const。 即使它是正确的类型,将其设为 const 仍然可能是个坏主意。例如,假设您有一个 int 字段“VersionNumber”。 not 将其设为 const,将其设为只读。版本号是一个逻辑上随时间变化的量,因此不是常数。仅将 const 用于从未改变且永远不会改变的事物,例如 pi 的值或铅的原子序数。 @Eric:这似乎是一个任意规则。只要在程序运行时变量永远不会改变,const 似乎是理想的解决方案。 无论如何都不是任意规则;这是编译器将常量视为永不改变这一事实的结果。假设您将程序集 Alpha 的常量字段 C.F 设置为 10。您编译程序集 Beta,它从 Alpha 打印出 C.F。现在在运行时,您将 Alpha 替换为 C.F 为 20 的差异 Alpha.DLL。Beta 继续打印 10。编译器假定,既然你说constant,你的意思是我不会改变这个,因为这就是constant 的意思。如果您希望 Beta 打印 20,则 C.F 必须是只读的,而不是常量。【参考方案6】:

Readonly 在您通过构造函数传递服务引用的情况下非常有意义,即

public class MyViewModel private readonly MyContext context; public MyViewModel(MyContext context) this.context = context;

你显然不希望你的上下文被另一个覆盖,因为你可以有很多东西依赖于类中的特定服务。如果它是构造函数参数,这通常意味着您依赖该特定服务或对象来创建和保持对象的有效状态。所以 readonly 是一个很好的指标。在属性上设置私有意味着您不能在类之外更改它,只读是一个额外的约束,它使事情更加安全和易于理解。

【讨论】:

以上是关于C# 类和只读成员的主要内容,如果未能解决你的问题,请参考以下文章

C#图解教程 第六章 深入理解类

在 C++ 中创建只读(公共)类成员

试图将类成员公开为只读或公共常量

如何在 C# 中删除包含只读文件的目录?

C# 私有、静态和只读

在C# winform 程序里设置 DataGrid 为只读属性。