簡體   English   中英

C#結構,事件和構造函數

[英]C# Structs, events and constructor

當希望擁有一個值的集合並在該集合發生更改時收到通知時,可以使用ObservableCollection及其CollectionChanged事件。

但是,僅在修改集合本身時才會觸發其CollectionChanged事件,而不會修改其包含的值。 例如,如果我有一個ObservableCollection<Image> ,那么我將無法檢測到有人何時訪問該集合的第N個圖像並調用修改它的方法。 如果我有一個ObservableCollection<Color>他也是一樣。 如果我希望能夠監視何時分配了列表中包含的Color結構,則項目本身必須是可觀察的(遞歸)。 一個Color結構不可觀察,我想將其封裝到一個名為ObservableColor的結構中。

問題在於,編譯器對我大吼大叫,因為該事件未在構造函數中初始化。 好吧,首先我不知道必須初始化一個事件,其次我不知道應該如何初始化它。

下面是我的代碼:

struct ObservableColor : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Color Value { get; private set; }

    public ObservableColor(Color color)
    {
        Value = color;
    }

    public void Set(Color color)
    {
        Color oldColor = Value;
        Value = color;
        if (Value != oldColor)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));
        }
    }
}

我該如何進行編譯? 謝謝。

C#要求在值類型的構造函數中顯式初始化所有字段。 您收到此錯誤的原因僅僅是因為PropertyChanged在構造函數完成之前未分配任何東西。 解決這個問題很簡單,只需執行以下操作:

public ObservableColor(Color color)
{
    Value = color;
    PropertyChanged = null;
}

也就是說,您應該考慮更改方法。 可變結構是各種令人頭痛,意外行為和細微錯誤的來源,這些錯誤會使您發瘋。 我建議將ObservableColor更改為引用類型。

正如評論中已經提到的, 可變結構是邪惡的 因此,進行此編譯的最佳方法是使此類型成為class

class ObservableColor : INotifyPropertyChanged
{...}

如果您確實需要將其用作struct ,則構造函數必須初始化該struct所有字段,甚至event

struct ObservableColor : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public Color Value { get; private set; }

    public ObservableColor(Color color)
    {
        Value = color;
        PropertyChanged = null; // initiailze
    }

暫無
暫無

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

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