从C#2.0的角度看.NET 2.0类型系统
生活随笔
收集整理的這篇文章主要介紹了
从C#2.0的角度看.NET 2.0类型系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#中所有變量使用之前都必須初始化,否則編譯器會在初始化時產生一個編譯錯誤。
每個Windows線程都有一個私有的內存區塊,稱為棧;也就是說這塊內存塊不能被其他線程訪問(特定條件下除外)。什么條件?
線程的棧主要用于:
堆的優點是容量比棧大得多。為所有線程所共享。
棧的優點是速度比堆快。這主要源于專門訪問棧的IL指令,以及訪問棧上的元素無需同步。
因此,用堆來存儲大對象,用棧存儲小對象。。
C#中的值類型的實例使用靜態分配(分配在線程棧上),而引用類型的實例則使用動態分配(分配在進程堆中)。
結構、枚舉是值類型,委托是引用類型
如果某個類的實例有個值類型的字段,那么該字段會和類實例保存在一起,即堆中。反過來,如果一個結構的字段是引用類型,那么引用類型的實例還是會保存在堆中。
在C#中,求模運算也可以用于浮點數。
float a = 5.5f;
Console.WriteLine(a % 2.5);
屏幕上將輸出0.5。
C#語言提供了checked關鍵字,可以得到驗證所有的類型轉換和運算。如果有問題就會引發一個異常。
整形和decimal類型被零除時,會產生DivideByZeroException異常。
浮點型float和double被零除時,會得到無窮大,0/0得到Nan。
C#的遞增和遞減運算符也可以用于浮點數。
float a = 5.5f;
a++;
此時a = 6.5。
C#中的結構不能從其他類或者結構派生,也不能作為其他類型或結構的基類。
C#的結構可以有多個構造函數,當不允許自定義默認的構造函數(即沒有參數的構造函數)。而且編譯器要求每一個構造函數都初始化結構的所有字段。
默認構造函數將所有值類型的字段設為零,而將所有引用類型的字段設為空引用。
結構可以有自己的方法。
與類的字段不同,結構的字段不能在聲明中顯示初始化。
結構的實例常常存儲在棧中,因此結構不宜太大。太大的結構最好用類代替。
編譯器默認情況下,將枚舉的值視為int型整數。因此,枚舉定義的這組常數中任意一個值都是一個整數。可以對其進行遞增、遞減操作。
在默認情況下,枚舉的第一個值是0,之后的每一個值都是前一個值加1.當然,也可以手工指定自己想要的值。
你也可以定義其他類型的枚舉類型的值:
??? enum MakerCHB:byte{Beijing,Zhejiang}
??? enum MakerCHL:long{Beijing,Zhejiang}
可以讓一個枚舉的實例包含多個枚舉值。這個概念也稱為二進制位標志(binary flag)或者標志枚舉(flag enum).
注意,位域枚舉都打上了System.Flags attribute標志,該attribute通知CLR和客戶端這個枚舉用來表示位域而不是標準枚舉,這個枚舉用來表示位域而不是標準枚舉。這個標志會影響ToString()方法的結果。最好能有個實例!
.NET Framework中的System.Threading.ThreadState就是采用了二進制標志的枚舉。
C#中String類的實例是不可變。即無法修改它們,它們將保持通過構造函數所賦的值不變。
C#允許定義無轉義的字符串字面常量,方法就是在字符串起始的雙引號之前加入“@”符號。無轉義字符串字面常量具有以下特征:
通過不安全代碼也可以打破字符串實例的不可變特性。
C#允許用delegate關鍵字創建一種特殊的類,我們稱這種類為委托類。委托類的實例稱為委托對象。
委托對象是一種指向一個或多個方法(靜態或非靜態)的引用。我們可以像調用方法那樣“調用”委托對象,這其實就是調用委托對象所引用的方法。注意這些方法的調用是在調用委托的方法所在的線程中完成的,即同步調用。
委托變量所能引用的方法只能是其簽名式與委托類聲明中所提供的簽名式一致的方法。
delegate?void?Deleg1();
delegate?string?Deleg2(string?s);
delegate?void?f1()
{
}
static?string?f2(string?s)
{
}
Deleg1?d1?=?new?Deleg1(f1);???//?right
Deleg2?d2?=?new?Deleg2(f2);???//?right
Deleg2?d3?=?new?Deleg2(f1);???//?error C# 2.0編譯器引入在創建委托變量時推測其類型的功能。于是就可以直接將一個方法賦給隱式創建的對象。如
Deleg1 d1 = f1;
Deleg2 d2 = f2;
但是,其編譯生成的IL代碼,跟前面的是一樣的,它仍舊調用了Deleg1和Deleg2委托類的構造函數。
可以用一個委托對象應用多個具有相同簽名式的方法(靜態或非靜態)。這種情況下調用委托對象就會在調用對象的線程中順序執行所有的方法。調用方法的順序就是方法添加到委托對象中的順序,每個方法的參數都是一樣的。
如果委托的簽名具有返回值,那么引用多個方法時只有最后一個調用的方法的返回值才作為委托對象的返回值返回。
可以用GetInvocationList()獲取該委托對象中的委托列表。
可空類型System.Nullable<T>等價于T?。
??? 即int? i = null;和Nullable<int> i = null;是等價的。
不過,編譯器會阻止從可空類型到原始類型的隱式轉換。此外,不事先測試而進行可空類型到原始類型的顯示轉換也是危險的,因為,這可能會引發InvalidOperationException異常。
C# 2.0允許將類、結構和接口的聲明分散到多個源文件中。我們稱這一特性命名為部分類型。注意,委托類或者枚舉類是不能聲明在多個源文件中的。
同一個類型各個不同的部分定義前面必須都加partial關鍵字。而且,如果該類型是泛型的,那么類型參數的定義也必須出現在每個部分的部分定義上。每個部分定義上類型參數的名稱和位置必須完全一致。即在每個部分什么的class、struct或interface關鍵字之前加partial關鍵字。而且必須屬于同一個命名空間。
每個Windows線程都有一個私有的內存區塊,稱為棧;也就是說這塊內存塊不能被其他線程訪問(特定條件下除外)。什么條件?
線程的棧主要用于:
- 保存正在執行中的方法的傳入實參值;
- 保存方法返回是需要跳轉的本地代碼的地址;
- 保存對象(但不是全部)。
堆的優點是容量比棧大得多。為所有線程所共享。
棧的優點是速度比堆快。這主要源于專門訪問棧的IL指令,以及訪問棧上的元素無需同步。
因此,用堆來存儲大對象,用棧存儲小對象。。
C#中的值類型的實例使用靜態分配(分配在線程棧上),而引用類型的實例則使用動態分配(分配在進程堆中)。
結構、枚舉是值類型,委托是引用類型
如果某個類的實例有個值類型的字段,那么該字段會和類實例保存在一起,即堆中。反過來,如果一個結構的字段是引用類型,那么引用類型的實例還是會保存在堆中。
在C#中,求模運算也可以用于浮點數。
float a = 5.5f;
Console.WriteLine(a % 2.5);
屏幕上將輸出0.5。
C#語言提供了checked關鍵字,可以得到驗證所有的類型轉換和運算。如果有問題就會引發一個異常。
整形和decimal類型被零除時,會產生DivideByZeroException異常。
浮點型float和double被零除時,會得到無窮大,0/0得到Nan。
C#的遞增和遞減運算符也可以用于浮點數。
float a = 5.5f;
a++;
此時a = 6.5。
C#中的結構不能從其他類或者結構派生,也不能作為其他類型或結構的基類。
C#的結構可以有多個構造函數,當不允許自定義默認的構造函數(即沒有參數的構造函數)。而且編譯器要求每一個構造函數都初始化結構的所有字段。
默認構造函數將所有值類型的字段設為零,而將所有引用類型的字段設為空引用。
結構可以有自己的方法。
與類的字段不同,結構的字段不能在聲明中顯示初始化。
結構的實例常常存儲在棧中,因此結構不宜太大。太大的結構最好用類代替。
編譯器默認情況下,將枚舉的值視為int型整數。因此,枚舉定義的這組常數中任意一個值都是一個整數。可以對其進行遞增、遞減操作。
在默認情況下,枚舉的第一個值是0,之后的每一個值都是前一個值加1.當然,也可以手工指定自己想要的值。
你也可以定義其他類型的枚舉類型的值:
??? enum MakerCHB:byte{Beijing,Zhejiang}
??? enum MakerCHL:long{Beijing,Zhejiang}
可以讓一個枚舉的實例包含多個枚舉值。這個概念也稱為二進制位標志(binary flag)或者標志枚舉(flag enum).
注意,位域枚舉都打上了System.Flags attribute標志,該attribute通知CLR和客戶端這個枚舉用來表示位域而不是標準枚舉,這個枚舉用來表示位域而不是標準枚舉。這個標志會影響ToString()方法的結果。最好能有個實例!
.NET Framework中的System.Threading.ThreadState就是采用了二進制標志的枚舉。
C#中String類的實例是不可變。即無法修改它們,它們將保持通過構造函數所賦的值不變。
C#允許定義無轉義的字符串字面常量,方法就是在字符串起始的雙引號之前加入“@”符號。無轉義字符串字面常量具有以下特征:
- 它將接受所有字符作為字符串的內容,包括“\”反斜杠字符,不過不包括雙引號。
- 它將接受字符串中的所有換行。
通過不安全代碼也可以打破字符串實例的不可變特性。
C#允許用delegate關鍵字創建一種特殊的類,我們稱這種類為委托類。委托類的實例稱為委托對象。
委托對象是一種指向一個或多個方法(靜態或非靜態)的引用。我們可以像調用方法那樣“調用”委托對象,這其實就是調用委托對象所引用的方法。注意這些方法的調用是在調用委托的方法所在的線程中完成的,即同步調用。
委托變量所能引用的方法只能是其簽名式與委托類聲明中所提供的簽名式一致的方法。
delegate?void?Deleg1();
delegate?string?Deleg2(string?s);
delegate?void?f1()
{
}
static?string?f2(string?s)
{
}
Deleg1?d1?=?new?Deleg1(f1);???//?right
Deleg2?d2?=?new?Deleg2(f2);???//?right
Deleg2?d3?=?new?Deleg2(f1);???//?error C# 2.0編譯器引入在創建委托變量時推測其類型的功能。于是就可以直接將一個方法賦給隱式創建的對象。如
Deleg1 d1 = f1;
Deleg2 d2 = f2;
但是,其編譯生成的IL代碼,跟前面的是一樣的,它仍舊調用了Deleg1和Deleg2委托類的構造函數。
可以用一個委托對象應用多個具有相同簽名式的方法(靜態或非靜態)。這種情況下調用委托對象就會在調用對象的線程中順序執行所有的方法。調用方法的順序就是方法添加到委托對象中的順序,每個方法的參數都是一樣的。
如果委托的簽名具有返回值,那么引用多個方法時只有最后一個調用的方法的返回值才作為委托對象的返回值返回。
可以用GetInvocationList()獲取該委托對象中的委托列表。
可空類型System.Nullable<T>等價于T?。
??? 即int? i = null;和Nullable<int> i = null;是等價的。
不過,編譯器會阻止從可空類型到原始類型的隱式轉換。此外,不事先測試而進行可空類型到原始類型的顯示轉換也是危險的,因為,這可能會引發InvalidOperationException異常。
C# 2.0允許將類、結構和接口的聲明分散到多個源文件中。我們稱這一特性命名為部分類型。注意,委托類或者枚舉類是不能聲明在多個源文件中的。
同一個類型各個不同的部分定義前面必須都加partial關鍵字。而且,如果該類型是泛型的,那么類型參數的定義也必須出現在每個部分的部分定義上。每個部分定義上類型參數的名稱和位置必須完全一致。即在每個部分什么的class、struct或interface關鍵字之前加partial關鍵字。而且必須屬于同一個命名空間。
總結
以上是生活随笔為你收集整理的从C#2.0的角度看.NET 2.0类型系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: show controller e1
- 下一篇: git顶置文章