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

时间:2010-09-16 19:48:02

标签: c# static language-features

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

从少量接触到C#,我明白设置一个静态类,确保其所有成员&功能是静态的。此外,我们不能有一个构造函数来初始化该类,因为只有一个实例。

public static struct mystruct
{
    public static int a;
}

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

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

7 个答案:

答案 0 :(得分:17)

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

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

(当然,并不是我参加了设计会议。当然,Eric Lippert可能会找到一些关于它的注释。上面只是一个有根据的猜测。注释的C#3规范是静默的事情,据我所知。)

答案 1 :(得分:8)

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

答案 2 :(得分:3)

在“那就是它的方式”下的文件。由于您可以使用静态类,因此没有理由允许静态结构。只会让人们对它们之间的区别感到困惑。他们不得不挑选一个或另一个。

答案 3 :(得分:3)

  

我们也不能有一个构造函数   只有初始化那个类   单个实例。

实际上,有一个静态类的没有实例。哪种解释是缺乏对静态结构的支持 - 或者更确切地说,缺少任何需要这样的事情。

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

没有任何实例可言,这种区别变得无关紧要;所以任何纯粹由静态成员组成的类型也可能是一个静态类。

答案 4 :(得分:3)

无实例字段初始值设定项

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

struct Point
{ 
    public int x = 20; // Error its not possible to initialize
    public int y=20; // Error its not possible to initialize
} 

但是结构可以包含静态字段,可以在结构中初始化。 以下示例显示了在struct中使用静态字段。

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);    
    }
}

见于“http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120

答案 5 :(得分:1)

静态类型的概念对于结构体没有意义。结构意味着按值复制语义 - 只有在可以实例化类型时才有意义。引入了静态类,以便更容易将静态方法组合在一个无法实例化的类型中。允许静态结构既冗余又令人困惑。

以这种方式思考。 static class Foostatic struct Foo行为有何不同?如果他们不这样做......为什么要引入static struct概念呢?它只能让人们误以为存在差异......

答案 6 :(得分:1)

因为未将static定义为要应用于结构的语言。

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