有时我们可能对同一事物使用多个不同的变量来描述,如果将其分开来,显得不够灵活。结构类型很好的解决了这个问题,它把多个不同的变量组织在一起。结构和类有很多相同的地方,结构可以看成一个轻量的类。结构使用struct关键字定义。
其定义方法如下:
struct 结构名称 { 成员声明列表; }
成员可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等。
每个成员在声明的时候都采用如下的格式: 访问修饰符 类型 名称; using System; struct Teacher { public string Name; // 老师姓名 public uint Age; // 老师年龄 public string Phone; // 老师电话 public string Address; // 老师通讯地址 public void Eat() { Console.WriteLine("老师每天中午回家吃饭!"); } }
class Test { public static void Main() { Teacher t; // 声明结构类型Teacher的变量t t.Name = "小刘"; t.Age = 35; t.Phone = "13381335310"; t.Address = "北京大学"; Console.WriteLine("该老师姓名={0},年龄={1},电话={2},通讯地址={3}", t.Name, t.Age, t.Phone, t.Address); t.Eat(); } }
我们可以看出结构类型跟类类型相似,的确如此,但其也有着很大区别:
(1)结构是值类型,类是引用类型;
(2)结构中的成员如果没有指定访问修饰符,默认是public,而类是private;
(3)结构不能包含显式的无参数构造函数,结构成员自动初始化为它们的默认值,而类可以包含这样的无参构造函数;
(4)对于结构中的实例字段成员,不能在声明时赋值初始化;
(5)结构不支持继承,但是,结构可以从基类object继承。结构也可以实现接口。类支持继承,也可以实现接口。 我们再看:
struct Teacher { public string Name; // 老师姓名 public uint Age=18; // 老师年龄 public string Phone; // 老师电话 public string Address; // 老师通讯地址 public void Eat() { Console.WriteLine("老师每天中午回家吃饭!"); }
public Teacher() { this.Name="张三"; } }
这段代码会发生编译错误。定义变量Age时初始化,违反了结构中不能有实例字段初始值设定项的规定。又定义了无参数构造函数,违反了结构不能包含显示无参构造函数的规定。解决方法就是将构造函数改成带参数构造函数。
注意:在结构中不写构造函数,或者写带参数构造函数,这与类的定义是不一样的。定义结构时,数据字段不能赋初值,而类是可以的。
using System; struct Teacher { public string Name; // 老师姓名 public uint Age; // 老师年龄 public string Phone; // 老师电话 public string Address; // 老师通讯地址 public void Eat() { Console.WriteLine("老师每天下午回家吃饭!"); } public Teacher(string name, uint age, string phone, string address) { this.Name = name; this.Age = age; this.Phone = phone; this.Address = address;
} }
class Test { public static void Main() { Teacher t = new Teacher("小刘", 35, "13381335310", "北京大学"); //通过构造函数重载实例化结构对象
Console.WriteLine("该老师姓名={0},年龄={1},电话={2},通讯地址={3}", t.Name, t.Age, t.Phone, t.Address); t.Eat(); } }