狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

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

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

在C#中,readonly特性用于聲明一個只讀字段。一個只讀字段可以在聲明時或在構造函數內部進行初始化,一旦被賦予了初始值,它就不能被改變。

使用

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

public readonly int MyField;

您也可以在構造函數中初始化只讀字段,如下所示:

public class MyClass
{
    public readonly int MyField;

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

注意事項

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

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

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

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

垃圾回收主要基于一個對象是否還被引用來決定是否進行回收。如果一個對象不再被任何其他對象引用,那么它就會被 GC 標記為可回收。當 GC 運行時,這些標記為可回收的對象將被清理掉,釋放其占用的內存資源。

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

如果一個 readonly 字段所引用的對象不再被其他對象引用,那么這個對象同樣會被標記為可回收,并在 GC 運行時被清理。

readonly修飾的字段內存分配在哪里

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

  • 如果readonly字段是實例字段(非靜態),那么它的內存將會在堆上分配,作為創建對象實例時分配的一部分。每個對象實例都有自己的readonly實例字段副本。
  • 如果readonly字段是靜態字段,那么它的內存將會在高頻堆(High Frequency Heap)上分配,此處用于存儲所有的靜態數據。所有實例共享一個readonly靜態字段。

無論是靜態還是非靜態的 readonly 字段,都只能在聲明時或在相應的構造函數中初始化。對于靜態 readonly 字段,這通常發生在靜態構造函數或者第一次引用類之前。對于非靜態 readonly 字段,它們在實例構造函數中初始化。

下面是一個代碼示例:

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

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

    // 靜態構造函數
    static MyClass()
    {
        StaticField = 10;
    }
}

readonly線程安全

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

對于值類型(如intbooldouble等)或不可變的引用類型(如string),readonly字段是絕對線程安全的,因為他們的狀態一旦初始化就無法改變。

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

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

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

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

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

readonly修飾的對象傳遞的是引用還是實例

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


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