2011-09-03 23 views
0

我是一名专业的php程序员,最近我在C#中开始了一个项目。 这些是我第一次使用C#。我的全局CONST的实现 - 是否有可能做不同的事情?

对于我的一个解决方案,我想使用全局CONST。我知道C#不允许你在类作用域之外定义任何变量,但是我想尝试和实现类似的东西,即使只是为了学习不同的语言技术。

我看到做类似的全局CONSTs的最佳方法是定义一个静态类,我们称之为Const,它将保存我所有解决方案的“常量”。 该类将使用私有字典来保存这些值,一种称为'define()'的方法来设置该字典中的值,'is_defined()'用于检查const是否存在等等。

现在, m即将编写将返回值的方法。 很明显,我可以使用一个方法Const.GetConst('someConstName')并得到想要的值,但这是一个很长的方法来检索一个常量,我需要它的任何时候。 我尽管使用了类似PHP的魔法getter(如果你不熟悉它) - 你可以在一个类中定义一个名为'__get'的方法,它可以处理所有未定义的类中的变量请求。 但是,我在C#中找不到任何类似的东西。我能找到的最接近的方法是在运行时在类中动态创建一个方法,这样每次在我的类中创建一个CONST时,我将创建一个“get方法”,它将从私有字典中提取值(这不是传统形式的get方法,因为它不会返回一个变量,而是会在字典中查找值并返回它)。

基本上,我问的是 - - 有没有什么办法来定义全局常量? - (甚至id上一个问题的答案是肯定的)有没有办法为动态定义变量设置一个更好的getter?

非常感谢您的帮助

+1

这样的事情? :http://stackoverflow.com/questions/842590/static-constants-in-c/842596#842596 –

+4

我认为你仍然是太多的PHP'心情'。为什么在知道何时使用它们时使用字典存储变量?你可以预先考虑一个名字,并将它们填入相应的类,如'Database。ConnectionString',具有封装,强打字等所有优点。 – CodeCaster

+0

如果它们是动态属性_and_值,那么关于它们的恒定值是什么?这里有两种不同的情况:暴露常量或属性包;但他们是两回事。 –

回答

4

C#肯定让你声明的公共常量,Math.Pi将是一个很好的例子。然而,几乎总是做错事。问题是常数值直接编译到IL中。这使得它们非常有效,不需要内存访问来查找它们的值,而且当你公开的时候也是非常危险的。

出错是为包含const声明的程序集部署更新。您可以更改该值,但其他程序集也使用该常量仍在使用旧值。牢牢嵌入他们的IL中。这不会达到一个好的目的。

公共常量只适用于显式常量。就像Math.Pi一样,宇宙在改变这种价值的方式上也会发生巨大的变化。像公司或产品名称这样的东西已经被怀疑了,名字一直在改变,没有一个程序员参与决定。

使用只读关键字为公共常量值。

+0

我认为与静态属性返回一个常数,你会得到最好的两种方式。 JITter很可能会内联它们,因此您可以获得良好性能,但常量不会嵌入到调用程序集中。 – CodesInChaos

相关问题