【发布时间】:2011-01-21 07:08:05
【问题描述】:
我正在寻找与 Java 的 final 等效的 C#。它存在吗?
C# 是否有类似以下的内容:
public Foo(final int bar);
在上面的例子中,bar 是一个只读变量,不能被Foo() 更改。有没有办法在 C# 中做到这一点?
例如,也许我有一个长方法可以处理某些对象(整数)的x、y 和z 坐标。我想绝对确定该函数不会以任何方式更改这些值,从而破坏数据。因此,我想将它们声明为只读。
public Foo(int x, int y, int z) {
// do stuff
x++; // oops. This corrupts the data. Can this be caught at compile time?
// do more stuff, assuming x is still the original value.
}
【问题讨论】:
-
stackoverflow.com/questions/2125591/… 的副本(顺便说一句,Eric Lippert 给出了很好的答案)
-
我不认为它完全重复。这个问题是关于按引用传递和按值传递之间的区别。我认为 Rosarch 可能使用了错误的示例代码来表达他试图表达的观点。
-
@Rosarch:我对“最终”一词的理解是,无论对象是什么,您都不能再对对象执行任何操作。我知道应用于类的“最终”将等同于 C# 中的“密封”。但是无论如何,这个关键字“final”的好处或实际用法是什么?有一天,我几乎在任何地方都可以在 JAVA 源代码中看到它。
-
@Will Marcouiller 使用 final 关键字它不是不能改变的对象,因为你可以使用改变对象内部的方法,它是对不能改变的对象的引用。在按值传递的情况下,就像给出的示例一样,它会阻止 x++ 成为有效操作,因为值会发生变化。这样做的好处是您可以进行编译时完整性检查,以确保没有将值设置为不同的值。但是,根据我的经验,我从来不需要这样的功能。
-
+1 @Corey Sunwold:感谢您的精确度。至于现在,我只知道C#和JAVA之间的相似之处,知道C#在概念上“继承”了JAVA。这就是说,它鼓励我更多地了解 JAVA,因为我知道它在全球范围内广泛传播。
标签: c# constants readonly parameter-passing