[csharp]
[csharp]
namespace _3._12強制類型轉換
{
/// <summary>
/// 將派生類的實例強制轉化為基類類型總是安全的。甚至也可以將派生類實例轉化為抽象基類類型。強制轉化為基類型以後,基引用就是派生類對象的基本部分的別名。
/// 將一個值類型強制轉化為一個基本接口具有不同的語義。將一個值類型強制轉化為一個接口類型時,創建一個不同的實體。接口是引用類型。無論何時將一個值類型
/// 強制轉化為引用類型,包括一個值類型轉化為一個接口,都會發生裝箱操縱。裝箱操作分配內存,並將該值類型復制到托管堆上。原始值和副本沒有關系,任何一個
/// 發生改變都不會影響另一個。
/// </summary>
public interface IAdd {
void Increment();
int Count
{
get;
}
}
public struct XStruct : IAdd {
private int propCount;
public void Increment() {
propCount++;
}
public int Count {
get {
return propCount;
}
}
}
public class Starter {
static void Main() {
XStruct xstruct = new XStruct();
xstruct.Increment();
IAdd obj = xstruct;
xstruct.Increment();
Console.WriteLine(xstruct.Count);//2
Console.WriteLine(obj.Count);//1
//說明obj和xstruct指向不同的實體obj=xstruct創建了一個副本。
//這是類類型很顯著的標志
IAdd boj2 = obj;
Console.WriteLine(obj.Count);//1
//說明obi和obj2指向同一個實體對象,obj=obj2是給obj賦值
//這是引用類型的和能顯著的標志
Console.ReadKey();
}
}
}
namespace _3._12強制類型轉換
{
/// <summary>
/// 將派生類的實例強制轉化為基類類型總是安全的。甚至也可以將派生類實例轉化為抽象基類類型。強制轉化為基類型以後,基引用就是派生類對象的基本部分的別名。
/// 將一個值類型強制轉化為一個基本接口具有不同的語義。將一個值類型強制轉化為一個接口類型時,創建一個不同的實體。接口是引用類型。無論何時將一個值類型
/// 強制轉化為引用類型,包括一個值類型轉化為一個接口,都會發生裝箱操縱。裝箱操作分配內存,並將該值類型復制到托管堆上。原始值和副本沒有關系,任何一個
/// 發生改變都不會影響另一個。
/// </summary>
public interface IAdd {
void Increment();
int Count
{
get;
}
}
public struct XStruct : IAdd {
private int propCount;
public void Increment() {
propCount++;
}
public int Count {
get {
return propCount;
}
}
}
public class Starter {
static void Main() {
XStruct xstruct = new XStruct();
xstruct.Increment();
IAdd obj = xstruct;
xstruct.Increment();
Console.WriteLine(xstruct.Count);//2
Console.WriteLine(obj.Count);//1
//說明obj和xstruct指向不同的實體obj=xstruct創建了一個副本。
//這是類類型很顯著的標志
IAdd boj2 = obj;
Console.WriteLine(obj.Count);//1
//說明obi和obj2指向同一個實體對象,obj=obj2是給obj賦值
//這是引用類型的和能顯著的標志
Console.ReadKey();
}
}
}
在C#中數據類型分為值類型和引用類型
值類型:結構體、枚舉
引用類型:類、接口、數組、委托
最後得出結論:
當我們聲明對象(s1、s2)是結構體類型時,對象是值類型,對象在棧中創建
當我們聲明對象(ic1、ic2)是接口類型時,對象是引用類型,對象在堆中創建