我正在使用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; }
}
答案 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
单选按钮设置为默认的“首选投掷属性”,或者通过选择“首选自动属性”将其设置为旧样式。
答案 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;
}
}