c#中的结构



http://blog.csdn.net/mynewdays/article/details/8590077

在c#中,结构与类非常相似,只要掌握好类的使用,使用结构就变得非常简单,下面对结构进行简单介绍。

1.定义结构

下面代码首先定义一个类

  1. class Person  
  2. {  
  3.     public string Name{get;set;}  
  4.     public int age { getset; }  
  5.     public int height { getset; }  
  6.     public double weight { getset; }  
  7.     public string country { getset; }  
  8. }  
    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; }
    }


这已经非常熟悉了,下面来定义一个结构

  1. struct SPerson  
  2. {     
    struct SPerson
    {   
  1.     public string Name { getset; }  
  2.         public int age { getset; }  
  3.         public int height { getset; }  
  4.         public double weight { getset; }  
  5.         public string country { getset; }  
	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; }
  1. }  
    }


我们发现唯一的区别就是类的定义使用“class”关键字,而结构使用“struct”关键字。

这只是表面上的不同,下面介绍起具体的不同点

2 类与结构的区别

1)构造函数

类中可以覆盖默认无参构造函数,代码如下

  1. class Person  
  2. {  
  3.     public Person(){}  
  4. }  
    class Person
    {
        public Person(){}
    }

结构中只能定义新的构造函数,如果象上面那样覆盖无参构造函数,则会报错“ 结构不能包含显式的无参数构造函数”。

但是在结构中可以定义新的构造函数,如下所示

  1. struct SPerson          
  2.     {  
  3.         //public SPerson() { }  
  4.         public SPerson(string xname, int xage):this()  
  5.         {  
  6.             Name = xname;  
  7.             Age = xage;  
  8.         }  
  9.     }  
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)字段不能初始化

我们可以在类中定义字段,并定义初始值

  1. private string color = "黄色";  
private string color = "黄色";

 

这行代码若放在结构中,则会报错"结构中不能有实例字段初始值设定项".。但是如果字段被声明称const(常量)或者static(静态),则可以为其初始化。

3)结构是值类型,类是引用类型

类是引用类型,类的对象存储在堆中,结构是值类型,存储在栈中,这就意味着,在将一个类对象赋值给另外一个变量时,是引用传递,而将结构对象赋值给另外一个变量时则是复制传递。看下面的代码

  1. <pre class="csharp" name="code">Person p1 = new Person();  
  2. p1.Name = "yhb";  
  3. Console.WriteLine(p1.Name);  
  4. Person p2 = p1;  
  5. p2.Name = "bhy";  
  6. Console.WriteLine(p1.Name);</pre><br>  
  7. <pre></pre>  
  8. <p>首先声Person类的一个实例p1,然后为p1的Name属性赋值,然后将p1赋值给另外一个Person类型的变量p2,然后更改p2中Name属性的值,通过输出结果可以发现对象p1中Name属性的值也变化了。这就是引用传递,Person类型的变量p1和p2其实指向的同一个Person实例</p>  
  9. <p>如果将上面的代码改成结构呢?</p>  
  10. <pre class="csharp" name="code">SPerson sp = new SPerson();  
  11. sp.Name = "yhb";  
  12. Console.WriteLine(sp.Name);  
  13. SPerson sp1 = sp;  
  14. sp1.Name = "bhy";  
  15. Console.WriteLine(sp.Name);</pre>  
  16. <p>观察最后的输出结果,发现sp.Name的值并没有随着sp1.Name的改变而改变,这就是值传递的特点-复制传递:在将sp对象赋值给sp1时,其实是复制了一份给sp1。无论改变哪个,另外一个都不会受到影响。</p>  
  17. <p>4.结构不能被继承,可以把结构看成密封类(sealed)<br>  
  18. 5.使用结构的情形</p>  
  19. <p>首先确定一点,使用结构可以完成的功能,都可以通过类来实现,只有在使用轻量级数据时,我们才考虑使用结构,不严谨的说就是在类中的成员不是很多,且创建结构后就不再修改数据,这时候就可以考虑使用结构。<br>  
  20. </p>  
  21. <p><br>  
  22.  </p>  
  23. <p><br>  
  24.  </p>  
  25. <p><br>  
  26.  </p>  
  27. <p> </p>  
  28.      

  
  
[csharp] view plain copy print ?
  1. Person p1 = new Person();  
  2. p1.Name = "yhb";  
  3. Console.WriteLine(p1.Name);  
  4. Person p2 = p1;  
  5. p2.Name = "bhy";  
  6. Console.WriteLine(p1.Name);  


首先声Person类的一个实例p1,然后为p1的Name属性赋值,然后将p1赋值给另外一个Person类型的变量p2,然后更改p2中Name属性的值,通过输出结果可以发现对象p1中Name属性的值也变化了。这就是引用传递,Person类型的变量p1和p2其实指向的同一个Person实例

如果将上面的代码改成结构呢?

  1. SPerson sp = new SPerson();  
  2. sp.Name = "yhb";  
  3. Console.WriteLine(sp.Name);  
  4. SPerson sp1 = sp;  
  5. sp1.Name = "bhy";  
  6. Console.WriteLine(sp.Name);  
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.使用结构的情形

首先确定一点,使用结构可以完成的功能,都可以通过类来实现,只有在使用轻量级数据时,我们才考虑使用结构,不严谨的说就是在类中的成员不是很多,且创建结构后就不再修改数据,这时候就可以考虑使用结构。


 


 


 

 




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值