【问题标题】:Difference between "var objectName= new SomeObject()" and "interfaceName objectName= new SomeObject()"“var objectName= new SomeObject()”和“interfaceName objectName= new SomeObject()”之间的区别
【发布时间】:2013-03-28 12:20:20
【问题描述】:

我正在通过 resharper 的代码检查进行一些代码分析,我收到了下一个警告:

仅使用属性“propertyname”的实现

我的界面上有这个警告,如果我用谷歌搜索,我发现了这个 jetbrains 页面: http://confluence.jetbrains.com/display/ReSharper/Only+implementations+of+property+are+used

这对我一点帮助都没有,因为那样我就没有界面了......

所以我开始测试如何消除该警告。 在以下虚拟接口和类上:

public interface ITest
{
    string Name { get; set; }
}

public class Test: ITest
{
    public string Name { get; set; }
}

如果我使用:

var newTest = new Test();
newTest.Name= "newName";

然后出现警告。但是当我使用下一行时,警告会消失。

ITest newTest = new Test();
newTest.Name = "newName";

我不是界面忍者,所以我想知道,这两种方式有什么区别..?

谢谢!

【问题讨论】:

标签: c# .net interface resharper code-inspection


【解决方案1】:

这推断出具体的类型:

//X is of type X
var x = new X(); 

这不是

//X is of type IX
IX x = new X();

我猜如果你写,警告仍然会发生

//X is of type X
X x = new X();

以下是否也删除了警告?

public void TestX()
{
    //X is of type X
    var x = new X();
    UseIX(x);
}

public void UseIX(IX interfaceParam)
{
    interfaceParam.Foo = 1;
}

【讨论】:

  • 确实,警告与第三个一起显示。最后一个没有显示。但是使用 'IX x = new X();" 代替 var one 有什么好处吗?还是有最佳实践...?
  • @bruno 我能想到的唯一区别是,将变量声明为 IX 会阻止您在代码中使用非接口方法,并强制您将 IX 转换为 X 才能使用它们。不一定是优势。我认为它的使用更多地取决于个人喜好。
【解决方案2】:

var newTest = new Test() 将 newTest 的类型设置为 Test。 ITest newTest = new Test() 会将 newTest 的类型设置为 ITest。

因此,以前的 ITest 不需要,因为它从未使用过。

所以 resharper 只是说您不需要 ITest。是否同意,由你决定。您需要 ITest 吗?

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2016-10-04
    相关资源
    最近更新 更多