C#面象对象学习:类(class)与结构(struct)

    技术2022-05-11  18

    根据C# programming reference给出来信息,Struct实质上还是用来实现轻量级别的类派用处的,这就意味着它还是可以有属性,方法(函数)以及标签等,唯一的区别在于,Struct在编程的时候不能由程序员申明构造函数,即使是默认(不带参数)的构造函数,同样也不能有析构的处理部分。这是因为Struct的构造函数是由编译器自动生成的。并且Struct的用途是那些描述轻量级的对象,例如Line,Point等,并且效率比较高。

    先举出微软提供的例子

    // Copyright (C) 2000 Microsoft Corporation.  All rights reserved. //  struct2.cs using  System; class  TheClass {    public int x;} struct  TheStruct {    public int x;} class  TestClass {    public static void structtaker(TheStruct s)    {        s.x = 5;    }    public static void classtaker(TheClass c)    {        c.x = 5;    }    public static void Main()    {        TheStruct a = new TheStruct();        TheClass b = new TheClass();        a.x = 1;        b.x = 1;        structtaker(a);        classtaker(b);        Console.WriteLine("a.x = {0}", a.x);        Console.WriteLine("b.x = {0}", b.x);    }}

    这个例子的输出是:

    a.x  =  1b.x  =   5

    从此列中可以看出结构和类的区别:        当一个结构被传递到一个方法时,被传递的只不过是一个副本(是值传递),而一个类被传递时,被传递的是一个参考(引用传递).所以a.x=输出的是1,不变,而b.x却变了.        结构可以不用new来实例化,而类却要.如果你不用new来实例化一个结构,那么所有的字段将仍然处于未分配状态,直到所有的字段被初始化.和类一样,结构可以执行接口(可以继承接口).更重要的是,结构没有继承性,一个结构不能从别的类继承,也不能是别的类的基类.

            结构可以继承接口,不能有protected 修饰符;可以不使用new 初始化  在结构中初始化实例字段是错误的;        可以不使用new 初始化;  在结构中初始化实例字段是错误的;        类必须用new初始化;讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:  1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些  2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。  3.在表现抽象和多级别的对象层次时,类是最好的选择  4.大多数情况下该类型只是一些数据时,结构时最佳的选择


    最新回复(0)