標籤:col 應該 main eric reference 基礎 源碼 efi values
1、C#的實值型別
有幾個特點:
- 儲存在棧裡
- 基於實值型別的變數直接包含值(實值型別儲存實際值)。 將一個實值型別變數賦給另一個實值型別變數時,將複製包含的值。 這與參考型別變數的賦值不同,參考型別變數的賦值只複製對對象的引用,而不複製對象本身。
- 所有的實值型別均隱式派生自 System.ValueType。
- 與參考型別不同,不能從實值型別派生出新的類型。 但與參考型別相同的是,結構也可以實現介面。
- 與參考型別不同,實值型別無法包含 null 值。 但是,可為 Null 的型別 功能允許實值型別分配給 null。
- 每種實值型別均有一個隱式的預設建構函式來初始化該類型的預設值。
實值型別分為兩類: struct( 結構 )、 enum(枚舉 )
struct( 結構 )分為以下幾類:
Numeric(數值)類型
bool
使用者定義的結構。
下表列出了 C# 中內建類型中可用的實值型別:
| 類型 |
描述 |
範圍 |
預設值 |
| bool |
布爾值 |
True 或 False |
False |
| byte |
8 位不帶正負號的整數 |
0 到 255 |
0 |
| char |
16 位 Unicode 字元 |
U +0000 到 U +ffff |
‘\0‘ |
| decimal |
128 位精確的十進位值,28-29 有效位元 |
(-7.9 x 1028 到 7.9 x 1028) / 100 到 28 |
0.0M |
| double |
64 位元雙精確度浮點型 |
(+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 |
0.0D |
| float |
32 位單精確度浮點型 |
-3.4 x 1038 到 + 3.4 x 1038 |
0.0F |
| int |
32 位有符號整數類型 |
-2,147,483,648 到 2,147,483,647 |
0 |
| long |
64 位元有符號整數類型 |
-923,372,036,854,775,808 到 9,223,372,036,854,775,807 |
0L |
| sbyte |
8 位有符號整數類型 |
-128 到 127 |
0 |
| short |
16 位有符號整數類型 |
-32,768 到 32,767 |
0 |
| uint |
32 位不帶正負號的整數類型 |
0 到 4,294,967,295 |
0 |
| ulong |
64 位元不帶正負號的整數類型 |
0 到 18,446,744,073,709,551,615 |
0 |
| ushort |
16 位不帶正負號的整數類型 |
0 到 65,535 |
0 |
實際上是簡單類型,所有的簡單類型(C# 語言的組成部分)均為 .NET Framework 系統類別型的別名。 例如,int 是 System.Int32 的別名。可使用文字初始化簡單類型。 例如,“A”是 char 類型的文字,而 2001 是 int 類型的文字。如需得到一個類型或一個變數在特定平台上的準確尺寸,可以使用 sizeof 方法。運算式 sizeof(type) 產生以位元組為單位儲存物件或類型的儲存尺寸。下面舉例擷取任何機器上 int 類型的儲存尺寸:
1 namespace DataTypeApplication 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Console.WriteLine("Size of int: {0}", sizeof(int)); 8 Console.ReadLine(); 9 }10 }11 }
當上面的代碼被編譯和執行時,它會產生下列結果:
Size of int: 4
2、 C# 的 struct
struct(結構)通常用作一小組相關變數的容器,在 C# 中它使得一個單一變數可以儲存各種資料類型的相關資料。struct 關鍵字用於建立結構體,可以按照如下的方式聲明 Person結構:
1 struct Person2 {3 public string name;4 public int age;5 public string sex;6 };
下面的程式示範了結構的用法:
using System;
namespace MyStruct
{
struct Person
{
public string name;
public int age;
public string sex;
}
class Program
{
static void Main(string[] args)
{
Person person1;
person1.name = "張三";
person1.age = 18;
person1.sex = "男";
Person person2;
person2.name = "李四";
person2.age = 20;
person2.sex = "男";
//輸出 person1 的資訊
Console.WriteLine("person1 姓名:{0}", person1.name);
Console.WriteLine("person1 性別:{0}", person1.sex);
Console.WriteLine("person1 年齡:{0}", person1.age);
//輸出 person2 的資訊
Console.WriteLine("person2 姓名:{0}", person2.name);
Console.WriteLine("person2 性別:{0}", person2.sex);
Console.WriteLine("person2 年齡:{0}", person2.age);
Console.Read();
}
}
}
當上面的代碼被編譯和執行時,它會產生下列結果:
person1 姓名:張三person1 性別:男person1 年齡:18person2 姓名:李四person3 性別:男person4 年齡:20
結構與類具有許多相同的文法,但結構比類受到的限制更多:
- 結構可帶有方法、欄位、索引、屬性、運算子方法和事件。
- 結構不能聲明預設建構函式(沒有參數的建構函式)或終結器。
- 結構可以聲明具有參數的建構函式。
- 一個結構無法繼承自另一個結構或類,並且它不能為類的基類。
- 結構可實現一個或多個介面。
- 結構成員不能指定為 abstract、virtual 或 protected。
- 與類不同,無需使用 new 運算子即可對結構進行執行個體化。
- 如果不使用 New 操作符,只有在所有的欄位都被初始化之後,欄位才被賦值,對象才被使用。
多提一下:可將結構類型強制轉換為介面類型,這將導致“裝箱”操作,以將結構封裝在託管堆上的參考型別對象內。 當將實值型別傳遞到接受 Object 作為輸入參數的方法時,將發生裝箱操作。詳細的會在後面裝箱和unboxing說明。
C# 的 enum
枚舉類型(也稱為枚舉)為定義一組可以賦給變數的命名整數常量提供了一種有效方法。 例如,假設您必須定義一個變數,該變數的值表示一周中的一天。 該變數只能儲存七個有意義的值。 若要定義這些值,可以使用枚舉類型。枚舉類型是使用 enum 關鍵字聲明的:
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
預設情況下,枚舉中每個元素的基礎類型是 int。 可以使用冒號指定另一種整數實值型別,如前面的樣本所示。准許使用的類型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。
通常情況下,最好是在命名空間內直接定義枚舉,以便該命名空間中的所有類都能夠同樣方便地訪問它。 但是,還可以將枚舉嵌套在類或結構中。
預設情況下,第一個枚舉數的值為 0,後面每個枚舉數的值依次遞增 1。 例如,下面的枚舉,Sat 是 0,Sun 是 1,Mon 是 2 等。
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
如下面的樣本所示枚舉數可用初始值來重寫預設值。
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
在此枚舉中,強制元素序列從 1 而不是 0 開始。 但是,一般建議這樣使用。注,枚舉數的名稱中不能包含空白。
如果變數 meetingDay 的類型為 Days,則只能將 Days 定義的某個值賦給它(無需顯式強制轉換)。 如果會議日期更改,可以將 Days 中的新值賦給 meetingDay:
Days meetingDay = Days.Monday;//...meetingDay = Days.Friday;
可以將任意整數值賦給 meetingDay。 例如,程式碼 meetingDay = (Days) 42 不會產生錯誤。 但也不應該這樣做,因為預設約定的是枚舉變數只容納枚舉定義的值之一。 將任意值賦給枚舉類型的變數很有可能會導致錯誤。
下面的執行個體示範了枚舉變數的用法:
using System;namespace MyEnum{ class Program { enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat }; static void Main(string[] args) { int WeekdayStart = (int)Days.Mon; int WeekdayEnd = (int)Days.Fri; Console.WriteLine("Monday: {0}", WeekdayStart); Console.WriteLine("Friday: {0}", WeekdayEnd); Console.Read(); } }}
當上面的代碼被編譯和執行時,它會產生下列結果:
Monday: 1Friday: 5
項目源碼下載:https://pan.baidu.com/s/1miOPAdU
5、C#基礎 - C#的實值型別