【发布时间】:2013-02-08 05:35:20
【问题描述】:
在 Java 中,final 表示一个变量只能分配一次,但该分配可以在程序中的任何位置进行。在 C# 中,readonly 意味着一个字段只能在 constructor 中分配,这在 IMO 中是非常有用的。
众所周知,C# 深受 Java 设计的影响,但这种差异一直让我感到非常奇怪。有谁知道 CLR 中是否有技术原因导致 C# 的 readonly 与 Java 的 final 的行为不太有用?
编辑:
响应 cmets;我想指出,我很清楚不变性的好处,而且我到处都在使用它。我相信readonly 没有Java那么有用,因为:
public class Foo
{
private readonly int _bar;
Foo()
{
_bar = 5;
}
}
糟糕,我实际上需要在辅助方法中初始化该值!
public class Foo
{
private readonly int _bar;
Foo()
{
initialize()
}
private void initialize()
{
_bar = 5; //Can't compile because of semantics of readonly
}
}
【问题讨论】:
-
你的“不那么有用”是我的“更安全”。
-
不变性有什么好处?我想你会发现
readonly对编译器非常有用。你的问题本质上是主观的。 -
您也不能在 java 程序中的任何地方为最终变量赋值。如果您正在制作一个静态最终常量,那么您需要在现场给出值,否则如果您将变量作为最终值,那么您可以在构造函数中启动它。
-
@JohnSaunders 这不是重复的。他不是在问Java 在 C# 中的 final 的等价物。他表明他已经知道这一点。我认为您没有费心阅读这个问题,因为它完全不同。
-
这个问题基于一个错误的前提,您可以在类中的任何位置初始化最终的Java 字段。你不能做这个!第二个示例也不会在 Java 中编译(使用 final)。
标签: c# .net clr language-design readonly