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

Chr*_*ian 27 c# visual-studio-2017

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

public string City 
{ 
    get => throw new NotImplementedException(); 
    set => throw new NotImplementedException(); 
}
Run Code Online (Sandbox Code Playgroud)

而不是这(我的预期):

public string City { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

我的界面:

public interface IMyInterface
{
    string City { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Kol*_*kov 18

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

要做到这一点,去工具=>选项=>文本编辑器=> C#=>高级,然后滚动至底部,您应该有一个Implement Interface or Abstract Class部分.

在其中,您可以将When generating properties单选按钮设置为默认的"首选投掷属性",或者通过选择"首选自动属性"将其设置为旧样式.

以下是在"选项"设置中查找的位置: 在此输入图像描述

  • 这也适用于Visual Studio 2019 (3认同)

Pat*_*man 13

我个人希望这是一个错误.此时我们只能猜测团队改变行为的原因.

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

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

  • 如果您自动实现接口,则默认情况下所有添加的方法都将抛出NotImplementedException.似乎团队也决定对房产做同样的事情. (2认同)

Ste*_* CO 6

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

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

        set
        {
            throw new NotImplementedException();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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