1、C#的值類型 有幾個特點: 存儲在棧里 基於值類型的變數直接包含值(值類型存儲實際值)。 將一個值類型變數賦給另一個值類型變數時,將複製包含的值。 這與引用類型變數的賦值不同,引用類型變數的賦值只複製對對象的引用,而不複製對象本身。 所有的值類型均隱式派生自 System.ValueType。 ...
有幾個特點:
- 存儲在棧里
- 基於值類型的變數直接包含值(值類型存儲實際值)。 將一個值類型變數賦給另一個值類型變數時,將複製包含的值。 這與引用類型變數的賦值不同,引用類型變數的賦值只複製對對象的引用,而不複製對象本身。
- 所有的值類型均隱式派生自 System.ValueType。
- 與引用類型不同,不能從值類型派生出新的類型。 但與引用類型相同的是,結構也可以實現介面。
- 與引用類型不同,值類型無法包含 null 值。 但是,可以為 null 的類型 功能允許值類型分配給 null。
- 每種值類型均有一個隱式的預設構造函數來初始化該類型的預設值。
值類型分為兩類: struct( 結構 )、 enum(枚舉 )
struct( 結構 )分為以下幾類:
-
Numeric(數值)類型
-
整型
-
浮點型
-
decimal
-
-
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
struct(結構)通常用作一小組相關變數的容器,在 C# 中它使得一個單一變數可以存儲各種數據類型的相關數據。struct 關鍵字用於創建結構體,可以按照如下的方式聲明 Person結構:
1 struct Person 2 { 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 年齡:18 person2 姓名:李四 person3 性別:男 person4 年齡:20
結構與類具有許多相同的語法,但結構比類受到的限制更多:
- 結構可帶有方法、欄位、索引、屬性、運算符方法和事件。
- 結構不能聲明預設構造函數(沒有參數的構造函數)或終結器。
- 結構可以聲明具有參數的構造函數。
- 一個結構無法繼承自另一個結構或類,並且它不能為類的基類。
- 結構可實現一個或多個介面。
- 結構成員不能指定為 abstract、virtual 或 protected。
- 與類不同,無需使用 new 運算符即可對結構進行實例化。
- 如果不使用 New 操作符,只有在所有的欄位都被初始化之後,欄位才被賦值,對象才被使用。
多提一下:可將結構類型強制轉換為介面類型,這將導致“裝箱”操作,以將結構包裝在托管堆上的引用類型對象內。 當將值類型傳遞到接受 Object 作為輸入參數的方法時,將發生裝箱操作。詳細的會在後面裝箱和取消裝箱說明。
枚舉類型(也稱為枚舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。 例如,假設您必須定義一個變數,該變數的值表示一周中的一天。 該變數只能存儲七個有意義的值。 若要定義這些值,可以使用枚舉類型。枚舉類型是使用 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: 1 Friday: 5
項目源碼下載:https://pan.baidu.com/s/1miOPAdU