日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

.NET引用类型与值类型

發(fā)布時(shí)間:2025/4/16 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET引用类型与值类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

值類(lèi)型和引用類(lèi)型的基類(lèi)
引用類(lèi)型和值類(lèi)型都繼承自System.Object類(lèi)。不同的是,幾乎所有的引用類(lèi)型都直接從System.Object繼承,而值類(lèi)型則繼承其子類(lèi),即直接繼承System.ValueType。
作為所有類(lèi)型的基類(lèi),System.Object提供了一組方法,這些方法在所有類(lèi)型中都能找到,其中包含toString方法及clone等方法。
System.ValueType直接繼承System.Object,
System.ValueType本身是一個(gè)類(lèi)類(lèi)型,而不是值類(lèi)型;System.ValueType
沒(méi)有添加任何成員,但覆蓋了所繼承的一些方法,使其更適合于值類(lèi)型。例如,ValueType重寫(xiě)了Equals()方法,從而對(duì)值類(lèi)型按照實(shí)例的值來(lái)比較,而不是引用地址來(lái)比較。

值類(lèi)型
值類(lèi)型的特性:
1.C#的所有值類(lèi)型均隱式派生自System.ValueType。
各個(gè)值類(lèi)型及其基類(lèi):
結(jié)構(gòu)體:struct(直接派生于System.ValueType);

數(shù)值類(lèi)型:
整型:
shortSystem.Int16),
ushortSystem.UInt16),intSystem.Int32),uintSystem.UInt32
longSystem.Int64),
ulongSystem.UInt64),
sbyte(System.SByte的別名),byteSystem.Byte),
字符型:charSystem.Char);
浮點(diǎn)型:floatSystem.Single),doubleSystem.Double);

用于財(cái)務(wù)計(jì)算的高精度decimaldecimalSystem.Decimal)。
bool
boolSystem.Boolean的別名);

枚舉:enum(派生于System.Enum);
可空類(lèi)型(派生于System.Nullable泛型結(jié)構(gòu)體,語(yǔ)法 T? 是 System.Nullable<T> 的簡(jiǎn)寫(xiě),此處的 T 為值類(lèi)型。)
2.每種值類(lèi)型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來(lái)初始化該類(lèi)型的默認(rèn)值。
例如:
int i = new int();
等價(jià)于:
Int32 i = new Int32();
等價(jià)于:
int i = 0;
等價(jià)于:
Int32 i = 0;

使用new運(yùn)算符時(shí),將調(diào)用特定類(lèi)型的默認(rèn)構(gòu)造函數(shù)并對(duì)變量賦以默認(rèn)值。在上例中,默認(rèn)構(gòu)造函數(shù)將值0賦給了i
3.所有的值類(lèi)型都是密封(seal)的,所以無(wú)法派生出新的值類(lèi)型。
4.
值類(lèi)型的實(shí)例通常是在線程棧上分配的(靜態(tài)分配),但是在某些情形下可以存儲(chǔ)在堆中。
引用類(lèi)型
引用類(lèi)型的特性:
1.
C#的所有引用類(lèi)型均隱式派生自System.object。
各個(gè)引用類(lèi)型及其基類(lèi):
數(shù)組:(派生于System.Array數(shù)組的元素,不管是引用類(lèi)型還是值類(lèi)型,都存儲(chǔ)在托管堆上
類(lèi):class(派生于System.Object);
接口:
interface(接口不是一個(gè)“東西”,所以不存在派生于何處的問(wèn)題。);
委托:
delegate(派生于System.Delegate);
object
System.Object的別名);

字符串:stringSystem.String的別名)。
2.引用類(lèi)型可以派生出新的類(lèi)型。
3.引用類(lèi)型可以包含null值。
4.
引用類(lèi)型變量的賦值只復(fù)制對(duì)對(duì)象的引用,而不復(fù)制對(duì)象本身。
5.引用類(lèi)型的對(duì)象總是在進(jìn)程堆中分配(動(dòng)態(tài)分配)。

值類(lèi)型和引用類(lèi)型的區(qū)別
所有繼承System.Value的類(lèi)型都是值類(lèi)型,其他類(lèi)型都是引用類(lèi)型。
引用類(lèi)型
可以派生出新的類(lèi)型,而值類(lèi)型不能;
引用類(lèi)型存儲(chǔ)在堆中,而值類(lèi)型既可以存儲(chǔ)在堆中也可以存儲(chǔ)在棧中。
引用類(lèi)型可以包含
null值,值類(lèi)型不能(可空類(lèi)型功能允許將 null 賦給值類(lèi)型);
引用類(lèi)型變量的賦值只復(fù)制對(duì)對(duì)象的引用,而不復(fù)制對(duì)象本身。
而將一個(gè)值類(lèi)型變量賦給另一個(gè)值類(lèi)型變量時(shí),將復(fù)制包含的值。
當(dāng)比較兩個(gè)值類(lèi)型時(shí),進(jìn)行的是內(nèi)容比較;而比較兩個(gè)引用類(lèi)型時(shí),進(jìn)行的是引用比較。
值類(lèi)型在內(nèi)存管理方面具有更好的效率,并且不支持多態(tài),適合用作存儲(chǔ)數(shù)據(jù)的載體;引用類(lèi)型支持多態(tài),適合用于定義應(yīng)用程序的行為。
Int[]是引用類(lèi)型還是值類(lèi)型
數(shù)組類(lèi)型是一族類(lèi)型,它們都繼承System.Array,而System.Array繼承自System.Object。所以所有的數(shù)組類(lèi)型都是引用類(lèi)型

以上收集自博客園:佳園,在此感謝!

下面補(bǔ)充一個(gè)實(shí)例

static void Main(string[] args)
??????? {
??????????? //C# intern pool 拘留池
??????????? string a = "abc";
??????????? string b = a;
??????????? string c = a;
??????????? int d = 10;
??????????? int e = d;
??????????? int f = e;
??????????? unsafe
??????????? {
??????????????? Console.WriteLine(getMemory(a));
??????????????? Console.WriteLine(getMemory(b));
??????????????? Console.WriteLine(getMemory(c));
??????????????? c = "abc";
??????????????? Console.WriteLine(getMemory(c));
??????????????? c = "abcd";//拘留池內(nèi)加入新的對(duì)象
??????????????? Console.WriteLine(getMemory(c));
??????????????? Console.WriteLine("-----------------------");
??????????????? Console.WriteLine(getMemory(d));
??????????????? Console.WriteLine(getMemory(e));
??????????????? Console.WriteLine(getMemory(f));
??????????????? f = 20;
??????????????? Console.WriteLine(getMemory(f));
??????????????? Console.WriteLine("-----------------------");
??????????????? int* g = &d;
??????????????? Console.WriteLine(getMemory(d));
??????????????? Console.WriteLine(getMemory(e));
??????????????? Console.WriteLine(getMemory(*g));
??????????????? Console.WriteLine(getMemory(10));//輸出地址都不同
??????????????? Console.ReadLine();
??????????? }
??????? }
??????? public static string getMemory(object o) // 獲取引用類(lèi)型的內(nèi)存地址方法
??{
???GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
???IntPtr addr = h.AddrOfPinnedObject();
???return "0x" + addr.ToString("X");
??}

轉(zhuǎn)載于:https://blog.51cto.com/5460095/1812197

總結(jié)

以上是生活随笔為你收集整理的.NET引用类型与值类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。