在方法中使用const而不是variables的优点

每当我有方法中的局部variables,ReSharperbuild议将它们转换为常量:

// instead of this: var s = "some string"; var flags = BindingFlags.Public | BindingFlags.Instance; // ReSharper suggest to use this: const string s = "some string"; const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; 

鉴于这些是真正的恒定值(而不是variables),我明白,ReSharperbuild议将它们改为const。

但除此之外,使用const(例如更好的性能),还有什么其他的优势,certificate使用const BindingFlags而不是方便可读的var关键字吗?

顺便说一句:我只是在这里find一个类似的问题: Resharper总是build议我做conststring,而不是string ,但我认为这是关于一个类的领域,我的问题是关于局部variables/常量。

如果你试图给一个常量赋值,编译器会抛出一个错误,从而可能会阻止你不小心改变它。

另外,使用常量和variables通常有一个小的性能好处。 这与MSDN杂志Q&A编译MSIL的方式有关:

现在,无论myInt在代码中被引用到什么地方,MSIL都不需要执行“ldloc.0”来从variables中获取值,而只是加载硬编码到MSIL中的常量值。 因此,使用常量通常具有较小的性能和内存优势。 但是,为了使用它们,必须在编译时具有该variables的值,并且在编译时对这个常量的任何引用(即使它们位于不同的程序集中)都将进行此replace。

如果你知道编译时的值,常量肯定是一个有用的工具。 如果你不这样做,但是要确保你的variables只设置一次,你可以使用C#中的readonly关键字(它映射到MSIL中的initonly)来表示variables的值只能在构造函数中设置。 之后,改变它是一个错误。 当一个字段有助于确定一个类的标识时,经常使用这个字段,并且通常将其设置为一个构造函数参数。

根据我的理解,const值在运行时不存在 – 即以某个存储位置中存储的variables的forms存在 – 它们在编译时embedded到MSIL代码中。 因此会对性能产生影响。 对运行时间的更多操作也不需要对其进行任何pipe理(转换检查/垃圾回收等),因为variables需要这些检查。

const是一个编译时间常量 – 这意味着所有使用constvariables的代码被编译为包含constvariables包含的常量expression式 – 发出的IL将包含该常量值本身。

这意味着您的方法的内存占用更小,因为常量不需要在运行时分配任何内存。

一个对象的所有实例之间的const值也是“共享的”。 这也可能导致内存使用率降低。

除了性能改善之外,当你声明一个常量时,你会明确地为你自己和其他将使用你的代码的开发者实施两条规则

  1. 我必须用一个值初始化它,现在我不能在其他地方做它。
  2. 我无法在任何地方改变它的价值。

代码中的所有关于可读性和通信。

const关键字告诉编译器在编译时可以完全评估它。 这有一个性能和内存的优势,但它很小。

C#中的常量在内存中提供了一个指定位置来存储数据值。 这意味着variables的值将在编译时被知道,并将被存储在一个地方。

当你声明它时,它在Microsoft中间语言(MSIL)中是一种“硬编码”。

虽然一点点,但它可以提高你的代码的性能。 如果我声明一个variables,而且我可以把它变成一个const,我总是这样做。 不仅因为它可以提高性能,而且因为这是常量的概念。 否则,他们为什么存在?

reflection器在像这样的情况下可以非常有用。 尝试声明一个variables,然后使其成为常量,并查看IL中生成的代码。 那么你所要做的就是查看指令的区别,看看这些指令是什么意思。