c#语言基础(6)----结构(struct)和类(class)的 区别

1,结构是值类型,类是引用类型

注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑                 处理,如:基本类型中int 对应的 system.Int32等都是结构)
        b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址
        c,结构和类的基类都是object,c#所有的类型的基类都是object
        d,虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有                 字段之前,字段将保持未赋值状态,且对象不可用

2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed
    类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承

注:结构可以使用和类相同的办法继承接口(有点奇怪)

3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以 没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。

下面是一个类和结构的例子:

  1. struct SPerson{
  2.     //public SPerson(){}//Error:结构不能包含显式的无参数构造函数
  3.     public SPerson(string name,int age)
  4.     {
  5.         this.name=name;
  6.         this.age=age;
  7.     }
  8.     //public int =2; //Error:类、结构或接口成员声明中的标记“=”无效
  9.     private string name;
  10.     private int age;
  11.     public string Name{get{return name;}set{name=value;}}
  12.     public int Age{get{return age;}set{this.age=value;}}
  13.     public override string ToString(){
  14.         return string.Format("Struct:Name:{0},Age:{1}",this.name,this.age);
  15.     }
  16. }
  17. class CPerson{
  18.     public CPerson(){}
  19.     
  20.     public CPerson(string name,int age){
  21.         this.name=name;
  22.         this.age=age;
  23.     }
  24.     
  25.     private string name;
  26.     private int age;
  27.     public string Name{get{return name;}set{name=value;}}
  28.     public int Age{get{return age;}set{age=value;}}
  29.     
  30.     public override string ToString(){
  31.         return string.Format("Class:Name:{0},Age:{1}",this.name,this.age);
  32.     }
  33. }
  1. public class MyClass{
  2.     public static void Main()
  3.     {
  4.         CPerson cp1=new CPerson("Zhang San",23);
  5.         SPerson sp1=new SPerson("Zhang San",23);
  6.         
  7.         Console.WriteLine("First Class:cp1:"+cp1.ToString());
  8.                 //输出:First Class:cp1:Name:Zhang San,Age:23
  9.         Console.WriteLine("First Struct: sp1:"+sp1.ToString());
  10.         //输出:First Struct: sp1:Name:Zhang San,Age:23
  11.         CPerson cp2=cp1;//cp2引用cp1
  12.         SPerson sp2=sp1;//cp2的值为cp1内的值  
  13.         Console.WriteLine("Second Class:cp2:"+cp2.ToString());
  14.                   //输出:Second Class:cp2:Name:Zhang San,Age:23
  15.         Console.WriteLine("Second Struct: sp2:"+sp2.ToString());
  16.         //输出:Second Struct: sp2:Name:Zhang San,Age:23
  17.         Console.ReadKey();
  18.         
  19.         Console.WriteLine("Change First Class And Struct:");
  20.                 //改变值:
  21.         cp1.Name="Wang Wu";
  22.         cp1.Age=100;
  23.         sp1.Name="Wang Wu";
  24.         sp1.Age=100;
  25.         Console.WriteLine("Afte Change first Class cp1:"+cp1.ToString());
  26.                  //输出:Afte Change first Class cp1: cp1:Name:Wang Wu,Age:100
  27.         Console.WriteLine("Afte Change first Struct sp1:"+sp1.ToString());
  28.                 //输出:Afte Change first Struct sp1:Name:Wang Wu,Age:100
  29.         Console.WriteLine("Afte Change First Class, Second Class cp2:"+cp2.ToString());
  30.                 //输出:Afte Change First Class, Second Class cp2:Name:Wang Wu,Age:100
  31.   //------------------------------------------------------------------------------------------------------------
  32.   //值类型:
  33.         Console.WriteLine("Afte Change First Struct, Second Struct sp2:"+sp2.ToString());
  34.                  //输出:AAfte Change First Struct, Second Struct sp2:Name:Zhang San,Age:23
  35.  //-------------------------------------------------------------------------------------------------------------
  36.         Console.ReadKey();      
  37.     }
  38. }

   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值