是否有可能在C#中声明一个恒定的Guid?
我明白我可以声明一个static readonly Guid
,但是有一种语法允许我写const Guid
吗?
编译器错误CS0283表示只能将基本POD类型(以及字符串,枚举和空引用)声明为const
.有没有人有关于这种限制的理由的理论?例如,能够声明其他类型的const值(例如IntPtr)会很好.
我相信这个概念const
实际上是C#中的语法糖,它只是用文字值替换了名称的任何用法.例如,给定以下声明,在编译时对Foo的任何引用都将替换为"foo".
const string Foo = "foo";
Run Code Online (Sandbox Code Playgroud)
这将排除任何可变类型,因此他们可能选择此限制而不必在编译时确定给定类型是否可变?
tl; wr:这是一个讨论.
我知道这个"问题"更多的是讨论,因此我将其标记为社区维基.但是,根据" 如何询问"页面,它可能属于此处,因为它具体与编程相关,经过一个小时的研究后无法在网络上讨论,具体而言,与大多数C#程序员和主题相关.而且,这个问题本身就是为了获得答案,不管我的偏见,我都会保持开放的态度:C#真的会从总体结构中受益吗?尽管有这一前言,但我知道这是关闭的,但如果有权限和意图关闭的用户将我重定向到Web上的适当讨论点,我将不胜感激.
结构是C#中的灵活但有争议的类型.它们提供堆栈分配的值类型组织范例,但不提供其他值类型的不变性.
有人说结构应该代表值,而值不会改变(例如int i = 5;
,5是不可变的),而有些人认为它们是带有子字段的OOP布局.
上结构不变性(辩论1,2,3),为此,当前的解决方案似乎具有程序员执行不变性,也没有解决.
例如,当结构作为引用(本页底部)访问并限制赋值时,C#编译器将检测可能的数据丢失.此外,由于结构构造函数,属性和函数能够执行任何操作,在返回控件之前使用限制(对于构造函数)分配所有字段,结构不能声明为常量,如果它们仅限于数据表示.
聚合类(维基百科)是严格的数据结构,功能有限,注定会因缺乏灵活性而在对应方面提供语法糖.在C++中,它们"没有用户声明的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数".尽管核心概念保持不变,但C#中此类类别的理论细节仍可供讨论.
由于聚合结构是严格的带有标记访问器的数据持有者,因此它们的不变性(在可能的C#环境中)将被保险.除非?
指定了null运算符(),否则聚合也无法为空,无其他纯值类型.出于这个原因,许多非法的结构操作将成为可能,以及一些语法糖.
从C++语法中我们可以想象出以下几点:(记住,这是一个社区维基,欢迎并鼓励改进)
aggregate Size
{
int Width;
int Height;
}
aggregate Vector
{
// Default values for constructor.
double X = 0, Y = 0, Z = 0;
}
aggregate Color
{
byte R, G, B, …
Run Code Online (Sandbox Code Playgroud) 因为我在我的应用程序的多个地方使用"System.Drawing.Color.Gainsboro":
if (tb.BackColor.Equals(System.Drawing.Color.Gainsboro)) {
Run Code Online (Sandbox Code Playgroud)
......我想让它成为一个常数.但当我尝试时:
const System.Drawing.Color PSEUDO_HIGHLIGHT_COLOR = System.Drawing.Color.Gainsboro;
Run Code Online (Sandbox Code Playgroud)
...我得到了,"类型'System.Drawing.Color'不能声明为const"
???