最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

重溫C#中的值類型和引用類型

2023-07-30 15:14 作者:Cpp程序員  | 我要投稿

在C#中,數(shù)據(jù)類型分為值類型引用類型兩種。 引用類型變量存儲(chǔ)的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中,而值類型變量直接存儲(chǔ)數(shù)據(jù)。對(duì)于引用類型,兩個(gè)變量可以引用同一個(gè)對(duì)象。因此,對(duì)一個(gè)變量的操作可能會(huì)影響另一個(gè)變量引用的對(duì)象。對(duì)于值類型,每個(gè)變量都有自己的數(shù)據(jù)副本,并且對(duì)一個(gè)變量的操作不可能影響另一個(gè)變量。

值類型(Value Type)

所有的值類型都繼承自ValueType類,它通過重載Object的虛方法來更好地適應(yīng)值類型。

雖然ValueType是值類型的隱式基類,但不能直接創(chuàng)建繼承自ValueType的類。?

值類型包含以下兩種:

  • ?結(jié)構(gòu)類型(Structure Type),用于封裝數(shù)據(jù)和相關(guān)的功能,包括自定義結(jié)構(gòu)體和內(nèi)置結(jié)構(gòu)體(如:整型、浮點(diǎn)類型、布爾型、字符型和值元組)

  • ?枚舉類型(Enum Type),由一組命名常量定義,表示一個(gè)選項(xiàng)或選項(xiàng)組合。

結(jié)構(gòu)類型直接繼承自System.ValueType,? 而枚舉類型則是繼承自System.Enum。

值類型是可以為空的,用System.Nullable<T>?(或T?)泛型類型來表示,如:int?、bool?。因此,System.Nullable<T>本身也是一種值類型。

public struct Nullable<T> where T : struct

可以使用Struct約束來指定一個(gè)類型參數(shù)是不可空的值類型(結(jié)構(gòu)類型和枚舉類型都滿足約束)。

值類型不能被繼承,因?yàn)樗兄殿愋妥罱K會(huì)編譯成終結(jié)類(sealed),但結(jié)構(gòu)體可以實(shí)現(xiàn)接口。

下面是一個(gè)自定義的結(jié)構(gòu)體:

public struct Location { ? ?public double X; ? ?public double Y; ? ?public Location(double x, double y) => (X, Y) = (x, y); }

?分別實(shí)例化具有相同數(shù)據(jù)的值對(duì)象a和b,進(jìn)行相等判斷,輸出結(jié)果如下:

var a = new Location(1, 2);var b = new Location(1, 2); Console.WriteLine(a.Equals(b)); // trueb.Y = 3; Console.WriteLine(a.Equals(b)); // false

由此可見:值類型相等比較的是數(shù)據(jù)本身。

引用類型(Reference Type)

最常見的引用類型就是類(class),? 還包括字符串、數(shù)組、委托、接口、記錄等。所有引用類型都繼承自O(shè)bject。

字符串(string):一種特殊的引用類型,它不能被繼承,具有不可變性,但用法上更像是值類型。

string a = "123";string b = a; a = "456"; Console.WriteLine(a); ?// "456"Console.WriteLine(b); ?// "123"

記錄(record):?C#9.0中引入,它不是一個(gè)新的語法,而是語法糖。用來定義一個(gè)引用類型,該類型提供內(nèi)置封裝數(shù)據(jù)功能。

public record Person(string FirstName, string LastName);

下面是一個(gè)自定義的類:

public class Location { ? ?public double X; ? ?public double Y; ? ?public Location(double x, double y) => (X, Y) = (x, y); }

同樣分別實(shí)例化具有相同數(shù)據(jù)的引用對(duì)象a和b,進(jìn)行相等判斷,輸出結(jié)果如下:

var a = new Location(1,2);var b = new Location(1,2);var c = b; Console.WriteLine(a == b); // falseConsole.WriteLine(a.Equals(b)); // falseConsole.WriteLine(b == c); // true

由此可見:引用類型相等比較的是引用地址,而不是數(shù)據(jù)本身。

值類型和引用類型比較

1.?值類型在結(jié)構(gòu)中是堆棧分配或內(nèi)聯(lián)分配的,引用類型是堆分配的。

2. 值類型變量賦值復(fù)制的是對(duì)象本身,而引用類型變量賦值復(fù)制的是對(duì)象的引用。

3. 值類型和引用類型最終都是繼承Object。

4. 值類型中的結(jié)構(gòu)體和引用類型都可以實(shí)現(xiàn)接口。

5. 值類型不能被繼承,因?yàn)樗兄殿愋投际莝ealed,而引用類型可以派生新的類型(string除外)。

6.?值類型在內(nèi)存管理方面具有更好的效率,適合用做存儲(chǔ)數(shù)據(jù)的載體。引用類型支持多態(tài),適合用于定義應(yīng)用程序的行為。


重溫C#中的值類型和引用類型的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
大足县| 鹤岗市| 凌海市| 平定县| 昌邑市| 聂拉木县| 二连浩特市| 区。| 鸡泽县| 奉贤区| 肇庆市| 沾益县| 澄城县| 东乡| 佛山市| 百色市| 比如县| 留坝县| 定州市| 林口县| 阿拉善盟| 杭锦旗| 沙河市| 铁力市| 闽侯县| 太仓市| 侯马市| 桃园市| 广丰县| 漠河县| 盘山县| 格尔木市| 大埔区| 巢湖市| 游戏| 布拖县| 修水县| 论坛| 潮州市| 新民市| 那曲县|