为什么在C#中不允许使用静态结构?

lox*_*xxy 9 c# static language-features

我总是习惯将结构视为某种较少特权的东西,或者具有较少特征的东西.也许是因为OOP概念将所有东西都吹成了类.

从少量暴露到C#,我理解设置一个静态类,确保其所有成员和函数都是静态的.此外,我们不能有一个构造函数来初始化该类,因为只有一个实例.

public static struct mystruct
{
    public static int a;
}
Run Code Online (Sandbox Code Playgroud)

我在堆栈溢出处指出这是一个错误的方法.有人可以详细说明.

当我创建一个新的cs文件并在控制台中编译它时,我得到了相应的错误,说"静态对此项无效".奇怪的是,当我将其添加到现有的工作项目中时,看看编译器是否会抱怨,但令我惊讶的是它没有.这有什么理由?

Jon*_*eet 17

静态类只是静态成员(任何类型 - 字段,事件,属性和最常见的方法)的容器.

静态结构将完全相同,因此不会提供任何优势 - 但读者可能认为它具有一些特殊含义.为避免混淆,因此禁止.从概念上讲,它与静态类一样有意义 - 结构和类之间的区别实际上就它们的实例如何表现而言,并且由于不存在任何类型的静态类型的实例,这种差异将是没有实际意义.

(当然,并不是我在设计会议上决定这一点.Eric Lippert可能能够找到一些有关它的注释.上面只是一个有根据的猜测.注释的C#3规范在这个问题上保持沉默,如同我可以看到.)

  • 我感觉合理.:-)就我个人而言,我认为进入VB路线并做出第三件事情会更好,一个"模块",比如说,就像一个静态类.静态方法的容器在逻辑上既不是值类型也不是引用类型,那么为什么愚弄人们认为它是通过称之为"类"?如果在C#1.0中发明了静态类,我认为这应该是可行的方法.但是,由于它们出现在2.0版本中,因此无法制作新的关键字"模块"或其他任何内容."静态"和"阶级"已被保留. (3认同)
  • 你的意思是你在设计会议上没有*? (2认同)
  • @Joan:不.我们尝试从一开始就尽可能少地保留关键字.例如,关键字"get","set"和"value"在每个C#版本中都是未保留的,因为设计人员认为程序员希望将它们用于变量名称.有关详细信息,请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx.其他公司做出不同的选择; 例如,JavaScript的设计者决定保留Java的每个关键字是否有意义,以防他们将来需要它们. (2认同)

Mat*_*eer 8

这没有任何成就.您仍然拥有静态方法的集合,就像使用静态类一样.C#中的结构意味着它是值类型而不是引用类型,它在静态级别没有意义.