2017-04-18 59 views
18

我正在使用VS2017社區,它昨天剛剛收到更新。今天,我想實現一個接口,而現在的實施看起來是這樣的:實現接口包括throw new NotImplementedException ...爲什麼?

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

ReSharper的做這樣的事情,太。我從來沒有質疑過,只是改變了我的需求。 –

+0

但它的工作原理是什麼,爲什麼現在這樣?我讀「新方法」的方式是每次嘗試獲取或設置屬性時都會拋出異常。這是正確的還是會像過去一樣適用於「舊」風格? – Christian

+8

這是特定於VS2017,而不是C#v7。就他們選擇這樣做的方式而言,考慮到他們無法猜測你打算做什麼,這是相當明智的選擇。 –

回答

13

我個人希望這是一個錯誤。在這一點上,我們只能猜測團隊爲何改變了行爲。

但是,一般來說,默認情況下有一個很好的理由來實現'失敗'的代碼:作爲開發人員,你必須有意識地決定如何實現這段代碼。如果方法的默認實現只返回default(T)會怎麼樣?該代碼將「工作」,直到有人注意到「未實施」的代碼。

我會認爲,對於現在通常可以說的屬性來說,自動實現的屬性是要走的路。在99%的事件中,默認的實現是正確的,與上面的方法推理相反。

+0

是的,我可以看到它可能有一些很好的理由。強制開發人員檢查每個屬性。但有了這麼多的類和接口,我敢打賭,99%的開發人員只會得到新的「查找和替換所有」習慣,然後什麼都不會。 – Christian

+2

如果你自動實現一個接口,所有添加的方法默認會拋出NotImplementedException。似乎團隊也決定在物業上也這樣做。 –

+1

@SirRufo:屬性*的getter和setter是*方法。 –

5

看起來他們只是縮短了接口屬性的默認實現。在2017年以前的版本中,接口屬性默認情況下是這樣實現的:

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

     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

我一直認爲這是浪費屏幕的房地產。就我個人而言,我並不喜歡這兩種方法,但是用NotImplementedExceptions將接口實現存根出來以迫使你實際上對它們做些什麼是有意義的。

+0

我從來沒有見過用throw new NotImplementedException()實現的接口屬性。通常它會是{get;組; } – Christian

+0

如果您創建一個實現接口的類,那麼請執行CTRL-。在紅色的曲折中,那就是當你得到我正在談論的默認的「NotImplemented」屬性時。不要與通過鍵入prop {tab} {tab}可以得到的自動屬性混淆。 –

+0

在過去,我也只在使用自動實現的接口時纔看到空的get/set實現。 在大多數情況下,「迫使我與他們做某事主要涉及找到替換。當然,不涉及繁重的舉措,但仍然是一種不必要的和總的必要性。 –

0

自動生成的代碼是測試驅動開發(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

+0

非常喜歡你是正確的 - 但它仍然是非常討厭,在我看來,一個不希望的變化。如果至少有一個模板文件(我已經查找過,但沒有找到一個模板文件,所以我歡迎這裏有一個正確的),這將是很好的,可以將其更改爲簡單的{get;組; }自動屬性默認實現。 –

相關問題