代码之家  ›  专栏  ›  技术社区  ›  loxxy

为什么C中不允许静态结构?[副本]

  •  9
  • loxxy  · 技术社区  · 14 年前

    我以前总是把结构看作是一些不那么有特权的东西,或者是一些功能较弱的东西。可能是因为OOP的概念把所有的东西都吹进了课堂。

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

    public static struct mystruct
    {
        public static int a;
    }
    

    在堆栈溢出处,我被指出这是一个错误的方法。有人能详细解释一下吗?

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

    7 回复  |  直到 14 年前
        1
  •  17
  •   Jon Skeet    14 年前

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

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

    (当然,我不是在设计会议上决定的。埃里克·利珀特很可能会找到一些关于它的笔记。以上只是一个有根据的猜测。据我所见,注释的C 3规范对这一问题保持沉默。)

        2
  •  8
  •   Matt Greer    14 年前

    这没什么用。您仍然可以像处理静态类那样拥有一组静态方法。C中的结构表示它是一个值类型,而不是一个在静态级别上没有意义的引用类型。

        3
  •  3
  •   Bryan    14 年前

    把它写在“就是这样”。因为可以用静态类来实现,所以没有理由允许静态结构。它只会让人们混淆他们之间的区别。他们不得不挑选其中一个。

        4
  •  3
  •   Dan Tao    14 年前

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

    实际上,有 静态类的实例。哪种解释缺乏对静态结构的支持——或者更确切地说,缺乏 需要 为了这样一件事。

    .NET中引用类型和值类型之间的区别( class struct 在c)中,完全是关于 实例 这些类型中的一个被处理。引用类型的实例通过 参考 以变量的形式传递给该实例。这些引用的副本在方法调用之间传递。直接访问值类型的实例,并在方法调用之间传递实例本身的副本。

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

        5
  •  3
  •   John Saunders    14 年前

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

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

    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
  •  1
  •   LBushkin    14 年前

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

    这样想。怎么做? static class Foo static struct Foo 行为不同?如果他们不…为什么要介绍 static struct 概念?它只能让人们误以为有区别…

        7
  •  1
  •   Brian R. Bondy    14 年前

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

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

    推荐文章