为什么C#不允许只读局部variables?

与同事就此事进行友好的讨论。 我们对此有一些想法,但是想知道SO群体对此有何看法?

一个原因是没有CLR支持只读本地。 只读被翻译成CLR / CLI initonly操作码。 这个标志只能应用于字段,对本地没有意义。 事实上,将它应用到本地可能会产生无法validation的代码。

这并不意味着C#不能做到这一点。 但是它会给同一种语言结构赋予两种不同的含义。 本地版本将没有CLR等效映射。

解决Jared的答案,它可能只是一个编译时的function – 编译器将禁止你在初始声明(这将包括一个任务)后写入variables。

我能看到这个价值吗? 可能 – 但不是很多,说实话。 如果你不能很容易的判断variables是否会被分配到其他地方,那么你的方法太长了。

对于它的价值,Java有这个特性(使用final修饰符),除了必须用来允许variables被匿名内部类捕获的情况之外,我很less看到它被使用, 使用,它给我一个杂乱的印象,而不是有用的信息。

我认为对C#架构师来说这是一个糟糕的判断。 对局部variables的只读修饰符有助于保持程序的正确性(就像断言一样),并且可以帮助编译器优化代码(至less在其他语言的情况下)。 C#中不允许的事实是另一个论点,即C#的一些“特性”仅仅是它的创build者的个人编码风格的强制。

我是那个同事,这不友善! (开玩笑)

我不会消除这个function,因为最好写一些简短的方法。 这有点像说你不应该使用线程,因为他们很难。 把刀给我,让我负责不砍自己。

就个人而言,我想要另一个“var”types的关键字,如“inv”(invarient)或“rvar”,以避免混乱。 我最近一直在研究F#,发现这个不可改变的东西很吸引人。

从来不知道Java有这个。

我喜欢本地只读variables,就像我喜欢本地constvariables一样。 但是它的优先级低于其他主题。
也许它的优先级与C#devise者不相同(也!)实现此function的原因。 但是在未来的版本中应该很容易(和向后兼容)支持本地只读variables。

只读表示实例variables可以设置的唯一位置在构造函数中。 当在本地声明一个variables时,它没有一个实例(它只是在作用域中),而构造函数不能触及它。

这是c#语言devise者的一个疏忽。 F#有val关键字,它基于CLR。 没有理由C#不能有相同的语言function。

我知道,这不能回答你的问题的原因。 无论如何,阅读这个问题的人可能会喜欢下面的代码。

如果你真的担心在覆盖只能设置一次的局部variables的时候在脚下拍摄自己,而不想让它成为一个更全局可访问的variables,那么可以这样做。

  public class ReadOnly<T> { public T Value { get; private set; } public ReadOnly(T pValue) { Value = pValue; } public static bool operator ==(ReadOnly<T> pReadOnlyT, T pT) { if (object.ReferenceEquals(pReadOnlyT, null)) { return object.ReferenceEquals(pT, null); } return (pReadOnlyT.Value.Equals(pT)); } public static bool operator !=(ReadOnly<T> pReadOnlyT, T pT) { return !(pReadOnlyT == pT); } } 

用法示例:

  var rInt = new ReadOnly<int>(5); if (rInt == 5) { //Int is 5 indeed } var copyValueOfInt = rInt.Value; //rInt.Value = 6; //Doesn't compile, setter is private 

也许不像rvar rInt = 5那么less的代码,但它的工作原理。

你可以在C#中声明只读本地variables,如果你使用C#交互编译器csi

 >"C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe" Microsoft (R) Visual C# Interactive Compiler version 1.3.1.60616 Copyright (C) Microsoft Corporation. All rights reserved. Type "#help" for more information. > readonly var message = "hello"; > message = "goodbye"; (1,1): error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer) 

您还可以以.csx脚本格式声明只读局部variables。

使用const关键字来使只读variables。

参考: https : //docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

 public class SealedTest { static void Main() { const int c = 707; Console.WriteLine("My local constant = {0}", c); } } 

我想这是因为一个只读variables的函数可能永远不会被调用,并且可能有一些关于它超出范围的东西,什么时候需要?