簡體   English   中英

如何解決C#缺少賦值運算符重載的問題

[英]How do I work around the C# lack of assignment operator overload

我知道在C#中無法重載賦值運算符...但是可以阻止默認運算符嗎?

情況:我正在開發一個復雜的結構編輯器。 它將允許將多個類對象組合在一起並將它們鏈接在一起。

為了能夠在許多類的實例之間保存這些鏈接和引用,我需要每個實例在所有類中都具有唯一的ID。 我創建了一個ID類(包括對容器對象的引用)來處理它。 為了確保ID是唯一我做了登記類本身所有實例的靜態list<idClass> IDRegister和靜態到任何ID實例的所有引用list<idClass> IDReferenceList

問題:在初次分配/創建要使用的新ID實例后,我將ID注冊到IDRegister ,從而有效地創建了對該對象的兩個引用。 現在,在使用任何類實例的過程中,現在都非常容易用另一個ID字段(現有的或新的)覆蓋ID字段。 未注冊對象的正常覆蓋將使實例未被引用,垃圾回收將負責內存清理。 在這種情況下,對IDRegister實例的IDRegister (可能在IDReferenceListIDReferenceList )將使ID實例保持活動狀態,並通過其對可能過時的容器對象的引用來防止對它們的清除。 所有這些都會使我的庫中發生大量內存泄漏。

解?

我無法接受庫中可能的內存泄漏。 我有兩個選擇:轉到C ++或找到一種方法來防止默認分配覆蓋現有的對ID實例的引用。

還是有第三種選擇?

您可以將字段設置為只讀(構造對象時的初始分配除外)。

有兩種略有不同的方法來執行此操作。 第一種也是最可靠的方法是使用帶有公共獲取程序而不使用設置程序的readonly字段。 那么只能在構造函數中設置id

private readonly int id;

public int Id
{
    get
    {
        return id;
    }
}

第二種是使用將setter設為私有的屬性:

public int Id { get; private set; }

這允許在構造之后更改id ,因此它與readonly不太一樣。 但是,由於設置器是私有的,因此它仍然可以防止代碼的客戶端意外更改值。

首先,您可以將ID字段設置為只讀屬性,該屬性只能通過初始分配來設置。

其次,如果您的應用程序可能發生內存泄漏,則說明您沒有正確進行清理。 如果您不在GC堆上進行分配,則需要有一個析構函數(通常還包括一個dispose()),以確保清除。 應該在無法繞開的地方進行此操作。 即,如果您擔心由於覆蓋某個地方的ID字段而導致內存泄漏,那么析構函數將位於錯誤的類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM