我总是习惯将结构视为某种较少特权的东西,或者具有较少特征的东西。也许是因为OOP概念将所有东西都吹成了类。
从少量接触到C#,我明白设置一个静态类,确保其所有成员&功能是静态的。此外,我们不能有一个构造函数来初始化该类,因为只有一个实例。
public static struct mystruct
{
public static int a;
}
我在堆栈溢出处被指出这是一个错误的方法。有人可以详细说明。
当我创建一个新的cs文件时,我收到了相应的错误,说“静态对此项无效”。在控制台中编译它。 奇怪的是,当我将其添加到现有的工作项目中时,看看编译器是否会抱怨,但令我惊讶的是它没有。这有什么原因??
答案 0 :(得分:17)
静态类只是静态成员(任何类型的字段,事件,属性和最常用的方法)的容器。
静态结构将完全相同,因此不会提供任何优势 - 但读者可能认为它具有某些特殊含义。为避免混淆,因此禁止。从概念上讲,它与静态类一样有意义 - 结构和类之间的区别实际上就它们的实例的行为方式而言,并且因为没有静态类型的实例无论哪种,这种差异都没有实际意义。
(当然,并不是我参加了设计会议。当然,Eric Lippert可能会找到一些关于它的注释。上面只是一个有根据的猜测。注释的C#3规范是静默的事情,据我所知。)
答案 1 :(得分:8)
这没有任何成就。您仍然拥有静态方法的集合,就像使用静态类一样。 C#中的结构意味着它是一个值类型而不是引用类型,它在静态级别没有意义。
答案 2 :(得分:3)
在“那就是它的方式”下的文件。由于您可以使用静态类,因此没有理由允许静态结构。只会让人们对它们之间的区别感到困惑。他们不得不挑选一个或另一个。
答案 3 :(得分:3)
我们也不能有一个构造函数 只有初始化那个类 单个实例。
实际上,有一个静态类的没有实例。哪种解释是缺乏对静态结构的支持 - 或者更确切地说,缺少任何需要这样的事情。
.NET中的引用类型和值类型(C#中的class
和struct
)之间的区别完全取决于如何处理这些类型的实例。引用类型的实例通过引用以变量的形式访问该实例。在方法调用之间传递对这些引用的副本。直接访问值类型的实例,并在方法调用之间传递实例本身的副本。
没有任何实例可言,这种区别变得无关紧要;所以任何纯粹由静态成员组成的类型也可能是一个静态类。
答案 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 Foo
和static struct Foo
行为有何不同?如果他们不这样做......为什么要引入static struct
概念呢?它只能让人们误以为存在差异......
答案 6 :(得分:1)
因为未将static定义为要应用于结构的语言。
静态类已经定义了相同的能力。