2016-12-08 38 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)那么开发人员很可能会调用该方法,缓存返回值并且不在循环内调用它。但是,这又是一个惯例。