欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#中readonly特性聲明字段只讀技術(shù)文檔

admin
2023年10月30日 11:16 本文熱度 715

在C#中,readonly特性用于聲明一個(gè)只讀字段。一個(gè)只讀字段可以在聲明時(shí)或在構(gòu)造函數(shù)內(nèi)部進(jìn)行初始化,一旦被賦予了初始值,它就不能被改變。

使用

下面是使用 readonly 特性的基本語法:

public readonly int MyField;

您也可以在構(gòu)造函數(shù)中初始化只讀字段,如下所示:

public class MyClass
{
    public readonly int MyField;

    public MyClass(int value)
    {
        MyField = value;
    }
}

注意事項(xiàng)

  • 只讀字段只能在聲明或者構(gòu)造函數(shù)中賦值。
  • 只讀字段的值不能更改,相當(dāng)于常量,但常量在編譯時(shí)需要初始化,只讀字段則在運(yùn)行時(shí)初始化。
  • 只讀字段可以具有不同的值,取決于所用的構(gòu)造函數(shù)來創(chuàng)建對(duì)象。
  • 靜態(tài)只讀字段在運(yùn)行時(shí)初始化,其初始化發(fā)生在靜態(tài)構(gòu)造函數(shù)中(如果存在)或者在出現(xiàn)此類的任何其他靜態(tài)成員之前。

注意:對(duì)于引用類型,readonly修飾符僅防止修改字段本身的值,而不是防止修改字段引用的對(duì)象。換句話說,你不能更改引用字段的指向,但是可以更改該字段指向的對(duì)象的屬性或方法。

readonly修飾的字段GC如何處理它

垃圾收集器(GC)對(duì) readonly 修飾的字段無特殊處理。只讀性質(zhì)并不影響對(duì)象的垃圾回收。

垃圾回收主要基于一個(gè)對(duì)象是否還被引用來決定是否進(jìn)行回收。如果一個(gè)對(duì)象不再被任何其他對(duì)象引用,那么它就會(huì)被 GC 標(biāo)記為可回收。當(dāng) GC 運(yùn)行時(shí),這些標(biāo)記為可回收的對(duì)象將被清理掉,釋放其占用的內(nèi)存資源。

而對(duì)于 readonly 字段,它僅僅是限制了該字段的修改,也就是說一旦字段被初始化后,字段本身的值是不可以被改變的。然而這并不影響其所引用的對(duì)象在內(nèi)存中的生命周期,也不影響垃圾回收的機(jī)制。

如果一個(gè) readonly 字段所引用的對(duì)象不再被其他對(duì)象引用,那么這個(gè)對(duì)象同樣會(huì)被標(biāo)記為可回收,并在 GC 運(yùn)行時(shí)被清理。

readonly修飾的字段內(nèi)存分配在哪里

在C#中,readonly關(guān)鍵字修飾的字段的內(nèi)存分配位置取決于它是否被聲明為靜態(tài)(static)。

  • 如果readonly字段是實(shí)例字段(非靜態(tài)),那么它的內(nèi)存將會(huì)在堆上分配,作為創(chuàng)建對(duì)象實(shí)例時(shí)分配的一部分。每個(gè)對(duì)象實(shí)例都有自己的readonly實(shí)例字段副本。
  • 如果readonly字段是靜態(tài)字段,那么它的內(nèi)存將會(huì)在高頻堆(High Frequency Heap)上分配,此處用于存儲(chǔ)所有的靜態(tài)數(shù)據(jù)。所有實(shí)例共享一個(gè)readonly靜態(tài)字段。

無論是靜態(tài)還是非靜態(tài)的 readonly 字段,都只能在聲明時(shí)或在相應(yīng)的構(gòu)造函數(shù)中初始化。對(duì)于靜態(tài) readonly 字段,這通常發(fā)生在靜態(tài)構(gòu)造函數(shù)或者第一次引用類之前。對(duì)于非靜態(tài) readonly 字段,它們?cè)趯?shí)例構(gòu)造函數(shù)中初始化。

下面是一個(gè)代碼示例:

public class MyClass
{
    public readonly int InstanceField;  // 在堆上分配內(nèi)存
    public static readonly int StaticField;  // 在高頻堆上分配內(nèi)存

    public MyClass(int value)
    {
        InstanceField = value;
    }

    // 靜態(tài)構(gòu)造函數(shù)
    static MyClass()
    {
        StaticField = 10;
    }
}

readonly線程安全

readonly關(guān)鍵字在C#中表示一旦字段被初始化,它的值就不能再被改變。這種不可變性在某種程度上可以提高多線程環(huán)境下的線程安全性。

對(duì)于值類型(如intbooldouble等)或不可變的引用類型(如string),readonly字段是絕對(duì)線程安全的,因?yàn)樗麄兊臓顟B(tài)一旦初始化就無法改變。

但是,對(duì)于可變的引用類型(如列表、字典或自定義類),雖然你無法改變readonly字段本身引用的對(duì)象,但你仍然可以修改該對(duì)象的內(nèi)部狀態(tài)。例如,你可以向一個(gè)readonly的列表中添加項(xiàng)目。如果不同的線程試圖同時(shí)修改這個(gè)列表,那么可能會(huì)遇到線程安全問題。

以下是一個(gè)例子,解釋了以上的概念:

public class MyClass
{
    public readonly List<int> MyList = new List<int>();  // 可變引用類型

    // ...其他代碼...
    
    public void AddItem(int item)
    {
        // 需要保證線程安全,因?yàn)镸yList是可變的
        lock (MyList)
        {
            MyList.Add(item);
        }
    }
}

readonly只能保證字段本身不會(huì)被改變,而不能保證其引用的對(duì)象的狀態(tài)不被改變。在處理可變的引用類型時(shí),還需要采取額外的同步措施以確保線程安全。

readonly修飾的對(duì)象傳遞的是引用還是實(shí)例

無論字段是否被 readonly 修飾,對(duì)象的傳遞方式(引用或值)都取決于其類型。


該文章在 2023/10/30 11:16:25 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved