2016-12-08 37 views
-2

我正在學習封裝,並有這些控制數據訪問的方式的例子,這兩個代碼工作和做同樣的事情,但通過進一步的研究,我一直沒能找到任何參考到方法訪問,所以我希望有人能解釋哪一個更好,原因爲什麼?因爲我有點困惑控制數據c中的訪問#

(研究在MSDN網站的方法訪問時,它基本上只是給我的屬性例子,這就是爲什麼我很困惑)

方法來訪問

public class LogInToken 
{ 
    private string Name; 
    private string Password; 

    public string GetName() 
    { 
     return Name; 
    } 

    public string GetPassword() 
    { 
     return Password; 
    } 

    public void SetName(string NewName) 
    { 
     Name = NewName; 
    } 

    public void SetPassword(string newPassword) 
    { 
     if (newPassword != null) 
     { 
      Password = newPassword; 
     } 
     else 
     { 
      throw new Exception("no password"); 
     } 
    } 
} 

屬性訪問權限

public class LogInToken 
{ 
    private string name; 
    private string password; 

    public string Name 
    {  
     get  
     {   
      return name;   
     }  
     set  
     {   
      name = value; // C# uses the implicit parameter "value"  
     } 
    } 
    public string Password 
    { 
     get 
     { 
      return password; 
     } 
     set 
     { 
      if (value != null) 
      { 
       password = value; 
      } 
      else 
      { 
       throw new Exception("no password"); 
      } 
     } 
    } 
} 
+1

[屬性vs方法]的可能重複(http://stackoverflow.com/questions/601621/properties-vs-methods) – Kinetic

回答

2

屬性看起來像屬性,以Person類爲例,你可能有Height,FavoriteColor,Age,Name。

方法是AskQuestion,結婚,.....

C#允許實現性能與使用取得和情況設置代碼,雖然這在邏輯上是一個屬性(比方說FavoriteColor),你的實際需要運行代碼來設置或獲取它(也許你在那裏編寫代碼,然後在FaceBook上查看它們的配置文件,看看它是否說FavoriteColor)。此外,您可以擁有一個可以自由閱讀的財產,但只能由一些財產(內部設置,公開獲得)來限制。你也可以在設置上添加代碼,以確保這些值是合理的顏色,(你不允許'狗''樹'或'Foof')

注意所有這些可以通過Person.getFavoriteColor和Person .setFavoriteColor(這是Java的方式),但c#語法糖很好,很乾淨

0

基於這個例子你更喜歡哪一個?

public class Student(){ 
    public string Name {get;set;} 
    public string LastName {get;set;} 
} 

OR

public class Student(){ 
    private string Name; 
    private string LastName; 

    public string GetStudentName(){ 
    return this.Name; 
    } 
    public string GetStudentLastName(){ 
    return this.LastName; 
    } 
    public void SetStudentName(string name){ 
    this.Name = name; 
    } 
    public void SetStudentLastName(string lname){ 
    this.LastName = lname 
    } 
} 

基本上,第一個是語法糖編寫屬性初始化其在 C#6.0釋放更少的代碼。 C#3.0。而當我還在大學(LOL)的時候,第二個人會把我帶回來!

在哪些方面實施更好,歸結爲偏好不是嗎?作爲一個懶惰的開發者,我會寫代碼,甚至可以節省我幾次擊鍵:)

+0

感謝本文的作者,打破什麼是自動屬性初始值設定程序http: //geekswithblogs.net/WinAZ/archive/2015/06/30/whatrsquos-new-in-c-6.0-auto-property-initializers.aspx – jmesolomon

+0

其實,你的第一個例子只顯示了自動屬性,它已經存在於C# 3.0。 – Martheen

+0

啊!感謝@Martheen指出了這一點。在C#6.0中,您可以使用自動初始化程序屬性(如設置訪問器可見性)做更多工作 – jmesolomon

0

屬性是某些東西的特性或屬性(不屬於.net意義上的,而是普通的英語)。所以在你的情況下,屬性將是有意義的。 A LoginToken有一個名字和一個密碼。在這裏考慮形容詞。

方法是諸如登錄,連接,步行等操作。在這裏考慮動詞。

按照慣例,屬性不應該做任何繁重的工作。例如,在您的LoginToken.Password設置器中,如果您連接到某個Web服務或去數據庫以確認密碼有效或以有效格式(無論出於何種原因),那麼您不會在屬性設置器中執行此操作。屬性可以工作,但輕量級的工作,因爲按照慣例,這是隱含的,並且其他開發人員可以多次獲取或設置該屬性。但是,如果您有一個方法SetPassword(string password)或更好的方法ValidatePassword(string password)那麼開發人員很可能會調用該方法,緩存返回值並且不在循環內調用它。但是,這又是一個慣例。