您的位置:首页 > 编程语言 > C#

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

2008-11-28 14:18 579 查看
1,结构是值类型,类是引用类型
注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑                 处理,如:基本类型中int 对应的 system.Int32等都是结构)        b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址        c,结构和类的基类都是object,c#所有的类型的基类都是object        d,虽然结构的初始化也使用了New
操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有                 字段之前,字段将保持未赋值状态,且对象不可用
2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed    类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:结构可以使用和类相同的办法继承接口(有点奇怪)
3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以 没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。
下面是一个类和结构的例子:
struct SPerson{
    //public SPerson(){}//Error:结构不能包含显式的无参数构造函数
    public SPerson(string name,int age)
    {
        this.name=name;
        this.age=age;
    }
    //public int =2; //Error:类、结构或接口成员声明中的标记“=”无效
    private string name;
    private int age;
    public string Name{get{return name;}set{name=value;}}
    public int Age{get{return age;}set{this.age=value;}}
    public override string ToString(){
        return string.Format("Struct:Name:{0},Age:{1}",this.name,this.age);
    }
}
class CPerson{

    public CPerson(){}
    
    public CPerson(string name,int age){
        this.name=name;
        this.age=age;
    }
    
    private string name;
    private int age;
    public string Name{get{return name;}set{name=value;}}
    public int Age{get{return age;}set{age=value;}}
    
    public override string ToString(){
        return string.Format("Class:Name:{0},Age:{1}",this.name,this.age);
    }
}
public class MyClass{

    public static void Main()
    {
        CPerson cp1=new CPerson("Zhang San",23);
        SPerson sp1=new SPerson("Zhang San",23);
        
        Console.WriteLine("First Class:cp1:"+cp1.ToString());
                //输出:First Class:cp1:Name:Zhang San,Age:23

        Console.WriteLine("First Struct: sp1:"+sp1.ToString());
        //输出:First Struct: sp1:Name:Zhang San,Age:23

        CPerson cp2=cp1;//cp2引用cp1
        SPerson sp2=sp1;//cp2的值为cp1内的值  

        Console.WriteLine("Second Class:cp2:"+cp2.ToString());
                  //输出:Second Class:cp2:Name:Zhang San,Age:23

        Console.WriteLine("Second Struct: sp2:"+sp2.ToString());
        //输出:Second Struct: sp2:Name:Zhang San,Age:23

        Console.ReadKey();
        
        Console.WriteLine("Change First Class And Struct:");

                //改变值:
        cp1.Name="Wang Wu";
        cp1.Age=100;
        sp1.Name="Wang Wu";
        sp1.Age=100;

        Console.WriteLine("Afte Change first Class cp1:"+cp1.ToString());
                 //输出:Afte Change first Class cp1: cp1:Name:Wang Wu,Age:100

        Console.WriteLine("Afte Change first Struct sp1:"+sp1.ToString());
                //输出:Afte Change first Struct sp1:Name:Wang Wu,Age:100

        Console.WriteLine("Afte Change First Class, Second Class cp2:"+cp2.ToString());
                //输出:Afte Change First Class, Second Class cp2:Name:Wang Wu,Age:100

  //------------------------------------------------------------------------------------------------------------
  //值类型:
        Console.WriteLine("Afte Change First Struct, Second Struct sp2:"+sp2.ToString());
                 //输出:AAfte Change First Struct, Second Struct sp2:Name:Zhang San,Age:23
 //-------------------------------------------------------------------------------------------------------------

        Console.ReadKey();      
    }
}

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: