实现接口包括抛出新的NotImplementedException ...为什么?

时间:2017-04-18 11:06:44

标签: c# visual-studio-2017

我正在使用VS2017社区,它昨天刚收到更新。今天我想实现一个接口,现在实现如下:

public string City 
{ 
    get => throw new NotImplementedException(); 
    set => throw new NotImplementedException(); 
}

而不是这(我的预期):

public string City { get; set; }

为什么会这样改变?不确定这是否特定于C#7或VS或其他什么。我只知道接口的自动实现在过去一周左右发生了变化。

我的界面:

public interface IMyInterface
{
    string City { get; set; }
}

4 个答案:

答案 0 :(得分:13)

我个人希望这是一个错误。在这一点上,我们只能猜测团队改变行为的原因。

但是,一般来说,有一个很好的理由来实现“失败”。默认情况下代码:作为开发人员,您必须有意识地决定如何实现该段代码。如果方法的默认实现只返回default(T)怎么办?代码将“正常工作”。直到有人注意到“未实施”#39;代码。

我认为,对于属性,你现在通常可以说,自动实现的属性是可行的方法。在99%的事件中,默认实现是正确的,与上述方法推理相反。

答案 1 :(得分:13)

所以,我知道这是一个老问题,但是看起来Visual Studio 2017现在允许您在两种样式之间进行选择(throw和普通的get;set;)。 (我使用的是2017年社区的15.7.5)。

要执行此操作,请转到工具=>选项=>文本编辑器=> C#=>高级,然后滚动到底部,您应该在其中有一个Implement Interface or Abstract Class部分。

除此之外,您可以将When generating properties单选按钮设置为默认的“首选投掷属性”,或者通过选择“首选自动属性”将其设置为旧样式。

在“选项”设置中的查找位置: enter image description here

答案 2 :(得分:6)

看起来他们只是缩短了界面属性的默认实现。在2017年之前的版本中,默认情况下接口属性实现如下:

    public string City
    {
        get
        {
            throw new NotImplementedException();
        }

        set
        {
            throw new NotImplementedException();
        }
    }

我一直认为这是浪费屏幕空间。就个人而言,我并不喜欢这两种方法,但是使用NotImplementedExceptions来强制实现接口实现以迫使你实际使用它们是有意义的。

答案 3 :(得分:1)

自动生成的代码是测试驱动开发(TDD)方法的一部分。该方法规定 - 首先使单元测试失败,然后编码以解决问题。它继续测试一下,编码一下。通过这些周期,任务就完成了。

它也适用于那些遵循敏捷方法且频繁添加和部署功能的应用程序。很少有东西可以开发,其他相关的稳定组件可以投入生产。正在进行的方法或属性标记为未实现标记。

[TestClass] 
public class UnitComp1 
{ 
    [TestMethod] 
    public void SalaryCalculationTest() 
    { 
        Payroll pr = new Payroll(); 
        Assert.IsTrue(da.IsValidGrossAmount(2000), "Invalid gross amount"); 
    } 
} 

//Cycle 1 - Test fails
public class Payroll
{
   public bool IsValidGrossAmount(int amount)
   {
     throw new NotImplementedException();
   }
}

//Cycle 2 - Test passes (done)
public class Payroll
{
   public bool IsValidGrossAmount(int amount)
   {
     return amount > 1000;
   }
}

Check out more, here