在C#中将参数声明为final

15

这可能是一个重复的问题,但在搜索中找不到。 在Java中,我们将方法参数标记为常量,声明为final。在C#中有相应的关键字吗? 比如

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

为什么不尝试使用const关键字? - KhanS
1
@KahnS - 因为在函数参数中使用它甚至都无法编译。 - Oded
1
如果有人问我在C#中最想念的C++特性是什么,那就是const方法和参数。 - Gorpik
6个回答

8

在C#中不可能实现这一点——没有办法将传递的参数标记为常量。

如果你有一个需要在多个函数中使用的const,为什么不使用正确的作用域(如果需要,可以使用类作用域或全局作用域)声明它呢?


5
使用带有final参数的方法,其主要目的是在方法内部将其声明为不可修改。这不是因为你在其中使用了一个常量值。此关键字有助于设计框架。 - Ravisha
我不明白为什么这个答案有那么多赞。方法参数中的最终修饰符表示“该方法不会更改传入的此参数”。这与类或全局作用域无关。 - Mikko Koppanen

4

C# 中有一个 readonly 关键字,但到目前为止,我们只能将其应用于字段,而不能应用于局部变量或参数。

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

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

这并不是说 C# 本身不会通过许多其他功能(例如广泛适用的 readonly)来改进已声明的不可变性。但如果您有短小的方法和 Resharper 为您突出显示内容,则不完全需要手动声明事物为 final/readonly/const(根据语言)。IDE 会为您跟踪它。

这更有意义:正如 Java 程序员所发现的那样,大多数“变量”实际上根本不是变量。但如果您必须通过添加 final 来声明所有内容,那么您的代码中会有很多额外的关键字噪音。默认值为 final 并具有使事物 mutable 的关键字,这在 F# 中就是这样工作的。


3
如我之前对oded的评论中所提到的,这对于框架设计非常有帮助。这是您在抽象类中定义规则的方式,以确定其应如何运作。如果需要一些额外的工作来获得更好的设计效果,那也无妨。关键词:关键词噪声。 - Ravisha
1
@Ravisha - 我并不是说“不要这样做”。在Java中,允许从匿名类中进行闭包是必要的。我只是在说如果你今天设计一种语言,也许你会选择默认值相反,并使用mutable关键字。将常见情况设置为默认值,使用关键字来覆盖较少的情况,这只是常识而已。 - Daniel Earwicker
似乎我们两个是在同一条线上。我同意有一个类似于mutable的关键字。 - Ravisha

3
在安装了Code Contracts插件的C# 4.0 / Visual Studio 2010中,您可以使用ContractInvariantMethod属性中的Contract.Invariant来检查在方法调用期间是否未修改值。虽然不完全相同,但我认为这已经足够接近了。

2
在C#中不存在这样的东西。

1

C#有一个readonly关键字,但它不能用于局部变量(仅限类成员)。 这意味着没有办法标记方法参数为常量。

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


1

正如其他人所说,在C#中没有这样的东西。

如果您的意图是禁止被调用的方法更改您的对象(或确保它不会),您唯一的选择是传递您对象的深层克隆。- 不太优雅,但是确保的唯一方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接