TOC

This article is currently in the process of being translated into Chinese (~90% done).

Advanced topics:

Structs

C#结构体是一种类的轻量级替代。其功能几乎与类一样,但使用结构体的“代价”远低于使用类。其中原因解释起来有点过于技术化,但总体来说就是新的类实例是放在堆(heap)上的,而新的结构体实例是放在堆栈(stack)里的。此外,不用象类那样处理结构体引用,而是直接使用结构体实例。这表示向方法传入结构体时使用的是值传递,而不是引用传递。这方面内容在方法参数那一章有更多介绍。

因此,如果要表示相对简单的数据结构,尤其是已经知道需要生成很多实例时,应该使用结构体。.NET framework中就有很多微软使用结构体替代类的例子,比如Point,Rectangle和Color结构体。

这里先展示一个使用结构体的例子,然后再讨论使用它们替代类时的一些限制:

class Program { static void Main(string[] args) { Car car; car = new Car("Blue"); Console.WriteLine(car.Describe()); car = new Car("Red"); Console.WriteLine(car.Describe()); Console.ReadKey(); } } struct Car { private string color; public Car(string color) { this.color = color; } public string Describe() { return "This car is " + Color; } public string Color { get { return color; } set { color = value; } } }

眼尖的读者可能已经注意到,这基本上就是用于介绍类的那个例子的代码,只不过把class换成了struct。这显示了两个概念的相似程度。不过它们的不同之处在那里呢,除了本文开始时提到的那些技术性的东西?

首先,字段不能初始化,表示不能这样定义成员:

private string color = "Blue";

如果定义一个构造器,必需在构造器中给所有的字段赋值。结构体没有默认构造器,但如果定义了构造器,就必需在里面初始化所有字段。这也意味着不能定义自己的无参数构造器 - 所有结构体构造器最少必需有一个参数。以上示例给color字段进行了赋值。如果没有做此赋值,编译器就会报错。

结构体不能继承其它类或结构体,类也不能继承结构体。结构体确实继承自Object类,但结构体与继承的关系仅限于此。不过结构体倒是支持界面,表示结构体可以实现定制的界面。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!