【问题标题】:My implementation of global CONSTs - is it possible to do something differently?我对全局 CONST 的实现——是否可以做一些不同的事情?
【发布时间】:2011-09-03 10:06:25
【问题描述】:

我是一名专业的 php 程序员,最近我开始了一个 C# 项目。 这是我使用 C# 的第一步。

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

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

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

基本上,我要问的是—— - 有没有办法定义全局常量? - (即使上一个问题的答案是肯定的)有没有办法为动态定义变量设置更好的吸气剂?

非常感谢您的帮助

【问题讨论】:

  • 我认为你在 PHP 的“情绪”中仍然太过分了。当你知道什么时候要使用变量时,为什么还要使用字典来存储它们?您可以事先想好一个名称,然后将它们填充到适当的类中,例如 Database.ConnectionString,具有封装、强类型等所有优点。
  • 如果它们是动态属性 值,它们究竟是什么常量?这里有两种不同的场景:暴露常量属性包;但它们是两种不同的东西。

标签: c#


【解决方案1】:

C# 当然允许你声明公共常量,Math.Pi 就是一个很好的例子。然而,这几乎总是错误的做法。问题是常量值直接编译到 IL 中。这使得它们非常高效,无需访问内存即可查找它们的值,但在公开时也非常危险。

问题在于为包含 const 声明的程序集部署更新。您可以更改该值,但也使用该常量的 other 程序集仍使用旧值。牢牢地嵌入在他们的 IL 中。这不会有好的结局。

公共常量仅适用于清单常量。像 Math.Pi 一样,它需要对宇宙的工作方式进行巨大的改变才能改变这个值。诸如公司或产品名称之类的东西已经令人怀疑,名称一直在变化,而程序员却没有参与决策。

对公共常量值使用 readonly 关键字。

【讨论】:

  • 我认为使用返回常量的静态属性,您可以获得两种方式的最佳效果。 JITter 很可能会内联它们,因此您可以获得良好的性能,但常量不会嵌入到调用程序集中。
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2014-08-01
相关资源
最近更新 更多