C#结构、事件和构造函数
当一个人想要拥有一个值集合,并在该集合发生更改时得到通知时,可以使用C#结构、事件和构造函数,c#,events,struct,constructor,initialization,C#,Events,Struct,Constructor,Initialization,当一个人想要拥有一个值集合,并在该集合发生更改时得到通知时,可以使用observetecollection及其CollectionChanged事件 但是,它的CollectionChanged事件仅在修改集合本身时触发,而不是在修改它包含的值时触发。例如,如果我有一个ObservableCollection,我将无法检测何时有人访问该集合的第N个映像并调用修改它的方法。如果我有一个可观察的集合,同样的事情也是正确的。如果我希望能够监视列表中包含的颜色结构何时被分配,则项目本身必须是可观察的(递
observetecollection
及其CollectionChanged
事件
但是,它的CollectionChanged
事件仅在修改集合本身时触发,而不是在修改它包含的值时触发。例如,如果我有一个ObservableCollection
,我将无法检测何时有人访问该集合的第N个映像并调用修改它的方法。如果我有一个可观察的集合
,同样的事情也是正确的。如果我希望能够监视列表中包含的颜色结构何时被分配,则项目本身必须是可观察的(递归的)。一个Color
结构是不可观察的,我想把它封装到一个名为observatecolor
的结构中
问题是,编译器对我大喊大叫,因为事件没有在构造函数中初始化。首先我不知道一个事件必须被初始化,其次我不知道它应该如何被初始化
下面是我的代码:
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
更改为引用类型。C#要求在值类型的构造函数中显式初始化所有字段。出现此错误的原因很简单,因为在构造函数完成之前,PropertyChanged
没有分配任何内容。解决这个问题很简单,只需执行以下操作:
public ObservableColor(Color color)
{
Value = color;
PropertyChanged = null;
}
说,你应该考虑改变你的方法。易变结构是各种令人头痛的问题、意想不到的行为和微妙的错误的根源,这些都会让你发疯。我建议将
可观察颜色
更改为参考类型。如评论中所述。因此,进行此编译的最佳方法是将此类型设置为类
:
class ObservableColor : INotifyPropertyChanged
{...}
如果确实需要将其作为结构
,则构造函数必须初始化结构
的所有字段,甚至是事件
:
struct ObservableColor : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color Value { get; private set; }
public ObservableColor(Color color)
{
Value = color;
PropertyChanged = null; // initiailze
}
如评论中所述。因此,进行此编译的最佳方法是将此类型设置为
类
:
class ObservableColor : INotifyPropertyChanged
{...}
如果确实需要将其作为结构
,则构造函数必须初始化结构
的所有字段,甚至是事件
:
struct ObservableColor : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color Value { get; private set; }
public ObservableColor(Color color)
{
Value = color;
PropertyChanged = null; // initiailze
}
编译器到底在喊什么?实际上,它并不是编译器,而是在运行中检查代码的东西。它说“fieldobserveColor.PropertyChanged”必须在控件返回给调用方之前完全赋值“每当我悬停在带红色下划线的构造函数名称上时。我强烈建议在任何情况下都将其设置为类而不是结构-可变结构是错误的,编译器到底在喊什么?实际上,它不完全是编译器,而是随时检查代码的东西。”。它说“fieldobserveColor.PropertyChanged”必须在控件返回给调用方之前完全赋值“每当我将鼠标悬停在带红色下划线的构造函数名称上时。我强烈建议将其设置为类而不是结构,无论如何-可变结构都是有害的。谢谢你的帮助。哈哈哈,这太好笑了,没想到这会那么容易^^谢谢你的帮助。哈哈哈,这太好笑了,没想到这会这么容易谢谢你的帮助谢谢你的帮助。