C# 结构(构造函数和析构函数)
构造函数和析构函数
结构可以有实例构造函数和静态构造函数,但不允许有析构函数。
实例构造函数
语言隐式地为每个结构提供一个无参数的构造函数。这个构造函数把结构的每个成员设置为
该类型的默认值。值成员设置成它们的默认值,引用成员设置成null。
对于每个结构,都存在预定义的无参数构造函数,而且不能删除或重定义。但是,可以创建
另外的构造函数,只要它们有参数。注意,这和类不同。对于类,编译器只在没有声明其他构造
函数时提供隐式的无参数构造函数。
调用一个构造函数,包括隐式无参数构造函数,要使用new运算符。注意,即使不从堆中分
配内存,也要使用new运算符。
例如,下面的代码声明了一个简单的结构,它有一个带两个int参数的构造函数。创建
该结构的两个实例,一个使用隐式无参数构造函数,另一个使用带两个参数的构造函数。
struct Simple
{public int X;public int Y;public Simple(int a,int b) //带有参数的构造函数{X=a;Y=b;}
}class Program
{static void Main(){Simple s1=new Simple(); //调用隐式构造函数Simple s2=new Simple(5,10);Console.WriteLine($"{s1.X},{s1.Y}"); //调用构造函数Console.WriteLine($"{s2.X},{s2.Y}");}
}
也可以不使用new运算符创建结构的实例。然而,如果这样做,有一些限制,如下:
- 在显式设置数据成员之后,才能使用它们的值;
- 例如,下面的代码展示了结构Simple的两个实例,它们没有使用new运算符创建。当企图
访问s1而没有显式地设置该数据成员的值时,编译器产生一条错误消息。对s2的成员赋值之后,
读取s2就没有问题了。
struct Simple
{public int X;public int Y;
}class Program
{static void Main(){Simple s1,s2; //没有构造函数的调用Console.WriteLine("{0,{1}",s1.X,s1.Y) //编译错误 还未被赋值s2.X=5;s2.Y=10;Console.WriteLine($"{s2.X},{s2.Y}"); //没问题}
}
静态构造函数
与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。结构
的静态构造函数遵从与类的静态构造函数一样的规则,但允许有不带参数的静态构造函数。
以下两种行为,任意一种发生之前,将会调用静态构造函数。
- 调用显式声明的构造函数。
- 引用结构的静态成员。
构造函数和析构函数小结
表11-1总结了结构的构造函数和析构函数的使用。