Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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#_Inheritance_Constructor - Fatal编程技术网

C# 同时调用基构造函数和无参数构造函数?

C# 同时调用基构造函数和无参数构造函数?,c#,inheritance,constructor,C#,Inheritance,Constructor,这件事让我震惊,我想知道这是否可能 长话短说——以下是代码: public class NotificationCollection : ObservableCollection<Notification> { public NotificationCollection() : base() { this.CollectionChanged += NotificationCollection_CollectionChanged; thi

这件事让我震惊,我想知道这是否可能

长话短说——以下是代码:

public class NotificationCollection : ObservableCollection<Notification>
{
    public NotificationCollection() : base()
    {
        this.CollectionChanged += NotificationCollection_CollectionChanged;
        this.PropertyChanged += NotificationCollection_PropertyChanged;
    }

    public NotificationCollection(IEnumerable<Notification> items)
        : base(items)
    {
        this.CollectionChanged += NotificationCollection_CollectionChanged;
        this.PropertyChanged += NotificationCollection_PropertyChanged;
    }
(....)
}
公共类NotificationCollection:ObservableCollection
{
public NotificationCollection():base()
{
this.CollectionChanged+=通知集合\u CollectionChanged;
this.PropertyChanged+=通知集合\u PropertyChanged;
}
公共通知集合(IEnumerable items)
:基本(项目)
{
this.CollectionChanged+=通知集合\u CollectionChanged;
this.PropertyChanged+=通知集合\u PropertyChanged;
}
(....)
}
如你们所见,我正在复制代码。如果我没有创建继承类,我会写

public NotificationCollection(IEnumerable<Notification> items)
    : this() //I can just call the empty constructor
{
    //do stuff here...
    //however, in case of inheritance this would be handled by base(items)
}
公共通知集合(IEnumerable items)
:this()//我可以调用空构造函数
{
//在这里做事。。。
//但是,在继承的情况下,这将由基(项)处理
}

所以,我的问题是-我可以同时调用
base
类构造函数和
this
构造函数吗?

简短回答:不,你不能

解决方法:

public NotificationCollection() : this(Enumerable.Empty<Notification>())
{
}

public NotificationCollection(IEnumerable<Notification> items)
    : base(items)
{
    this.CollectionChanged += NotificationCollection_CollectionChanged;
    this.PropertyChanged += NotificationCollection_PropertyChanged;
}
public NotificationCollection():此(Enumerable.Empty())
{
}
公共通知集合(IEnumerable items)
:基本(项目)
{
this.CollectionChanged+=通知集合\u CollectionChanged;
this.PropertyChanged+=通知集合\u PropertyChanged;
}
您只能链接到一个构造函数-当前类型(
this(…)
)或基类型(
base(…)
)。如果您需要在这两种情况下调用不同的基构造函数,则不可以-您不能共享
this()
code。不过,您可能可以将该代码移动到一个单独的方法中,并从两个位置调用它(假设不涉及
readonly
成员)

然而,您也不应该订阅自己的事件——这通常是一种代码气味。在这种情况下,最好检查
覆盖

public class NotificationCollection : ObservableCollection<Notification>
{
    public NotificationCollection() : base() {}

    public NotificationCollection(IEnumerable<Notification> items)
        : base(items) {}

    protected override void OnCollectionChanged(
        NotifyCollectionChangedEventArgs e)
    {
        // YOUR CODE HERE
        base.OnCollectionChanged(e);
    }
    protected override void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        // YOUR CODE HERE
        base.OnPropertyChanged(e);
    }
}
公共类NotificationCollection:ObservableCollection
{
public NotificationCollection():base(){}
公共通知集合(IEnumerable items)
:基本(项目){}
CollectionChanged上的受保护覆盖无效(
NotifyCollectionChangedEventArgs(e)
{
//你的代码在这里
基础。变更的集合(e);
}
受保护的重写无效OnPropertyChanged(PropertyChangedEventArgs e)
{
//你的代码在这里
根据改变的财产(e);
}
}

等等。。。你为什么订阅自己的活动?这应该是一个危险信号…但要回答你的问题,不,你不能从一个构造函数中委托给两个构造函数。订阅我自己的事件(对所有提到的人)的观点很好。诚然,这只是一个小项目中的一个小变化中的一件小事,所以我并没有太多关注_