Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#结构、事件和构造函数_C#_Events_Struct_Constructor_Initialization - Fatal编程技术网

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”必须在控件返回给调用方之前完全赋值“每当我将鼠标悬停在带红色下划线的构造函数名称上时。我强烈建议将其设置为类而不是结构,无论如何-可变结构都是有害的。谢谢你的帮助。哈哈哈,这太好笑了,没想到这会那么容易^^谢谢你的帮助。哈哈哈,这太好笑了,没想到这会这么容易谢谢你的帮助谢谢你的帮助。