对于这样的类型:
public class BlurEffect
{
public const string Name = "Blur";
public int Amount {get;set;}
}
我有一些像.Name
这样的成员,对于所有成员都是一样的,我应该将其设为静态吗?
我只是不希望每个实例存储它,或者使用超过必要的资源,它们也应该是只读的。
最后我想要实例访问它,所以我可以说:
blurEffect.Name
我应该创建一个返回私有静态变量的Name属性吗?这是最好的方式吗?
答案 0 :(得分:4)
C#中的常量实际上是在编译时解析的。它们将被编译器使用的任何位置替换为值,因此“变量”(Name
)实际上不会存在于生成的编译IL中。
字符串常量另外得到interned,因此只有一个“Blur”副本将被加载到您的可执行文件中,无论它使用了多少次。
就个人而言,我会使用私有const和公共变量:
public class BlurEffect
{
private const string name = "Blur";
public string Name { get { return name; } }
public int Amount {get;set;}
}
这可以让你获得基于实例的用法,并且仍然有一个你可以操作的常量。
答案 1 :(得分:1)
答案 2 :(得分:1)
我个人从未见过public const
变量有任何问题。但是,要考虑的一件事是,如果您以后需要将const更改为非常量(或者当有人获取常量的值时需要进行任何形式的处理),那么您将破坏二进制API。
这意味着,如果这是在类库的范围内,那么如果稍后进行此类更改,则必须重新编译链接到类库的每个项目。您不能只是插入DLL来进行此类更新。
答案 3 :(得分:1)
.NET中的常量有点奇怪。当您定义常量时,编译器会在源代码中强制执行面向对象的约定,但是当编译器创建程序集时,任何引用此常量的程序集(包括您声明它的程序集)都会调用对常量引用的替换引用存储在本地程序集清单中的相同值(存储大多数“文字”)。因此,常量有效地存储在每个程序集中,并且对于程序集中每个常量的使用都是“静态的”。问题是,如果更改常量,则必须重新编译引用常量的任何程序集,以刷新其他程序集上的清单。
就个人而言,我会将该值定义为静态,并通过属性公开它。这将阻止简单地嵌入值,而是将其放置在对象的静态副本中,该副本将由当前AppDomain中需要它的任何程序集从一个地方引用(这基本上意味着它在应用程序的任何地方都是相同的,除了涉及应用程序池或子域的一些特殊情况。)