欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中值類型和引用類型的使用與比較

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

在C#中,數(shù)據(jù)類型分為值類型引用類型兩種。 引用類型變量存儲(chǔ)的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中,而值類型變量直接存儲(chǔ)數(shù)據(jù)。對于引用類型,兩個(gè)變量可以引用同一個(gè)對象。因此,對一個(gè)變量的操作可能會(huì)影響另一個(gè)變量引用的對象。對于值類型,每個(gè)變量都有自己的數(shù)據(jù)副本,并且對一個(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ù)的值對象a和b,進(jìn)行相等判斷,輸出結(jié)果如下。由此可見:值類型相等比較的是數(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

引用類型(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ù)的引用對象a和b,進(jìn)行相等判斷,輸出結(jié)果如下。由此可見:引用類型相等比較的是引用地址,而不是數(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

值類型和引用類型比較

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

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

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

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

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

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

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

相關(guān)文章

  • C# IQueryable<T>揭開表達(dá)式樹的神秘面紗

    C# IQueryable<T>揭開表達(dá)式樹的神秘面紗

    這篇文章主要介紹了C# IQueryable<T>表達(dá)式樹,對IQueryable<T>感興趣的同學(xué),必須要仔細(xì)看一下
    2021-04-04
  • C#客戶端程序Visual Studio遠(yuǎn)程調(diào)試的方法詳解

    C#客戶端程序Visual Studio遠(yuǎn)程調(diào)試的方法詳解

    這篇文章主要給大家介紹了關(guān)于C#客戶端程序Visual Studio遠(yuǎn)程調(diào)試的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • C#使用OleDb操作Excel和數(shù)據(jù)庫的策略

    C#使用OleDb操作Excel和數(shù)據(jù)庫的策略

    在C#編程中,使用OleDb可以方便地實(shí)現(xiàn)對Excel文件和數(shù)據(jù)庫的操作,本文探討了在C#中使用OleDb技術(shù)操作Excel和數(shù)據(jù)庫的策略,文章詳述了OleDb的定義、配置環(huán)境的步驟,并通過實(shí)際代碼示例演示了如何高效讀寫Excel文件和交互數(shù)據(jù)庫,需要的朋友可以參考下
    2024-05-05
  • WPF中窗體最大化問題的解決方法

    WPF中窗體最大化問題的解決方法

    這篇文章主要給大家介紹了關(guān)于WPF中窗體最大化問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用wpf具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • C#動(dòng)態(tài)執(zhí)行字符串(動(dòng)態(tài)創(chuàng)建代碼)的實(shí)例代碼

    C#動(dòng)態(tài)執(zhí)行字符串(動(dòng)態(tài)創(chuàng)建代碼)的實(shí)例代碼

    在編寫C#程序的時(shí)候,有時(shí)我們需要?jiǎng)討B(tài)生成一些代碼并執(zhí)行。然而C#不像JavaScript有一個(gè)Eval函數(shù),可以動(dòng)態(tài)的執(zhí)行代碼。所有這些功能都要我們自己去完成
    2013-03-03
  • C# WinForm編程獲取文件物理路徑的方法

    C# WinForm編程獲取文件物理路徑的方法

    這篇文章主要介紹了C# inForm編程獲取文件物理路徑的方法,獲取的物理路徑是軟件即軟件安裝所在目錄,需要的朋友可以參考下
    2014-08-08
  • C# Console類的具體用法

    C# Console類的具體用法

    這篇文章主要介紹C# Console類的具體用法,需要的朋友可以參考下
    2013-03-03
  • C# swagger ui增加訪問限制方式

    C# swagger ui增加訪問限制方式

    本文介紹了如何在C#中使用Swagger UI并增加訪問限制,通過創(chuàng)建`SwaggerBasicAuthMiddleware`類和`MiddlewareExtension`類,并在`Startup.cs`的`Configure`方法中注入`app.UseSwaggerBasicAuth()`,從而實(shí)現(xiàn)對Swagger頁面的訪問控制
    2025-02-02
  • 淺談C#中HttpWebRequest與HttpWebResponse的使用方法

    淺談C#中HttpWebRequest與HttpWebResponse的使用方法

    本篇文章主要介紹了淺談C#中HttpWebRequest與HttpWebResponse的使用方法,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • C#使用加邊法計(jì)算行列式的值

    C#使用加邊法計(jì)算行列式的值

    這篇文章主要介紹了C#使用加邊法計(jì)算行列式的值,實(shí)例分析了C#加邊法計(jì)算行列式的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08

最新評論