c#語言重點知識詳解(四:加框與解框) (轉)
第四章: 中的加框與去框
C# 執行時中有兩種型別:引用型別(reference)(在 C# 中用類宣告)和值型別(value)(在 C# 中用結構宣告)。引用和值型別在幾個重要方面有所不同。值型別“感覺上”象一個資料。它包括預定義數值型別(如int、bool)以及定義的型別(circle、Point等)。如上文所述,值型別的變數是實際的值,所以在您使用變數時,通常處理的是實際的值。
1>:首先,讓我們來看一看值型別(value)(在 C# 中用結構宣告)。
對於任何型別的非框機構都又如下的形。
//-------------------------------------
struct T_Point
{
T x,y;
T_Point(T x,y) {
this.x=x;
this.y=y
}
}
//-------------------------------------
sample:
class test{
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void Main()
{
Point p = new Point(10, 10);
f = p;
p.x = 20;
Console.Write(((Point)f).x);
Console.Write(p.x);
}
}
讓我麼來看一看最後的結果是什麼?結果是10,20.在第二次指定變數後,兩個獨立的變數包含相同的值。
修改 p 的值不會改變 f 的值.
2>:引用型別用於所有不能用作值型別的。引用型別的變數指向堆中物件的例項。這意味著在將一個變數指定
給另一個變數時,只是指定了引用,而不是值。
對於任何型別的框類都又如下的形。
//------------------------------------------------------
class T_Point
{
T x,y;
T_Point(T x,y) {
this.x=x;
this.y=y
}
}
//--------------------------------------------------------
class test{
class Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void Main()
{
Point p = new Point(10, 10);
object f = p;
p.x = 20;
Console.Write(((Point)f).x);
Console.Write(p.x);
}
}
讓我麼來看一看最後的結果是什麼?很奇怪嗎,結果是20,20.在第二次指定變數後,p 和 f 指向同一物件。這意味著修改 p 的名稱也將改變 f 的名稱,因為它們引用同一例項。修改類值的成員稱為“變更者”,而不具有任何變更者的類稱為不可變類。不可變類的存在可以使類的行為類似於值類,但不能寫入為值類。
在c#語言中同時使用引用和值兩種型別是很重要的。值型別輕便高效,而引用型別適用於物件導向的開發。但是,儘管我們有兩了種型別,但有時我們需要的是更為簡單的模型,使用單一的、能夠囊括所有可能值的型別。這樣一個通用基類能夠任何值的虛。寫入能夠任何值的集合類。為實現這一目的,c#語言執行時採用一種方法讓值型別在需要時轉化為引用型別,即透過稱為加框的程式。被加框的型別是通用基類,可以被各種型別的物件引用。
解框
int i = 123;
object k = i;// 將 int i 加框到物件 k 中
int j=(int)k; // 解框 k 到 value2
當賦值給 k 時,作為賦值的一部分,C# 將建立足夠容納堆中 int 的引用型別包裝,將值複製到該加框,然後將加框標記為實際型別,以便執行時瞭解加框的型別。要從加框中取值,必須使用強制型別裝換來指定加框的型別(物件能夠保留任何型別)。在過程中,執行時將檢查物件變數引用的型別是否為強制型別轉換
中指定的型別。如果型別正確,值將從加框中複製回值型別變數。如果型別不正確,將導致異常。請注意解除加框過程中不會進行其他轉換;型別必須完全匹配。
請注意以下程式碼:
long i = 123;
object k = i;// 將 long i 加框到物件 k 中
ulong j=(ulong)k;
#error
由於加框型別於解框型別的不同將出錯。如果認為像c++語言一樣下面的操作將正確那也是不對的。
long i = 123;
object k = i;
int j=(int)k;
#error
最後總結一下加框和解框。加框和解框使編寫和使用具有通用物件引數的函式變得簡單而直接。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-997844/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#重點知識詳解(二) (轉)C#
- C#重點知識詳解(一) (轉)C#
- C#有關介面的語法知識詳解C#
- Spring知識點詳解Spring
- 鴻蒙Navigation知識點詳解鴻蒙Navigation
- 加框和消框,C#型別系統的核心概念 (轉)C#型別
- 執行緒池知識點詳解執行緒
- 十七點學完安全知識超級詳細瞭解程式和病毒知識(轉)
- ASM 知識詳解ASM
- [01-jwt]C# JWT基礎知識詳解JWTC#
- Java培訓:Java四大知識點講解Java
- Java四大知識點講解,初學者必看!Java
- c# 知識點C#
- 詳解C#特性和反射(四)C#反射
- JavaScript進階知識點——函式和物件詳解JavaScript函式物件
- 十七點安全知識詳細瞭解程式和病毒
- Git基礎知識詳解Git
- Redis基礎知識詳解Redis
- Android 加密知識詳解Android加密
- 專案管理知識體系術語(四) (轉)專案管理
- react的詳細知識講解!React
- 【詳解】WebSocket相關知識整理Web
- Oracle-SQL知識詳解(一)OracleSQL
- 《圖解HTTP》知識點摘錄圖解HTTP
- 10分鐘詳解Spring全家桶7大知識點Spring
- 一萬三千字的HashMap面試必問知識點詳解HashMap面試
- 惡補基礎知識:Java 棧與佇列詳解Java佇列
- OCP知識點講解 之 LRU鏈與髒LRU鏈
- 詳解C#委託與事件C#事件
- OCP知識點講解 之 檢查點佇列與增量檢查點佇列
- [轉]反向代理過程與Nginx特點詳解Nginx
- IPv6基礎知識詳解
- 深入mysql基礎知識的詳解MySql
- Base64編碼知識詳解
- 字符集編碼知識詳解
- 詳解網路知識:iptables規則
- upload-labs通關詳解以及相關知識點
- 詳解 MySQL 面試核心知識點MySql面試