C#数据类型-结构类型
有时我们可能对同一事物使用多个不同的变量来描述,如果将其分开来,显得不够灵活。结构类型很好的解决了这个问题,它把多个不同的变量组织在一起。结构和类有很多相同的地方,结构可以看成一个轻量的类。结构使用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();
}
}