在c#中,结构与类非常相似,只要掌握好类的使用,使用结构就变得非常简单,下面对结构进行简单介绍。
1.定义结构
下面代码首先定义一个类
class Person
{
public string Name{get;set;}
public int age { get; set; }
public int height { get; set; }
public double weight { get; set; }
public string country { get; set; }
}
这已经非常熟悉了,下面来定义一个结构
struct SPerson
{
public string Name { get; set; }
public int age { get; set; }
public int height { get; set; }
public double weight { get; set; }
public string country { get; set; }
}
我们发现唯一的区别就是类的定义使用“class”关键字,而结构使用“struct”关键字。
这只是表面上的不同,下面介绍起具体的不同点
2 类与结构的区别
1)构造函数
类中可以覆盖默认无参构造函数,代码如下
class Person
{
public Person(){}
}
结构中只能定义新的构造函数,如果象上面那样覆盖无参构造函数,则会报错“ 结构不能包含显式的无参数构造函数”。
但是在结构中可以定义新的构造函数,如下所示
struct SPerson
{
//public SPerson() { }
public SPerson(string xname, int xage):this()
{
Name = xname;
Age = xage;
}
}
大家会发现,和类中定义构造函数还是有所不同的,定义时加上了了:this(),如果不加this会有什么结果呢?编译器会报错“必须对自动实现的属性“结构.SPerson.所有属性名称”的支持字段完全赋值,才能将控制返回给调用方。请考虑从构造函数初始值设定项中调用默认构造函数”和“在给“this”对象的所有字段赋值之前,无法使用该对象”,关于错误的具体原因,可以参考如下链接http://www.cnblogs.com/cuitsl/archive/2011/08/22/2149896.html,这里就不详细阐述了。
2)字段不能初始化
我们可以在类中定义字段,并定义初始值
private string color = "黄色";
这行代码若放在结构中,则会报错"结构中不能有实例字段初始值设定项".。但是如果字段被声明称const(常量)或者static(静态),则可以为其初始化。
3)结构是值类型,类是引用类型
类是引用类型,类的对象存储在堆中,结构是值类型,存储在栈中,这就意味着,在将一个类对象赋值给另外一个变量时,是引用传递,而将结构对象赋值给另外一个变量时则是复制传递。看下面的代码
Person p1 = new Person(); p1.Name = "yhb"; Console.WriteLine(p1.Name); Person p2 = p1; p2.Name = "bhy"; Console.WriteLine(p1.Name);
首先声Person类的一个实例p1,然后为p1的Name属性赋值,然后将p1赋值给另外一个Person类型的变量p2,然后更改p2中Name属性的值,通过输出结果可以发现对象p1中Name属性的值也变化了。这就是引用传递,Person类型的变量p1和p2其实指向的同一个Person实例
如果将上面的代码改成结构呢?
SPerson sp = new SPerson(); sp.Name = "yhb"; Console.WriteLine(sp.Name); SPerson sp1 = sp; sp1.Name = "bhy"; Console.WriteLine(sp.Name);
观察最后的输出结果,发现sp.Name的值并没有随着sp1.Name的改变而改变,这就是值传递的特点-复制传递:在将sp对象赋值给sp1时,其实是复制了一份给sp1。无论改变哪个,另外一个都不会受到影响。
4.结构不能被继承,可以把结构看成密封类(sealed)
5.使用结构的情形首先确定一点,使用结构可以完成的功能,都可以通过类来实现,只有在使用轻量级数据时,我们才考虑使用结构,不严谨的说就是在类中的成员不是很多,且创建结构后就不再修改数据,这时候就可以考虑使用结构。