【问题标题】:Why static Structures are not allowed in C#? [duplicate]为什么 C# 中不允许使用静态结构? [复制]
【发布时间】:2010-09-16 19:48:02
【问题描述】:

我过去总是将结构视为某种特权较低的事物,或具有较少功能的事物。也许是因为 OOP 概念将所有内容都放入了类中。

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

public static struct mystruct
{
    public static int a;
}

我在堆栈溢出时被指出这是一个错误的方法。谁能详细说明一下。

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

【问题讨论】:

  • 在 C# 中,static 是类型声明中abstract sealed 的别名(它还允许进行一些其他编译时检查,例如确保方法也是静态的)。由于结构是值类型并且不允许多态行为,那么为什么不允许 static 是有道理的。但是,您可以在结构上拥有静态成员。
  • @Steve:如果类是静态的,编译器还会检查类型名称的use。例如,您不能声明 Enumerable 类型的参数。您可能已经意识到这一点,但我想提请注意:)
  • @Jon:没错——谢谢你提醒我。

标签: c# static language-features


【解决方案1】:

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

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

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

【讨论】:

  • 你的意思是你没有参加设计会议?
  • @Dan:唉,我从来没有参加过任何 C# 设计会议。我当然会喜欢
  • 对我来说很有意义。 :-) 就我个人而言,我认为走 VB 路线并制作第三个东西会更好,一个“模块”,比如说,它就像一个静态类。静态方法的容器在逻辑上既不是值类型也不是引用类型,那么为什么通过称它为一种“类”来欺骗人们认为它是一种“类”呢?如果在 C# 1.0 中发明了静态类,我认为这将是可行的方法。但是由于它们是在 2.0 中出现的,因此存在反对创建新关键字“模块”或其他任何关键字的压力。 “静态”和“类”已被保留。
  • 他们举行了 C# 设计会议?在这里,我认为该语言是 Anders Hejlsberg 的唯一作品。 :)
  • @Joan:不。我们从一开始就尽量保留尽可能少的关键字。例如,关键字“get”、“set”和“value”在每个 C# 版本中都没有保留,因为设计者认为程序员希望将它们用作变量名。有关详细信息,请参阅blogs.msdn.com/b/ericlippert/archive/2009/05/11/…。其他公司做出不同的选择;例如,JavaScript 的设计者决定保留 Java 的每个关键字,无论这是否有意义,以防他们将来需要它们。
【解决方案2】:

这并不能完成任何事情。就像使用静态类一样,您仍然拥有一组静态方法。 C# 中的 struct 意味着它是值类型而不是引用类型,这在静态级别没有任何意义。

【讨论】:

    【解决方案3】:

    在“就是这样”下归档。由于您可以使用静态类来做到这一点,因此没有理由允许使用静态结构。它只会让人们混淆它们之间的区别。他们必须选择其中一个。

    【讨论】:

      【解决方案4】:

      我们也不能有一个构造函数来 初始化该类,因为只有 单个实例。

      实际上,没有静态类的实例。哪一种解释了缺乏对静态结构的支持——或者更确切地说,缺乏对这种东西的任何需求

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

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

      【讨论】:

        【解决方案5】:

        没有实例字段初始化器

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

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

        在“http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120”上找到

        【讨论】:

          【解决方案6】:

          静态类型的概念对结构没有意义。结构意味着按值复制的语义——这只有在您可以实例化类型时才有意义。引入静态类是为了更容易将无法实例化的类型中的静态方法组合在一起。允许使用静态结构既多余又令人困惑。

          这样想。 static class Foostatic struct Foo 在行为上有何不同?如果他们不...为什么要引入static struct 概念呢?它只会让人们误以为有区别......

          【讨论】:

          • 我同意你的观点。但是“类”肯定意味着引用复制语义、创建实例的能力以及通过继承共享实现细节,这些都不适用于静态类。静态类比静态结构更好一点也不明显,而且可以说是更糟。
          • @Eric:确实如此……也许还有第三种概念(您在对 Jon 的帖子的评论中提到的模块)可能会更好。我想我想说的是(很糟糕),同时拥有 静态类和静态结构会令人困惑,并暗示不存在的行为差异。
          【解决方案7】:

          因为静态未定义为允许在语言中应用于结构。

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

          【讨论】:

          • 古代链接有什么原因吗?
          • @John:感谢您指出这一点。通过删除它进行更正。当我搜索参考页面时,这只是在 Google 中出现的第一件事。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-15
          • 1970-01-01
          • 2011-01-28
          • 2012-06-14
          • 2015-12-02
          • 2017-04-24
          相关资源
          最近更新 更多