为什么C#中不允许使用静态结构? 我过去总是把结构看作是一种不太有特权的东西,或者是一些特征不太好的东西。也许是因为OOP的概念把所有的东西都放到了类中

为什么C#中不允许使用静态结构? 我过去总是把结构看作是一种不太有特权的东西,或者是一些特征不太好的东西。也许是因为OOP的概念把所有的东西都放到了类中,c#,static,language-features,C#,Static,Language Features,通过对C#的少量接触,我了解到将类设置为静态可以确保其所有成员和函数都是静态的。此外,我们不能使用构造函数来初始化该类,因为只有一个实例 public static struct mystruct { public static int a; } 我在Stack overflow这里被指出这是一个错误的方法。有人能详细说明一下吗 当我创建一个新的cs文件并在控制台中编译它时,我得到了一个适当的错误,说“static对此项无效”。 奇怪的是,当我把它添加到一个现有的工作项目中,看看编译器

通过对C#的少量接触,我了解到将类设置为静态可以确保其所有成员和函数都是静态的。此外,我们不能使用构造函数来初始化该类,因为只有一个实例

public static struct mystruct
{
    public static int a;
}
我在Stack overflow这里被指出这是一个错误的方法。有人能详细说明一下吗

当我创建一个新的cs文件并在控制台中编译它时,我得到了一个适当的错误,说“static对此项无效”。
奇怪的是,当我把它添加到一个现有的工作项目中,看看编译器是否会抱怨,但令我惊讶的是,它没有。有什么原因吗?

这没什么用。您仍然拥有一个静态方法集合,就像处理静态类一样。C#中的结构意味着它是一种值类型而不是引用类型,在静态级别上没有任何意义。

静态类型的概念对结构没有意义。结构意味着按值复制语义-只有在可以实例化类型时才有意义。引入静态类是为了更容易将无法实例化的类型中的静态方法组合在一起。允许静态结构既冗余又混乱


这样想吧。
静态类Foo
静态结构Foo
在行为上有什么不同?如果他们没有。。。为什么要引入
静态结构
概念?它只会让人们误以为这是有区别的…

因为在应用于结构的语言中,静态是不允许定义的


静态类已经定义了相同的功能。

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

静态结构将完全相同,因此不会提供任何优势-但读者可能会认为它有一些特殊的意义。为避免混淆,因此禁止使用。当然,从概念上讲,它和静态类一样有意义——结构和类之间的区别实际上在于它们的实例的行为方式,因为这两种类型都没有静态类型的实例,所以这种区别是没有意义的

(当然,这不是我在设计会议上决定的。Eric Lippert很可能能找到一些关于它的注释。以上只是一个有根据的猜测。据我所知,带注释的C#3规范对这一问题没有提及。)

将其归档在“这就是它的方式”下。因为您可以使用静态类来实现,所以没有理由允许使用静态结构。这只会混淆人们之间的区别。他们必须选择其中一个

此外,我们不能有一个构造函数 初始化该类,因为只有 一个实例

public static struct mystruct
{
    public static int a;
}
实际上,没有静态类的实例。这就解释了缺乏对静态结构的支持——或者更确切地说,缺乏对这种东西的任何需求

NET中引用类型和值类型(C#中的
class
struct
)之间的区别完全在于如何处理这些类型的实例。引用类型的实例通过以变量形式对该实例的引用进行访问。这些引用的副本在方法调用之间传递。直接访问值类型的实例,并在方法调用之间传递实例本身的副本


由于没有任何实例可言,这种区别变得无关紧要;因此,任何纯粹由静态成员组成的类型都可能是静态类。

没有实例字段初始值设定项

在一个类中,我们可以创建一个字段/变量并对其进行初始化,同时一个结构不能包含这样的初始化。必须通过函数或使用对象本身初始化这些字段。创建时不能为字段指定初始值。以下代码给出了一个错误:

struct Point
{ 
    public int x = 20; // Error its not possible to initialize
    public int y=20; // Error its not possible to initialize
} 
但是,结构可以包含静态字段,这些字段可以在结构内部初始化。 下面的示例显示了在结构中使用静态字段

struct  Point  {
        public static int x = 25;
        public static int y = 50;
}
结构与方法

C#结构也可以包含方法。这些方法可以是静态的,也可以是非静态的。但静态方法只能访问其他静态成员,不能使用结构的对象进行调用。它们只能使用结构名称进行调用

struct Point  
{    
    static int x = 25;    
    static int y = 50;
    public void SetXY(int i, int j)    
    {        
        x = i;        
        y = j;    
    }     

    public static void ShowSum()            
    {        
        int sum = x + y;        
        Console.WriteLine("The sum is {0}",sum);    
    }
}

正如在“

上找到的那样,有没有这个古老链接的原因?@John:谢谢你指出这一点。通过移除它来更正。这是我在谷歌搜索参考页面时发现的第一件事。你的意思是你没有参加设计会议?@Dan:唉,我从来没有参加过任何C#设计会议。当然,我很想成为。这对我来说很有意义。:-)就我个人而言,我认为采用VB的方式,制作第三种东西,比如说,一个“模块”,这就像一个静态类,会更好。静态方法的容器在逻辑上既不是值类型也不是引用类型,那么为什么要通过将其称为“类”来愚弄人们呢?如果静态类是在C#1.0中发明的,我认为这将是一条发展之路。但是自从他们在2.0版本出现以来,就有压力反对制作一个新的关键字“module”,或者其他任何东西。“静态”和“类”已经被预订了。他们举行了C#设计会议?在这里,我认为语言是安德斯·海尔斯伯格唯一的作品@琼:没有。我们试图从一开始就尽可能少地保留关键字。例如,在每一个C#版本中,关键字“get”、“set”和“value”都是无保留的,因为设计者认为程序员希望将它们用作变量名。寻找