【问题标题】:Suppress "Member is never assigned to" warning in C#抑制 C# 中的“成员从未分配给”警告
【发布时间】:2013-01-23 23:23:51
【问题描述】:

我有以下代码:

ViewPortViewModel _Trochoid;
public ViewPortViewModel Trochoid
{
    get { return _Trochoid; }
    set { this.RaiseAndSetIfChanged(value); }
}

使用 ReactiveUI INPC 支持。编译器总是警告我 Trochoid 从未分配给并且将始终为空。然而,由于RaiseAndSetIfChanged 通过CallerMemberName 支持执行的魔法,代码确实可以工作并且编译器是错误的。

我如何干净地在我的代码中抑制这些警告?

【问题讨论】:

    标签: c# inotifypropertychanged suppress-warnings reactiveui callermembername


    【解决方案1】:

    如何干净地在我的代码中抑制这些警告

    不适当分配的替代方法是只使用#pragma

    #pragma warning disable 0649 // Assigned by reflection
    ViewPortViewModel _Trochoid;
    #pragma warning restore 0649
    

    这应该可行,并且它将丑陋准确地保留在记录它有意义的地方 - 在字段声明中。

    如果您有多个字段以相同的方式处理,您可以将它们全部放在禁用警告的同一个“块”中,并带有适用于所有字段的注释。

    您是否认为这是“干净”的,当然,这是一个品味问题。我认为我更喜欢它而不是仅用于删除警告的副作用的作业。

    【讨论】:

    【解决方案2】:

    现在每个平台都在 ReactiveUI 中支持CallerMemberNameAttribute,你不用再受强迫编译器的压迫了:

    ViewPortViewModel _Trochoid;
    public ViewPortViewModel Trochoid
    {
        get { return _Trochoid; }
        set { this.RaiseAndSetIfChanged(ref _Trochoid, value); }
    }
    

    其他的重载现在真的没必要了,但我把它们留在里面是因为删除它们是一个重大的变化,因此在 ReactiveUI 5.0 之前不会完成

    【讨论】:

    • OP 已经在使用 CallerMemberNameAttribute - 并通过反射设置值:“但是由于 RaiseAndSetIfChanged 通过 CallerMemberName 执行的魔法” - 我假设他们不想改变他们使用 @987654323 的方式@.
    • 如果你使用 Ref 重载,它不会做反射:)
    【解决方案3】:

    您可以为它分配一个引用类型的默认值:

    ViewPortViewModel _Trochoid = null;
    

    【讨论】:

    • 这行得通,但感觉不对,因为我覆盖了构造函数中的值。
    • 如果你有一个像 resharper 这样的工具,这样做会告诉你该字段可以设为只读,你仍然需要添加评论来禁止它。
    猜你喜欢
    • 2011-04-18
    • 2012-08-29
    • 2015-04-20
    • 2011-02-11
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多