1. 结构体简介
结构体使用struct
关键字定义的
public struct StructName
{
// 字段 属性 方法 事件
}
struct
类型适用于表示轻量级对象,如 Point、Rectangle 和 Color。 尽管用类也可以实现,但在某些情况下,使用结构可能更高效。 例如,如果你声明具有 1000 个 Point对象的数组,那么你将分配额外的内存用于引用每个对象;在这种情况下,使用结构将更为方便。
struct Location
{
public int x;
public int y;
public int z;
public Location(int x, int y, int z)
{
this.x = x;
this.z = z;
this.y = y;
}
}
static void Main(string[] args)
{
Location loc1 = new Location(5, 6, 7);
Location loc2 = new Location(5, 6, 7);
Location loc3;
loc3.x = 5;
loc3.y = 6;
loc3.z = 7;
Console.WriteLine(loc1.x + loc2.y +loc3.z);
}
2. 使用结构体注意点
定义结构的默认(无参数)构造函数是错误的。 在结构体中初始化实例字段也是错误的。 在声明结构后,只能通过使用参数化构造函数或通过逐个访问成员才可以初始化结构成员。 任何私有或其他不可访问的成员只能在构造函数中进行初始化。
使用
new
运算符创建结构对象时,将会创建结构对象且会调用相应的构造函数。 与类不同,可以对结构进行实例化,而无需使用new
运算符。 在这种情况下,没有调用任何构造函数,从而提高了分配效率。 但是,字段将保持为未分配状态且必须在在初始化所有字段之后才可使用对象。一个结构无法继承自另一个结构或类,并且它不能为类的基类。 但是,它可以从基类
Object
继承。 结构也可以实现接口,且实现方法与类相同。不能使用关键字 struct声明一个类。 在 C# 中,类和结构在语义上是不同的。 结构是值类型,而类是引用类型。
将较小的类声明为结构,可以提高系统的处理效率。
3. 结构与类
结构与类共享大多数相同的语法,但结构比类受到的限制更多:
- 在结构声明中,除非字段被声明为
const
或static
,否则无法初始化。 - 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
- 结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。 在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
- 结构是值类型,而类是引用类型。
- 与类不同,结构的实例化可以不使用
new
运算符。 - 结构也可以声明带参数的构造函数。
- 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。 所有结构都直接继承自
System.ValueType
,后者继承自System.Object
。 - 结构也可以实现接口。
- 结构可用作可以为
null
的类型,因而可向其赋null
值。