【问题标题】:simplest and most concise form to write a property in C#9 and c#10在 C#9 和 c#10 中编写属性的最简单和最简洁的形式
【发布时间】:2021-11-10 15:23:06
【问题描述】:

考虑到 C#9 甚至 C#10 的特性,如下编写属性最简单、最简洁的形式是什么?

是否可以不使用支持字段?

string fName;
public string Name { get { return fName; } set { SetPropertyValue<string>(nameof(Name), ref fName, value); } }

【问题讨论】:

    标签: c# properties c#-9.0 c#-10.0


    【解决方案1】:
    public string Name {get;}
    

    应该是你能做的最简单的。

    如果您需要对 WPFs PropertyChanged 的​​支持,我通常会这样做

    private string name;
    public string Name {get => name; set => Set(ref name, value); }
    private void Set<T>(ref T field, T value, [CallerMemberName]string caller = "")
    {
        field = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(caller ));
    }
    

    可以选择在 Set 方法中添加一个比较,以仅在新值不等于旧值时引发事件。据我所知,c# 9 或 10 中没有任何新功能可以改进这一点。

    【讨论】:

    • 是否可以不使用支持字段? (SetPropertyValue 是 DevExpress 中的一个方法)
    • @Roohi 否,因为自动实现的属性只会为您创建一个您看不到的支持字段,并且您无法更改 set 以在添加其他代码时使用该支持字段(不使用一些hacky 反射代码)。
    • 我想知道你是否可以在T value上做一个扩展方法并像value.Set(ref field);一样调用它。
    • @Roohi 据我所知,没有。在引发 PropertyChanged 时无法编写自动属性。如果在哪里会很好,但这可能会在语言和 WPF 之间引入比语言设计者想要的更紧密的耦合。
    • @Roohi 文章中提到该功能似乎不适用于 c# 10。请参阅 c#10 new features
    猜你喜欢
    • 2019-12-02
    • 2012-05-03
    • 2010-12-14
    • 1970-01-01
    • 2011-06-03
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多