2010-04-16 81 views
11

这可能是一个重复的问题。但找不到它在搜索 在java中标记一个方法参数为常量,我们宣布它作为最终什么是等效的C#关键字? 像传递参数作为最终在C#

public void doSomeThing(final object myObject) 
{ 
//print myobject 
} 
+0

为什么不尝试使用const关键字 – KhanS 2010-04-16 07:19:43

+1

@KahnS - 因为在函数参数中使用它甚至不会编译。 – Oded 2010-04-16 07:22:01

+0

如果询问我在C#中错过了哪些C++特性,它将是const方法和参数。 – Gorpik 2010-04-16 07:30:50

回答

7

这是不可能在C#中 - 有没有办法来标记参数传递为常数。

如果您有一个const需要可用于许多功能,为什么不用正确的范围(类作用域或全局如果需要)来声明它?

+5

@Oded具有方法参数的final的主要内容是将其声明为不可修改的方法内部。它并不是您正在使用一个常量值。该关键字有助于设计框架 – Ravisha 2010-04-16 07:55:22

3

有在C#中没有这样的事情

1

C#有一个只读的关键字,但它不能USET局部变量(类成员只)。 这意味着无法标记metheod参数常量。

我也想念它,因为在我的Java代码中几乎每个参数和局部变量都是final(这是我认为的一种很好的编码模式)。

3

在C#中有一个readonly关键字,但到目前为止,我们只能将它应用于字段,而不是本地或参数。

在Java中,经常使用final关键字作为样式,以便更容易关闭匿名内部类中的值。但是这个问题在C#中不存在,因为匿名方法/ lambda可以通过修改变量关闭。

像Resharper这样的工具可以显示不同颜色的突变变量/参数,因此您可以一眼就看到方法中的“复杂性”。我用它来使突变名称以粗体绿色文本或类似的东西点亮!

这并不是说C#本身不会被更多的功能所改进,如广泛应​​用的readonly来帮助声明不变性。但是,如果你有简短的方法和Resharper来为你强调事情,那么你并不需要手动将事情声明为final/readonly/const(取决于语言)。 IDE会为您跟踪它。

这样做更有意义:正如Java编程人员发现的,大多数“变量”根本不是变量。但是,如果您必须通过将final添加到所有内容来声明此内容,那么代码中会出现很多额外的关键字噪音。默认值为final并且有一个关键字用于制作东西mutable会更有意义。这是它在F#中的工作原理。

+1

关键字noise.Pleasssssse 。 正如我之前对oded的评论中所提到的,它在框架设计中有所帮助。它在你的抽象类中定义了它应该如何表现的规则,如果它有一点额外的好设计工作的好处,那么也是如此。 – Ravisha 2010-04-16 07:57:49

+1

@Ravisha - 我不是说“不要这样做”。 Java中必须允许匿名类关闭。我说*如果你今天正在设计一种语言,也许你会选择默认的是相反的,并且有一个'mutable'关键字。将常见情况设为默认情况只是常识,并且在极少情况下使用关键字来覆盖它。 – 2010-04-16 07:59:27

+0

似乎v都在同一行。我同意有一个关键字类似于mutable – Ravisha 2010-04-16 08:15:15

3

在安装了Code Contracts附加组件的C#4.0/Visual Studio 2010中,可以使用ContractInvariantMethod属性中的Contract.Invariant检查方法调用期间是否未修改某个值。

不完全相同的事情,但大概就像你会得到我认为。

1

正如其他人所说,C#中没有这样的事情。

如果你的目的是要禁止调用的方法可以改变对象(或肯定知道事实并非如此),你唯一的选择就是通过你的对象的深克隆。 - 不是很优雅,但唯一可行的方法是确保。