2009-07-13 64 views
6

我使用的是VS 2008,並且在我的項目屬性頁中,我發現我的目標是.Net 3.5。C#3中的自動屬性 ​​- 如果我聲明瞭一個集合,就必須聲明一個實體?

這裏是在編譯的時候,我發現了錯誤:因爲它沒有標記爲抽象

AMSDataModels.Vehicle.VIN.get」必須聲明主體,EXTERN或部分

這裏是代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace AMSDataModels 
{ 
    public class Vehicle 
    { 
     //NodeID for datastore persistance 
     public Guid NodeID { get; set; } 

     public string VIN { get; 
      set { 
       if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
      } } 

     public string Make { get; set; } 
     public string Model { get; set; } 
    } 
} 

如果我從集合剝去身上,這樣它只是:

public string VIN { get; set; } 

所有的工作,但我失去了檢查VIN的能力,因爲它設置。

有沒有人有建議如何解決這個問題或更好的方法來解決手頭的問題?

我真的很喜歡速記符號 - 但驗證輸入的合法性也很重要!

+0

感謝大家注意到我實際上並沒有在任何地方設置值 - 老實說,我還沒有弄清楚編譯器創建的局部變量被調用了。有沒有特殊的關鍵字? – Matt 2009-07-13 20:51:17

+1

沒有特殊的關鍵字 - 編譯器無法訪問自動生成的東西。這使得生成的代碼的強大之處在於簡單性以及編譯器準確瞭解其訪問方式的能力。如果你能夠定義或訪問汽車領域,那麼編譯器就不能對其使用做出儘可能多的假設。 – 2009-07-13 20:54:02

+0

當你嘗試使用INotifyPropertyChanged時,你會遇到同樣的問題,自動屬性的美麗很快就會丟失:( – Nate 2009-07-13 21:01:10

回答

17

如果您要在該集合中添加邏輯,則還需要將其添加到get中。注意在你的設置中,你並沒有爲任何事物設置一個值?

添加支持字段,

private string _vin; 

,並返回,在搞定。

public string VIN 
{ 
    get { return _vin; } 
    set 
    { 
     if (value.Length != 17) 
     throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
     else 
     _vin = value; 
    } 
} 
3

是的,你將不得不宣佈獲得實施。哦,你的設置代碼除了驗證之外什麼都不做。您還需要爲此提供額外的實施,假設您想在通過驗證時設置該值。

如果您需要的不僅僅是基本的get/set實現,還需要實現整個屬性,而不僅僅是差異。

6

當使用自動屬性時,編譯器會自動生成一個backer字段。當你聲明你自己的時候,它無法知道get方法使用哪個字段。所以你必須聲明兩者都不是。順便說一句,你當前的設置方法只檢查值 - 它從來沒有實際分配給任何東西。

2

你將不得不使用良好的後盾領域。簡寫符號不能混合使用。唯一的額外樂趣是改變get和set的訪問修飾符,例如得到;私人設置;