相关疑难解决方法(0)

如何在C#中声明一个常量Guid?

是否有可能在C#中声明一个恒定的Guid?

我明白我可以声明一个static readonly Guid,但是有一种语法允许我写const Guid吗?

c# guid const constants compile-time-constant

51
推荐指数
5
解决办法
4万
查看次数

为什么C#限制可以声明为const的类型集?

编译器错误CS0283表示只能将基本POD类型(以及字符串,枚举和空引用)声明为const.有没有人有关于这种限制的理由的理论?例如,能够声明其他类型的const值(例如IntPtr)会很好.

我相信这个概念const实际上是C#中的语法糖,它只是用文字值替换了名称的任何用法.例如,给定以下声明,在编译时对Foo的任何引用都将替换为"foo".

const string Foo = "foo";
Run Code Online (Sandbox Code Playgroud)

这将排除任何可变类型,因此他们可能选择此限制而不必在编译时确定给定类型是否可变?

c# compiler-errors constants

29
推荐指数
1
解决办法
6050
查看次数

C#会从聚合结构/类中受益吗?

前言

tl; wr:这是一个讨论.

我知道这个"问题"更多的是讨论,因此我将其标记为社区维基.但是,根据" 如何询问"页面,它可能属于此处,因为它具体与编程相关,经过一个小时的研究后无法在网络上讨论,具体而言,与大多数C#程序员和主题相关.而且,这个问题本身就是为了获得答案,不管我的偏见,我都会保持开放的态度:C#真的会从总体结构中受益吗?尽管有这一前言,但我知道这是关闭的,但如果有权限和意图关闭的用户将我重定向到Web上的适当讨论点,我将不胜感激.


介绍


缺乏结构可变性

结构是C#中的灵活但有争议的类型.它们提供堆栈分配的值类型组织范例,但不提供其他值类型的不变性.

有人说结构应该代表值,而值不会改变(例如int i = 5;,5是不可变的),而有些人认为它们是带有子字段的OOP布局.

上结构不变性(辩论1,2,3),为此,当前的解决方案似乎具有程序员执行不变性,也没有解决.

例如,当结构作为引用(本页底部)访问并限制赋值时,C#编译器将检测可能的数据丢失.此外,由于结构构造函数,属性和函数能够执行任何操作,在返回控件之前使用限制(对于构造函数)分配所有字段,结构不能声明为常量,如果它们仅限于数据表示.


不可变的结构子集,聚合

聚合类(维基百科)是严格的数据结构,功能有限,注定会因缺乏灵活性而在对应方面提供语法糖.在C++中,它们"没有用户声明的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数".尽管核心概念保持不变,但C#中此类类别的理论细节仍可供讨论.

由于聚合结构是严格的带有标记访问器的数据持有者,因此它们的不变性(在可能的C#环境中)将被保险.除非?指定了null运算符(),否则聚合也无法为空,无其他纯值类型.出于这个原因,许多非法的结构操作将成为可能,以及一些语法糖.


用途


  1. 聚合可以声明为const,因为它们的构造函数将被强制除了分配字段之外什么都不做.
  2. 聚合可以用作方法参数的默认值.
  3. 聚合可以是隐式顺序,促进与本机的交互
  4. 聚合将是不可变的,不会导致参考访问的数据丢失.编译器检测到这些子字段修改可能会导致完整的隐式重新分配.libraries.

假设语法


从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)

c# struct aggregate class

8
推荐指数
1
解决办法
2387
查看次数

为什么不能声明System.Drawing.Color类型的常量?

因为我在我的应用程序的多个地方使用"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"

???

c# constants colors winforms

3
推荐指数
3
解决办法
4641
查看次数