• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C# 程序員參考--結構教程

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    C# 程序員 參考--結構教程: 本教程介紹結構的語法和用法。它還涉及類與結構之間的重大差異。 示例文件 請參見“結構”示例以下載和生成本教程中討論的示例文件。 教程 此教程包括兩個示例。第一個示例向您展示如何聲明和使用結構,而第二個示例演示向方法傳
    C# 程序員參考--結構教程:

    本教程介紹結構的語法和用法。它還涉及類與結構之間的重大差異。

    示例文件

    請參見“結構”示例以下載和生成本教程中討論的示例文件。

    教程

    此教程包括兩個示例。第一個示例向您展示如何聲明和使用結構,而第二個示例演示向方法傳遞實例時結構和類之間的差異。還向您介紹下列主題:

    • 結構與類
    • 堆還是堆棧?
    • 構造函數和繼承
    • 結構上的屬性

    示例 1

    本示例聲明一個結構,它有三個成員:一個屬性、一個方法和一個私有字段。本示例創建該結構的一個實例,并將其投入使用:

    // struct1.csusing System;struct SimpleStruct{    private int xval;    public int X    {        get         {            return xval;        }        set         {            if (value < 100)                xval = value;        }    }    public void DisplayX()    {        Console.WriteLine("The stored value is: {0}", xval);    }}class TestClass{    public static void Main()    {        SimpleStruct ss = new SimpleStruct();        ss.X = 5;        ss.DisplayX();    }}

    輸出

    The stored value is: 5

    結構與類

    結構可能看似類,但存在一些重要差異,應引起注意。首先,類為引用類型,而結構為值類型。使用結構,您可以創建行為類似內置類型的對象,同時享有它們的好處。

    堆還是堆棧?

    在類上調用“新建”(New) 運算符時,它將在堆上進行分配。但是,當實例化結構時,將在堆棧上創建結構。這樣將產生性能增益。而且,您不會像對待類那樣處理對結構實例的引用。您將直接對結構實例進行操作。鑒于此原因,向方法傳遞結構時,結構將通過值傳遞,而不是作為引用傳遞。

    示例 2

    本示例展示當向方法傳遞結構時,將傳遞該結構的副本,而傳遞類實例時,將傳遞一個引用。

    // struct2.csusing 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

    代碼討論

    本示例的輸出表明:當向 classtaker 方法傳遞類實例時,只更改了類字段的值。但是向 structtaker 方法傳遞結構實例并不更改結構字段。這是因為向 structtaker 方法傳遞的是結構的副本,而向 classtaker 方法傳遞的是對類的引用。

    構造函數和繼承

    結構可以聲明構造函數,但它們必須帶參數。聲明結構的默認(無參數)構造函數是錯誤的。結構成員不能有初始值設定項??偸翘峁┠J構造函數以將結構成員初始化為它們的默認值。

    使用 New 運算符創建結構對象時,將創建該結構對象,并且調用適當的構造函數。與類不同的是,結構的實例化可以不使用 New 運算符。如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態,且對象不可用。

    對于結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。但是,結構從基類對象繼承。結構可實現接口,而且實現方式與類實現接口的方式完全相同。以下是結構實現接口的代碼片段:

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

    結構上的屬性

    通過使用屬性可以自定義結構在內存中的布局方式。例如,可以使用 StructLayout(LayoutKind.Explicit)FieldOffset 屬性創建在 C/C++ 中稱為聯合的布局方式。

    using System.Runtime.InteropServices;[StructLayout(LayoutKind.Explicit)]struct TestUnion {    [FieldOffset(0)]     public int i;    [FieldOffset(0)]     public double d;    [FieldOffset(0)]     public char c;    [FieldOffset(0)]     public byte b1;}

    在上一個代碼段中,TestUnion 的所有字段都從內存中的同一位置開始。

    以下是字段從其他顯式設置的位置開始的另一個示例:

    using System.Runtime.InteropServices;[StructLayout(LayoutKind.Explicit)]struct TestExplicit {    [FieldOffset(0)]     public long lg;    [FieldOffset(0)]     public int i1;    [FieldOffset(4)]     public int i2;    [FieldOffset(8)]     public double d;    [FieldOffset(12)]     public char c;    [FieldOffset(14)]     public byte b1;}

    i1i2 這兩個 int 字段共享與 lg 相同的內存位置。使用平臺調用時,這種結構布局控制很有用。

    結束語

    結構使用簡單,并且有時證明很有用。但要牢記:結構在堆棧中創建,并且您不是處理對結構的引用,而是直接處理結構。每當需要一種將經常使用的類型,而且大多數情況下該類型只是一些數據時,結構可能是最佳選擇。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>