在C#中抑制“成员从未赋值”警告

13

我有下面的代码:

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

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

我该如何在我的代码中清晰地禁止这些警告?

3个回答

15

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

一个替代不当赋值的方法是使用#pragma

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

这应该可以工作,并且将不美观的部分保留在它有意义的地方 - 即字段声明处,这样就可以记录下来。

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

当然,无论您是否认为这种方式“清晰”,都是品味问题。我认为我更喜欢这种方式,而不是仅出现为消除警告而进行的赋值操作。


虽然默认赋值可能是您想要执行的操作,但无论如何,我们现在都在说“我们知道这没什么意义”。其中,我确实喜欢分组因素。但是,我是谁... - Grant Thomas
我更喜欢这种方式,因为它还可以防止开发人员(也许正在使用resharper或类似工具的开发人员)假定该字段可以被设置为只读。 - weston
我能使用SuppressMessageAttribute http://msdn.microsoft.com/en-us/library/system.diagnostics.codeanalysis.suppressmessageattribute%28v=vs.100%29.aspx,但我无法弄清如何从编译器警告中生成极其冗长的属性? - bradgonesurfing
@bradgonesurfing:我不确定编译器是否使用它 - 我会期望它被 FxCop 等工具使用。不过我可能错了 :) - Jon Skeet
没有必要对所有东西都使用编译指示!请看下面的答案 :) - Ana Betts

7
现在,由于每个平台都支持ReactiveUI中的CallerMemberNameAttribute,所以没有必要再忍受你强迫症编译器的压制了。
ViewPortViewModel _Trochoid;
public ViewPortViewModel Trochoid
{
    get { return _Trochoid; }
    set { this.RaiseAndSetIfChanged(ref _Trochoid, value); }
}

现在,其他的重载已经不再必要,但我还是保留它们,因为删除它们会造成破坏性变化,直到ReactiveUI 5.0才会进行删除。


OP已经在使用CallerMemberNameAttribute,并通过反射设置了值:“但由于RaiseAndSetIfChanged通过CallerMemberName执行的魔法”,我假设他们不想改变他们使用RaiseAndSetIfChanged的方式。 - Jon Skeet
如果您使用Ref重载,它将不会执行反射 :) - Ana Betts

4
你可以为引用类型分配一个默认值:
ViewPortViewModel _Trochoid = null;

这个可以工作,但感觉不太对,因为我在构造函数中覆盖了该值。 - bradgonesurfing
2
如果你有类似于Resharper的工具,这样做会导致它告诉你该字段可以被设置为只读,并且你仍然需要添加注释来抑制警告。 - weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接