<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 類型(C# 編程指南) ## 類型、變量和值 C# 是一種強類型語言。每個變量和常量都有一個類型,每個計算為值的表達式也是如此。每個方法簽名為每個輸入參數和返回值指定一個類型。.NET Framework 類庫定義了一組內置數值類型以及表示各種邏輯構造的更復雜的類型,例如文件系統、網絡連接、對象的集合和數組及日期。典型 C# 程序使用類庫中的類型,還使用為特定于該程序問題域的概念建模的用戶定義類型。 類型中存儲的信息可以包括: * 該類型的變量所需的存儲空間。 * 該類型可以表示的最大值和最小值。 * 該類型包含的成員(方法、字段、事件等)。 * 該類型所繼承的基類型。 * 將在運行時為其分配變量內存的位置。 * 允許的運算種類。 編譯器使用類型信息確保代碼中執行的所有運算都是類型安全的。例如,如果聲明了一個 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx) 類型的變量,則編譯器允許您在加法和減法運算中使用此變量。如果嘗試在一個 [bool](https://msdn.microsoft.com/zh-CN/library/c8f5xwh7.aspx) 類型的變量上執行相同的運算,則編譯器會產生錯誤,如下面的示例所示: ``` int a = 5; int b = a + 2; //OK bool test = true; // Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'. int c = a + test; ``` | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 請 C 和 C++ 開發人員注意,在 C# 中,[bool](https://msdn.microsoft.com/zh-CN/library/c8f5xwh7.aspx) 不能轉換為 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx)。 | 編譯器將類型信息作為元數據嵌入到可執行文件中。公共語言運行時 (CLR) 會在運行時使用該元數據,以進一步確保它在分配和回收內存時類型安全。 ### 在變量聲明中指定類型 在程序中聲明變量或常量時,必須指定其類型或者使用關鍵字 [var](https://msdn.microsoft.com/zh-CN/library/bb383973.aspx) 讓編譯器可以推斷其類型。下面的示例演示了一些使用內置數值類型和復雜的用戶定義類型的變量聲明: ``` // Declaration only: float temperature; string name; MyClass myClass; // Declaration with initializers (four examples): char firstLetter = 'C'; var limit = 3; int[] source = { 0, 1, 2, 3, 4, 5 }; var query = from item in source where item <= limit select item; ``` 在方法簽名中指定方法參數和返回值的類型。下面的簽名中演示的方法需要用 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx) 作為輸入參數并返回一個字符串: ``` public string GetName(int ID) { if (ID < names.Length) return names[ID]; else return String.Empty; } private string[] names = { "Spencer", "Sally", "Doug" }; ``` 聲明了一個變量后,不能使用新類型重新對它進行聲明,也不能向它賦與它的聲明類型不兼容的值。例如,不能聲明 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx),然后向它賦予布爾值 [true](https://msdn.microsoft.com/zh-CN/library/06d3w013.aspx)。但是,值可以轉換為其他類型,例如將值賦給新變量或者作為方法參數傳遞時。編譯器會自動執行不會導致數據丟失的類型轉換。可能導致數據丟失的轉換需要源代碼內有強制轉換。 有關詳細信息,請參閱 [強制轉換和類型轉換(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173105.aspx)。 ## 內置類型 C# 提供了一組標準的內置數值類型,用來表示整數、浮點值、布爾表達式、文本字符、十進制值和其他數據類型。還有內置的 **string** 和 **object** 類型。您可以在任何 C# 程序中使用這些類型。有關內置類型的更多信息,請參見[類型參考表(C# 參考)](https://msdn.microsoft.com/zh-CN/library/1dhd7f2x.aspx)。 ## 自定義類型 您可以使用 [struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx)、[class](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)、[interface](https://msdn.microsoft.com/zh-CN/library/87d83y5b.aspx) 和 [enum](https://msdn.microsoft.com/zh-CN/library/sbbt4032.aspx) 結構創建自己的自定義類型。.NET Framework 類庫本身是 Microsoft 提供的自定義類型的集合,您可以在自己的應用程序中使用它們。默認情況下,類庫中最常用的類型在所有 C# 程序中均可用。而對于其他類型,則僅當您顯式添加定義這些類型的程序集的項目引用后它們才可用。編譯器擁有對該程序集的引用后,才可以在源代碼中聲明在該程序集中聲明的類型的變量(和常量)。有關更多信息,請參見 [.NET Framework Class Library](http://go.microsoft.com/fwlink/?LinkID=217856)(.NET Framework 類庫)。 ## 通用類型系統 請務必了解有關 .NET Framework 中的類型系統的以下兩個基本點: * 它支持繼承原則。類型可從稱為基類型的其他類型派生。派生類型繼承基類型的方法、屬性和其他成員(存在一些限制)。之后,基類型可從某些其他類型派生,這種情況下,派生類型繼承其層次結構中這兩個基類型的成員。包括如 [System.Int32](https://msdn.microsoft.com/zh-CN/library/system.int32.aspx)(C# 關鍵字:[int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx))等內置數值類型在內的所有類型,最終都是從一個基類派生得到的,該基類即 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) (C# 關鍵字:[object](https://msdn.microsoft.com/zh-CN/library/9kkx3h3c.aspx))。這種統一的類型層次結構稱為[常規類型系統](https://msdn.microsoft.com/zh-CN/library/zcx1eb1e.aspx) (CTS)。有關 C# 中的繼承的更多信息,請參見[繼承(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx)。 * CTS 中的每一個類型都被定義成了值類型或引用類型。這包括 .NET Framework 類庫中的所有自定義類型以及您自己的用戶定義類型。使用關鍵字 [struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx) 定義的類型是值類型;所有內置數值類型都是 **structs**。使用關鍵字 [class](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx) 定義的類型是引用類型。引用類型和值類型有不同的編譯時規則和不同的運行時行為。 下圖演示了 CTS 中的值類型和引用類型之間的關系。 ![值類型和引用類型](https://i-msdn.sec.s-msft.com/dynimg/IC376130.jpeg "值類型和引用類型") CTS 中的值類型和引用類型 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 可以看到,最常用的類型都組織到了 [System](https://msdn.microsoft.com/zh-CN/library/system.aspx) 命名空間。但是,類型所在的命名空間與類型是值類型還是引用類型沒有關系。 | ### 值類型 值類型是從派生自 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 的 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 派生的。派生自 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 的類型在 CLR 中有特殊行為。值類型變量直接包含它們的值,這意味著內存在聲明變量的任意上下文中都是以內聯方式分配的。值類型變量沒有單獨的堆分配或垃圾回收開銷。 值類型分為兩個類別:[struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx) 和 [enum](https://msdn.microsoft.com/zh-CN/library/sbbt4032.aspx)。 內置數值類型是結構,它們具有可以訪問的屬性和方法。 ``` // Static method on type Byte. byte b = Byte.MaxValue; ``` 但是,您可以聲明它們并向它們賦值,就如同它們是簡單的非聚合類型一樣: ``` byte num = 0xA; int i = 5; char c = 'Z'; ``` 例如,值類型是密封的,這意味著您不能從 [System.Int32](https://msdn.microsoft.com/zh-CN/library/system.int32.aspx) 派生類型,并且不能定義一個結構以便從任何用戶定義的類或結構繼承,因為結構只能從 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 繼承。但是,一個結構可以實現一個或更多個接口。可以將結構類型強制轉換為接口類型;但這會使裝箱操作在托管堆上的一個引用類型對象內包裝該結構。在將值類型傳遞給將 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 作為輸入參數的方法時會發生裝箱操作。有關詳細信息,請參閱 [裝箱和取消裝箱(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/yz2be5wk.aspx)。 可以使用 [struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx) 關鍵字創建自己的自定義值類型。通常,結構可作為一小組相關變量的容器,如下面的示例所示: ``` public struct CoOrds { public int x, y; public CoOrds(int p1, int p2) { x = p1; y = p2; } } ``` 有關結構的更多信息,請參見[結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/saxz13w4.aspx)。有關 .NET Framework 中的值類型的更多信息,請參見[常規類型系統](https://msdn.microsoft.com/zh-CN/library/zcx1eb1e.aspx)。 另一類值類型是 [enum](https://msdn.microsoft.com/zh-CN/library/sbbt4032.aspx)。枚舉定義一組已命名的整數常量。例如,.NET Framework 類庫中的 [System.IO.FileMode](https://msdn.microsoft.com/zh-CN/library/system.io.filemode.aspx) 枚舉包含一組已命名的整數常量,用來指定應如何打開文件。其定義方式如下面的示例所示: ``` public enum FileMode { CreateNew = 1, Create = 2, Open = 3, OpenOrCreate = 4, Truncate = 5, Append = 6, } ``` **System.IO.FileMode.Create** 常數的值為 2。但是,在閱讀源代碼時,名稱可為人們提供更多信息,因此最好使用枚舉而不使用常量文本數字。有關詳細信息,請參閱 [System.IO.FileMode](https://msdn.microsoft.com/zh-CN/library/system.io.filemode.aspx)。 所有枚舉均是從繼承自 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 的 [System.Enum](https://msdn.microsoft.com/zh-CN/library/system.enum.aspx) 繼承的。所有適用于結構的規則同樣也適用于枚舉。有關枚舉的更多信息,請參見[枚舉類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/cc138362.aspx)。 ### 引用類型 定義為[類](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)、[委托](https://msdn.microsoft.com/zh-CN/library/900fyy8e.aspx)、數組或[接口](https://msdn.microsoft.com/zh-CN/library/87d83y5b.aspx)的類型是引用類型。 在運行時,當您聲明引用類型的變量時,該變量會一直包含值 [null](https://msdn.microsoft.com/zh-CN/library/edakx9da.aspx),直至您使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx) 運算符顯式創建對象的實例,或者為該變量分配已經在其他位置使用 new 創建的對象, 如下所示: ``` MyClass mc = new MyClass(); MyClass mc2 = mc; ``` 接口必須與實現它的類對象一起初始化。如果 MyClass 實現 IMyInterface,則您創建了 IMyInterface 的實例,如下面的示例所示: ``` IMyInterface iface = new MyClass(); ``` 創建對象時,將在托管堆上分配內存,變量只保存對對象位置的引用。對于托管堆上的類型,在 CLR 的自動內存管理功能(稱為“垃圾回收”)對它們進行分配和回收時都需要系統開銷。但是,也對垃圾回收進行了高度優化,在大多數情況下它不會引起性能問題。有關垃圾回收的更多信息,請參見[自動內存管理](https://msdn.microsoft.com/zh-CN/library/f144e03t.aspx)。 所有數組都是引用類型,即使其元素是值類型也不例外。數組是從 [System.Array](https://msdn.microsoft.com/zh-CN/library/system.array.aspx) 類隱式派生的,但可以通過 C# 提供的簡化語法來聲明和使用它們,如下面的示例所示: ``` // Declare and initialize an array of integers. int[] nums = { 1, 2, 3, 4, 5 }; // Access an instance property of System.Array. int len = nums.Length; ``` 引用類型完全支持繼承。創建類時,可以從沒有定義為 [sealed](https://msdn.microsoft.com/zh-CN/library/88c54tsw.aspx) 的任何其他接口或類繼承,而其他類則可以從您創建的類繼承并重寫虛方法。有關如何創建自己的類的更多信息,請參見[類和結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx)。有關繼承和虛方法的更多信息,請參見[繼承(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx)。 ## 文本值類型 在 C# 中,文本值從編譯器接收類型。您可以通過在數字末尾追加一個字母來指定應如何類型化該數字文本。例如,若要指定應按浮點數來處理值 4.56,則在該數字后追加一個“f”或“F”:4.56f。如果沒有追加字母,則編譯器將為該文本推斷一個類型。有關可以使用字母后綴指定的類型的更多信息,請參見[值類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/s1ax56ch.aspx)中各個類型的參考頁。 由于文本已類型化,且所有類型最終都是從 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 派生,因此您可以編寫和編譯如下所示的代碼: ``` string s = "The answer is " + 5.ToString(); // Outputs: "The answer is 5" Console.WriteLine(s); Type type = 12345.GetType(); // Outputs: "System.Int32" Console.WriteLine(type); ``` ## 泛型類型 一個類型可以通過一個或多個類型參數聲明,而這些類型參數作為客戶端代碼在創建該類型的實例時提供的實際類型(具體類型)的占位符。這種類型稱為“泛型類型”。例如,.NET Framework 類型 [System.Collections.Generic.List&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/6sh2ey19.aspx) 有一個類型參數,按照約定該類型參數的名稱為 T。在創建該類型的實例時,會指定列表將包含的對象的類型,例如字符串: ``` List<string> strings = new List<string>(); ``` 使用類型參數便可以重復使用相同的類存放任意類型的元素,而不必將每個元素都轉換為[對象](https://msdn.microsoft.com/zh-CN/library/9kkx3h3c.aspx)。泛型集合類稱為“強類型集合”,因為編譯器知道集合中元素的特定類型,舉例來說,如果嘗試向上面示例中的 strings 對象添加整數,編譯器會在編譯時引發錯誤。有關詳細信息,請參閱 [泛型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/512aeb7t.aspx)。 ## 隱式類型、匿名類型和可以為 null 的類型 如前面所述,您可以使用關鍵字 [var](https://msdn.microsoft.com/zh-CN/library/bb383973.aspx) 隱式類型化一個局部變量(非類成員)。該變量在編譯時仍然會接收一個類型,但該類型是由編譯器提供的。有關詳細信息,請參閱 [隱式類型的局部變量(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb384061.aspx)。 某些情況下為相關值的簡單集合創建命名類型是不方便的,因為這些相關值不準備在方法邊界外存儲或傳遞。可以創建匿名類型來實現此目的。有關更多信息,請參見[匿名類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb397696.aspx)。 普通的值類型不能有 [null](https://msdn.microsoft.com/zh-CN/library/edakx9da.aspx) 值。但是,可以通過在類型后面附加 **?** 來創建可以為 null 值的類型。例如,**int?** 是一個也可以具有 [null](https://msdn.microsoft.com/zh-CN/library/edakx9da.aspx) 值的 **int** 類型。在 CTS 中,可以為 null 的類型是泛型結構類型 [System.Nullable&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/b3h38hb0.aspx) 的實例。在向其數值可能為 null 的數據庫傳入數據和從中傳出數據時,可以為 null 的類型尤其有用。有關詳細信息,請參閱 [可以為 null 的類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/1t3y8s4s.aspx)。 ## 相關章節 有關詳細信息,請參閱下列主題: * [強制轉換和類型轉換(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173105.aspx) * [裝箱和取消裝箱(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/yz2be5wk.aspx) * [使用類型 dynamic(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/dd264736.aspx) * [值類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/s1ax56ch.aspx) * [引用類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/490f96s2.aspx) * [類和結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx) * [匿名類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb397696.aspx) * [泛型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/512aeb7t.aspx) * [Visual C# 2010 入門](http://go.microsoft.com/fwlink/?LinkId=221214) 中的[變量與表達式](http://go.microsoft.com/fwlink/?LinkId=221228) ## C# 語言規范 有關詳細信息,請參閱 [C# 語言規范](https://msdn.microsoft.com/zh-CN/library/ms228593.aspx)。該語言規范是 C# 語法和用法的權威資料。 ## 請參閱 [C# 參考](https://msdn.microsoft.com/zh-CN/library/618ayhy6.aspx) [C# 編程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [XML 數據類型的轉換](https://msdn.microsoft.com/zh-CN/library/15st98za.aspx) [整型表(C# 參考)](https://msdn.microsoft.com/zh-CN/library/exx3b86w.aspx)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看