2011-03-02 23 views
6

假设我有一个只读属性和一个具体类的接口,其中属性在构造函数中实例化并标记为只读。防止resharper“可能的空引用异常”警告

internal interface IExample 
{ 
    ObservableCollection<string> Items { get; } 
} 


internal class Example : IExample 
{ 
    private readonly ObservableCollection<string> _items; 

    public Example() 
    { 
     _items = new ObservableCollection<string>(); 
    } 

    public ObservableCollection<string> Items 
    { 
     get { return _items; } 
    } 
} 

当我使用接口Resharper警告我,我可能在调用代码中有一个可能的空引用。

public class ExampleWithWarnings 
{ 
    public void Show() 
    { 
     IExample example = new Example(); 

     // resharper warns about null reference 
     example.Items.Add("test"); 
    } 
} 

我意识到,根据定义,接口并不保证该属性将有一个值。 (我也认识到界面上的属性并不理想)。但我知道这个属性总是有价值的。

是否有任何魔术属性可以放在界面上,以防止Resharper显示警告?我宁愿不必用禁用编译指示警告来修饰该类的所有用法。

+1

我不假设你会考虑卸载Resharper?您可以通过直接初始化只读成员来关闭它,而不是在构造函数中进行。这是同一件事。 – 2011-03-02 20:05:37

+0

您使用的是哪个版本的ReSharper? – 2011-03-02 20:09:05

+0

@Hans,这个问题不是具体的类。 – bryanbcook 2011-03-02 20:09:10

回答

7

是的,您可以使用的属性为:JetBrains.Annotations.NotNullAttribute。但是您不需要在项目中添加对ReSharper的引用。您可以使用自己的实现:打开ReSharper选项,然后在Code Inspection> Code Annotations下找到一个“Copy default implementation to clipboard”。现在只需将它粘贴到项目中的代码文件中即可。你甚至可以改变命名空间。

The Code Annotations settings

然后就打在接口属性的属性。

你还应该在代码检查>设置下看看,然后选择“假设实体可以为空......当实体用CanBeNull属性明确标记或检查为空”时。这样,您只会在您明确标记为麻烦的成员中收到警告。

The Code Inspection settings