这可能是一个重复的问题。但是在搜索中找不到它 在java中将方法参数标记为常量我们将其声明为最终的等价C#关键字? 喜欢
public void doSomeThing(final object myObject)
{
//print myobject
}
答案 0 :(得分:7)
这在C#中是不可能的 - 没有办法将传入的参数标记为常量。
如果您有许多函数可以使用const
,为什么不使用正确的范围(类范围或全局,如果需要)声明它?
答案 1 :(得分:3)
C#中有readonly
个关键字,但到目前为止,我们只能将其应用于字段,而不是本地或参数。
通常在Java中,final
关键字习惯性地用作样式,以便更容易关闭匿名内部类中的值。但是这个问题在C#中不存在,因为匿名方法/ lambdas可以关闭可修改的变量。
Resharper等工具也可以显示不同颜色的变异变量/参数,因此您可以一目了然地看到方法中的“复杂性”。我用它来制作突变的名字,用粗体绿色文字或类似的东西点亮!
这并不是说C#本身不会被更广泛适用的readonly
等更多功能所改进,以帮助声明不变性。但是如果你有简短的方法和Resharper为你突出显示的东西,那么你并不需要手动将事物声明为final / readonly / const(取决于语言)。 IDE会为您跟踪它。
这更有意义:正如Java程序员发现的那样,大多数“变量”根本不是变量。但是如果你必须通过向所有内容添加final
来声明这一点,那么代码中会产生很多额外的关键字噪音。如果默认值为final
并且有一个关键字来生成mutable
,则更有意义。这是它在F#中的工作原理。
答案 2 :(得分:3)
在安装了Code Contracts附加组件的C#4.0 / Visual Studio 2010中,您可以使用ContractInvariantMethod属性中的Contract.Invariant来检查在方法调用期间是否未修改值。
不太一样,但我认为尽可能接近。
答案 3 :(得分:2)
c#
中没有这样的东西答案 4 :(得分:1)
C#有一个readonly关键字,但它不能用于局部变量(仅限类成员)。 这意味着无法将metheod参数标记为常量。
我也很想念它因为我的Java代码几乎每个参数和局部变量都是最终的(我相信这是一个很好的编码模式)。
答案 5 :(得分:1)
正如其他人所说,C#中没有这样的东西。
如果你打算禁止被叫方法更改你的对象(或确定它没有),你唯一的选择是传递你对象的深层克隆。 - 不是很优雅,但唯一可行的方法是确定。