为什么resharper建议在未更改的字段中使用readonly?

时间:2010-03-07 12:38:54

标签: c# resharper

澄清这个问题,我想补充一点,我不是在问为什么我应该只选择readonly over const或者readonly对const有什么好处。

我问为什么只是因为它没有改变(目前)而只读一个字段。

例如: 如果我写下面的课:

public class MyClass
{
      public int _i = 5;

      // Code that doesn't change the value of i:
      ...
}

Resharper将表明它可以只读。

由于

6 个答案:

答案 0 :(得分:29)

当它检测到您没有分配给变量时,除了在启动时,它假定您不希望变量发生变化。使变量readonly(或const)将阻止您将来分配给变量。由于这似乎(通过使用)是您想要的行为,因此它建议您将其正式化并获得保护的好处。

答案 1 :(得分:5)

我经常试着记住 1 来做Resharper试图提醒你做的事情。如果我有任何不可变的字段,我喜欢用readonly标记它们以使其正式化。在许多类型上,我会做所有的领域。有benefits of immutability[2] [3]),Resharper正试图帮助您利用它们。

1 我个人不使用Resharper。我有我的理由。

答案 2 :(得分:4)

嗯,很明显,一个永远不会改变的变量应该是const或只读。其中一个更好的问题取决于具体情况。根据定义,Const变量是常量 - 它们的值应该从不更改(例如const int minutesInAnHour = 60;看起来像一个好的候选者)。这就是为什么常量是一个隐式的静态成员,它在编译期间被初始化,即编译器可能实际上用常量替换了常量的所有外观,尽管我不确定是否有任何编译器实际上这样做。

另一方面,Readonly是一个成员变量,其值不应该改变,一旦初始化,意味着它实际上不是常数,你可以在readonly DateTime time = DateTime.Now;的行中做一些事情。当然,这不是一个静态成员,事实上它只是一个普通的成员,只有在被指定后才能改变的限制。这与const相比的好处是,如果你的const变量在某些构建中发生变化,那么其他的依赖库也可能不知道 - 它们甚至可以包含常量值 - 你必须重建所有内容。

关于为什么resharper建议readonly与const的问题 - 我不确定,我猜一个只读变量的限制性较小,并且它认为这是开发人员可能想要的。

答案 3 :(得分:3)

Resharper是一个工具,除了显示它的代码外,它看不到任何东西。如果您计划将来更改代码,Resharper无法知道 - 因此它会根据您当前的代码提出建议。

答案 4 :(得分:3)

  

Resharper将表明它可以只读。

要添加到其他答案,请注意您可以在ReSharper |中更改此检查的严重性Options | Code Inspection | Inspection Severity | Field can be made readonly。我把它作为'显示为建议';如果你愿意的话,你可以要求ReSharper完全忽略这个检查。

答案 5 :(得分:0)

当我们在一个已编译的dll(我们称其为“源dll”)中使用只读和const时,另一个已编译的dll(我们将其称为客户端的dll)使用了,那么当我们在源dll中更改const时,我们必须进行编译因为const是在编译时设置的,所以不仅是源dll,还包括客户端的dll。反过来,在程序的运行时设置只读,因此,当我们在源dll中更改此值时,我们仅需编译源dll,而无需编译客户端的dll。我认为这是Resharper建议只读的原因之一-因为更改后,它需要的工作量会减少。我认为,第二个原因是Saulius Valatka写的内容,即const应该是真正的“恒定”值,例如一小时内60分钟,而不是看似恒定的值,但最终会改变。因此,实际的“常数”值比我们认为将是“常数”的值要少,但最终它们会改变。