如何使接口的实现产生自动属性而不是NotImplementedException?

45

考虑我们有一个简单的接口,例如ICar,当我将鼠标移动到ICar表达式上并单击实现接口时,Visual Studio会生成下面的实现。

是否有任何方法只使用自动属性,就像下面的示例一样。我相信这将改善实现时间,因为大多数情况下自动属性是预期的实现方式。

    public interface ICar
    {
        double Power { get; set; }
    }

    public class Car:ICar
    {

        public double Power
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    }

“for”自动属性是什么意思?你的意思是要用“for”代替自动属性吗?在接口上使用{get; set;}不是自动属性。 - CodesInChaos
@CodesInChaos 我期望 class 自动属性能够实现,就像在接口中看到的 {get;set;} 一样。 在此处查看 http://msdn.microsoft.com/en-us/library/bb384054.aspx 。 感谢您指出这一点。 - Davut Gürbüz
@CodesInChaos 抱歉,我晚些才注意到问题的标题。你是对的。我已经更改了它。 - Davut Gürbüz
4个回答

77
您可以在选项中更改此设置: 工具>选项>文本编辑器>C#>高级,然后在底部找到 t

2
这应该是被接受的答案。谢谢Norbert。 - JohannSig
3
谢谢。很高兴我往下滚找到了这个答案。比被采纳的答案容易多了。 - naphier
1
很简单,谢谢!但请注意,似乎需要重新启动VS 2019才能生效。 - cid
1
VS 2019已经安装完成,无需重启。谢谢,Norbert。 - Guillermo Alejandro
2
我理解为什么不是这样,但我希望那是默认设置。 - timelmer
显示剩余2条评论

24

当您单击 实现接口 时,需要更改Visual Studio使用的模板。该模板存储在以下位置:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Refactoring

您需要更改的模板名称为PropertyStub.snippet
注意:在进行更改之前,请备份现有的片段文件,以便在出现问题时可以轻松还原。
您需要更新的行为:
$GetterAccessibility$ get 
{ 
    $end$throw new $Exception$(); 
}
$SetterAccessibility$ set 
{ 
    throw new $Exception$(); 
}

这些行应更改为以下内容:
$GetterAccessibility$ get;
$SetterAccessibility$ set;

1
@AdamHouldsworth - 是的,如果你开始浏览“重构”文件夹,你会惊讶于在VS中有多少是基于模板驱动的。 - Karl Anderson
@AdamHouldsworth - 哦,谢谢,我以为我已经删除了正确的部分。已更新答案。 - Karl Anderson
@KarlAnderson,是否可以只在我的用户帐户上执行相同的操作,而不是更改在运行Visual Studio的系统上所有用户的文件? - user4628051
@FlorianNeiss - 我不知道是否可以为每个用户设置片段模板,不是说这不可能,只是不确定如何实现。 - Karl Anderson
5
对于VS2K15/VS2K17,请使用Norbert Rozmus下面的答案。 - Chris Bush
显示剩余5条评论

3

首先,它不是自动属性。如果您想要自动属性,则必须删除编译器生成的内容并替换为

public double Power { get; set; }

那个是自动属性。

编译器这样做是因为这是编译器能够产生可以编译的代码最简单的方法。我想它也可以为接口上的属性生成自动属性,但这会引入一种不一致性,因为处理方法时它还会生成NotImplementedException方法存根。话虽如此,你可以更改这个设置。这是在代码段中处理的:

1) 打开代码段目录并找到此文件 C:\Program Files\Microsoft Visual Studio 10.0\VC#\Snippets\1033\Refactoring\PropertyStub.snippet

2) 修改PropertyStub.snippet文件,用自动属性替换属性存根。

 <![CDATA[$signature$ { $GetterAccessibility$ get; $SetterAccessibility$ set; }]]>

您可以对MethodStub.snippet进行相同的操作,以便它生成一个主体。

现在,当您使用Visual Studio自动实现接口时,您将得到:

 public double Power { get; set; }

3

如果有人想在Visual Studio 2015中修改重构片段,那是不可能的。由于更新到Roslyn之后,似乎Visual Studio不再直接引用那些片段文件,而是直接在Roslyn中完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接