gpt4 book ai didi

c# - 具有 C#8 默认接口(interface)实现/特征的事件继承

转载 作者:行者123 更新时间:2023-12-04 12:25:05 24 4
gpt4 key购买 nike

目前关于新的 C#8 默认接口(interface)实现(特征)的事件限制的文档很少。我对 the spec proposal. 特别困惑该示例不仅给出了无效的 C#(“覆盖”事件缺少标识符),而且在 C#8(VS2019、.NET Core 3.0)中实现其中任何一个都会返回大量编译器异常。另外,the release notes for C#8不要提及接口(interface)特征的事件。当我继续尝试寻找答案时,我也无法从 the open issues list. 中收集到任何有用的信息。

所以问题是:此功能是否已实现和可用?如果是这样,正确的语法是什么?

最佳答案

默认接口(interface)成员用于特征,而不仅仅是版本控制,并且 INPC 特征是有意义的。

不幸的是,现在不可能使用 DIM 来引发事件,并实现这个 seems to be a pain - 这将需要彻底检查事件机制并破坏大量代码,尤其是库代码。我们可以使用 DIM 来添加或删除处理程序,但这不是很有用。

有这样的东西会很好:

interface InpcTrait : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private T Set(T value,String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
return value;
}
}

class Customer
{
private string _name;
public string Name
{
get=>_name;
set=>_name=Set(value,"Name");
}
}



不幸的是,这是不可能的。那是因为 event类中的关键字生成 后台保存事件处理程序并添加/删除访问器。当我们引发事件时,我们调用该事件处理程序。

接口(interface)不能有状态,这意味着我们不能访问该事件来引发它。

当我们在接口(interface)中指定一个事件时,我们创建了一个虚拟事件,编译器只允许向它添加/删除事件处理程序。提升接口(interface)仍然需要访问支持字段。

This Sharplab.io example表明:
public class DemoCustomer : INotifyPropertyChanged
{
// These fields hold the values for the public properties.
private Guid idValue = Guid.NewGuid();
private string customerNameValue = String.Empty;
private string phoneNumberValue = String.Empty;

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

生成
    [CompilerGenerated]
private PropertyChangedEventHandler m_PropertyChanged;

public event PropertyChangedEventHandler PropertyChanged
{
[CompilerGenerated]
add
{
//some code
}
[CompilerGenerated]
remove
{
//some code
}
}

private void NotifyPropertyChanged(string propertyName = "")
{
if (this.m_PropertyChanged != null)
{
this.m_PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

我们可以做的是添加或删除事件处理程序,但我们甚至无法检查事件是否已经有其他处理程序。我们冒着多次添加相同事件处理程序的风险。

这是有效的:
interface INPCtrait:System.ComponentModel.INotifyPropertyChanged
{
private void AddSomeDefaultHandler()
{
PropertyChanged+=Something;
}

private void RemoveDefaultHandler()
{
PropertyChanged-=Something;
}

public void Something(Object sender,System.ComponentModel.PropertyChangedEventArgs args)
{
}
}

但是我们无法知道是否需要添加该默认处理程序。

关于c# - 具有 C#8 默认接口(interface)实现/特征的事件继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58796545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com