国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#中類和結構的區別!

2019-11-17 04:08:20
字體:
來源:轉載
供稿:網友
類和結構的區別


目錄:

Ø 類和結構的示例比較

Ø 類和結構的差別

Ø 如何選擇使用類還是使用結構


一 類和結構的示例比較
結構示例:

public struct Person

   {

       string Name;

       public int height;

       int weight;


       public bool overWeight()

       {

           //implement something

           return false;

       }

   }

類示例:

public class TestTime
{
    int hours;
    int minutes;
    int seconds;
   
    public void passtime()
    {
        //implementation of behavior
    }
}

調用過程

public class Test
{
    public static ovid Main
    {
        Person Myperson=new Person()      //聲明結構
        TestTime Mytime=New TestTime()    //聲明類
    }
}

從上面的例子中我們可以看到,類的聲明和結構的聲明非常類似,只是限定符后面是struct還是class的區別,而且使用時,定義新的結構和定義新的類的方法也非常類似。


二 類和結構的區別
1、值類型和引用類型


結構:結構是值類型;

值類型在堆棧上分配地址,所有的基類型都是結構類型,例如:int對應System.int32結構,string對應system.string結構 ,通過使用結構可以創建更多的值類型。

類:類是引用類型;

引用類型在堆上分配地址。


堆棧的執行效率要比堆的執行效率高,可是堆棧的資源有限,不適合處理大的邏輯復雜的對象。所以結構處理作為基類型對待的小對象,而類處理某個商業邏輯。


賦值操作,因為結構是值類型,所以結構之間的賦值可以創建新的結構,而類是引用類型,類之間的賦值只是復制引用。


說明:

u 雖然結構與類的類型不一樣,可是他們的基類型都是對象(object),C#中所有類型的基類型都是Object;

u 雖然結構的初始化也使用了new操作符可是結構對象依然分配在堆棧上而不是堆上;

u 結構的聲明:

Person Myperson=new Person()      //聲明結構
Person Myperson;

使用new關鍵后創建結構,調用結構的構造函數,對所有字段進行初始化操作(每個字段根據聲明的類型得到默認值);

如果不使用new,字段將保持未賦值狀態,且對象不可用。必須初始化所有的數據成員,對象才可用;不能通過屬性和方法進行初始化,因為在初始化所有的數據成員之前,沒用一個函數成員能被調用,所以,數據成員必須聲明為public的。


注意:當結構體中有屬性時,必須使用new來創建結構體變量

如:下面代碼會出錯,使用了未賦值的變量p

public struct Person

   {

       PRivate int age;


       public int Age

       {

           get { return age; }

           set { age = value; }

       }


   }


   class Program

   {

       static void Main(string[] args)

       {

           Person p;

           p.Age = 10;


       }

}

正確代碼:

public struct Person

   {

       private int age;


       public int Age

       {

           get { return age; }

           set { age = value; }

       }

       public Person(int age)

       {

           this.age = age;

       }

   }


   class Program

   {

       static void Main(string[] args)

       {

           Person p = new Person(10);

       }

   }

2、繼承性


結構:不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的用sealed聲明,可是結構是隱式的sealed。

類:完全可擴展的,除非顯示的聲明sealed,否則類可以繼承其他類和接口,自身也能被繼承。


說明:

雖然結構不能被繼承 可是結構能夠繼承接口,方法和類繼承接口一樣。


例如:結構實現接口

interface IImage
{
    void Paint();
}

struct Picture : IImage
{
    public void Paint()
    {
         // painting code goes here
    }
   
    private int x, y, z;
   // other struct members
}


3、內部結構


結構:

u 沒有默認的構造函數,但是可以添加構造函數

u 沒有析構函數

u 沒有abstract和sealed(因為不能繼承)

u 不能有protected修飾符(結構成員默認修飾符為私有,跟類相同)

u 可以不使用new初始化

u 在結構中初始化實例字段是錯誤的


類:

u 有默認的構造函數

u 有析構函數

u 可以使用abstract和sealed

u 有protected修飾符

u 必須使用new初始化

u 在類中可以初始化實例字段

三 如何選擇類還是結構
結構可以看作是輕量級的類,在性能上要好一點。

u 對于大量邏輯的對象,創建類要比創建結構好一些。

u 結構表示如點、矩形和顏色這樣的輕量對象,例如,如果聲明一個含有1000個點對象的數組,則將為引用每個對象分配附加的內存。在此情況下,結構的成本較低。

u 在表現抽象和多級別的對象層次時,類是最好的選擇。

u 大多數情況下該類型只是一些數據時,結構時最佳的選擇。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郸城县| 西藏| 海南省| 荥经县| 陵川县| 司法| 高尔夫| 岳池县| 鞍山市| 安丘市| 绵竹市| 吉木乃县| 沂水县| 赤城县| 民和| 五原县| 克山县| 马鞍山市| 屏东市| 个旧市| 丰镇市| 方城县| 高清| 肥东县| 湾仔区| 濉溪县| 云龙县| 凌源市| 佳木斯市| 象州县| 抚州市| 神农架林区| 治县。| 聊城市| 长兴县| 邮箱| 扎兰屯市| 绥滨县| 蛟河市| 平阴县| 义乌市|