最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中值類(lèi)型和引用類(lèi)型的使用與比較

 更新時(shí)間:2023年07月30日 08:39:32   作者:天行健君子以自強(qiáng)  
在C#中,數(shù)據(jù)類(lèi)型分為值類(lèi)型和引用類(lèi)型兩種,引用類(lèi)型變量存儲(chǔ)的是數(shù)據(jù)的引用,而值類(lèi)型變量直接存儲(chǔ)數(shù)據(jù),下面小編就來(lái)和大家講講這二者的使用與區(qū)別吧

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

值類(lèi)型(Value Type)

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

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

值類(lèi)型包含以下兩種:

  •  結(jié)構(gòu)類(lèi)型(Structure Type),用于封裝數(shù)據(jù)和相關(guān)的功能,包括自定義結(jié)構(gòu)體和內(nèi)置結(jié)構(gòu)體(如:整型、浮點(diǎn)類(lèi)型、布爾型、字符型和值元組)
  •  枚舉類(lèi)型(Enum Type),由一組命名常量定義,表示一個(gè)選項(xiàng)或選項(xiàng)組合。

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

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

public struct Nullable<T> where T : struct

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

值類(lèi)型不能被繼承,因?yàn)樗兄殿?lèi)型最終會(huì)編譯成終結(jié)類(lèi)(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é)果如下。由此可見(jiàn):值類(lèi)型相等比較的是數(shù)據(jù)本身。

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

引用類(lèi)型(Reference Type)

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

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

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

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

public record Person(string FirstName, string LastName);

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

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é)果如下。由此可見(jiàn):引用類(lèi)型相等比較的是引用地址,而不是數(shù)據(jù)本身。

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

值類(lèi)型和引用類(lèi)型比較

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

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

3. 值類(lèi)型和引用類(lèi)型最終都是繼承Object。

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

5. 值類(lèi)型不能被繼承,因?yàn)樗兄殿?lèi)型都是sealed,而引用類(lèi)型可以派生新的類(lèi)型(string除外)。

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

到此這篇關(guān)于C#中值類(lèi)型和引用類(lèi)型的使用與比較的文章就介紹到這了,更多相關(guān)C#值類(lèi)型 引用類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

辽源市| 濮阳市| 临沧市| 额济纳旗| 珲春市| 鹰潭市| 视频| 兴仁县| 阜平县| 新乡市| 永年县| 舒兰市| 正镶白旗| 类乌齐县| 莫力| 禄劝| 平和县| 万安县| 驻马店市| 来宾市| 二连浩特市| 廉江市| 乐山市| 同心县| 永修县| 保定市| 石门县| 玉门市| 鹤壁市| 沙田区| 织金县| 忻城县| 宿州市| 宝兴县| 阳春市| 丰原市| 新沂市| 新巴尔虎右旗| 长乐市| 天水市| 海盐县|