代码之家  ›  专栏  ›  技术社区  ›  Virus721

C#结构、事件和构造函数

  •  1
  • Virus721  · 技术社区  · 9 年前

    当一个人想要拥有一个值的集合,并在该集合发生更改时收到通知时 ObservableCollection CollectionChanged 可以使用事件。

    然而,其 集合已更改 ObservableCollection<Image> ObservableCollection<Color> 。如果我想能够监控列表中包含的颜色结构何时被分配,则项目本身必须是可观察的(递归)。A. 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"));
            }
        }
    }
    

    我怎样才能使它编译?非常感谢。

    2 回复  |  直到 9 年前
        1
  •  5
  •   InBetween    9 年前

    C#要求在值类型的构造函数中显式初始化所有字段。您出现此错误的原因很简单 PropertyChanged 在构造函数完成之前未分配任何内容。解决这个问题很简单,只需执行以下操作:

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

    也就是说,你应该考虑改变你的方法。易变结构是各种头痛的根源,意外的行为和微妙的错误,可以让你疯狂。我建议换衣服 ObservableColor 引用类型。

        2
  •  1
  •   René Vogt    9 年前

    如评论中所述, mutable structs are evil 。因此,使此编译的最佳方法是将此类型设置为a class :

    class ObservableColor : INotifyPropertyChanged
    {...}
    

    如果你 struct ,则构造函数必须初始化 结构 event :

    struct ObservableColor : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public Color Value { get; private set; }
    
        public ObservableColor(Color color)
        {
            Value = color;
            PropertyChanged = null; // initiailze
        }