Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#类和只读成员_C# - Fatal编程技术网

C#类和只读成员

C#类和只读成员,c#,C#,在C#中编写类时,如果所有私有成员变量仅在构造函数中分配给,并且不受类中其他地方更改的影响,那么将它们标记为私有只读是一个好主意吗?还是这太过分了?是的,我个人认为这是个好主意。我尽可能保持类型不变,声明一个变量readonly是一个很好的开始。当然,这不是“全部”和“全部”,如果该变量是可变的(例如StringBuilder或数组),那么它真的没有多大帮助。尽管如此,我还是将变量设置为只读,以表明我不想更改变量本身的值,并防止自己在同一类中的其他地方意外地这样做,可能是几个月或几年后。是的,这

在C#中编写类时,如果所有私有成员变量仅在构造函数中分配给,并且不受类中其他地方更改的影响,那么将它们标记为私有只读是一个好主意吗?还是这太过分了?

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

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

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

哇,这是一个多么好的问题,而且完全可以用意见来回答。我的观点是我总是为变量创建属性。下面是一个例子

private int _myInt;
private int myInt {get{return _myInt;}}

如果我只初始化一个变量一次,而不写入它,我会使它常量


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

公共类MyViewModel
{
私有只读MyContext上下文;
公共MyViewModel(MyContext上下文)
{
this.context=上下文;
}
}


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

这仍然允许变量在类中进行变异-这并不表示开发人员不打算在其他方法中对其进行变异。如果该值不是编译时常量,则不能将其设为常量,如果它是一个实例字段,那么,我认为const更有效,因为它是编译时间。如果成员不能为const,则需要另一个路由,如readonly。否则,我会将其设置为常量。即使它是正确的类型,将其设置为常量仍然可能是一个坏主意。例如,假设您有一个int字段“VersionNumber”。不要将其设置为常量,将其设置为只读。版本号是一个随时间逻辑变化的量,因此不是常数。只对从未改变、也永远不会改变的事物使用常量,如π的值或铅的原子序数。@Eric:这似乎是一条任意规则。只要变量在程序运行时不发生变化,常量似乎是理想的解决方案;这是编译器将常量视为永不更改这一事实的结果。假设将集合Alpha的常量字段C.F设置为10。您编译了从Alpha打印出C.F的汇编Beta。现在,在运行时,用一个不同的Alpha.DLL替换Alpha,其中C.F为20。测试版继续打印10。编译器假设,既然你说的是常数,你的意思是我不会改变这个,因为常数就是这个意思。如果你想要Beta打印20,那么C.F必须是只读的,而不是常量。谢谢你的评论。我将继续并将我的成员标记为只读。干杯。你是Java和C语言的大师。这本质上就是这个Java问题的C#等价物。我想知道为什么这里的讨论似乎比Java的要温和得多。@RAY:不,请记住Java中的
final
不仅仅适用于变量——它是C#中的
readonly
sealed
的组合。。。如果你开始问人们是否应该封闭课堂,你会看到更激烈的辩论……没错。链接问题特别询问局部变量和类变量(参数和字段),尽管。。。