C# 控制数据c中的访问#

C# 控制数据c中的访问#,c#,C#,我正在学习封装,并有这些控制数据访问的方法示例,这两个代码都工作并做相同的事情,但通过进一步的研究,我还没有找到任何关于方法访问的参考,所以我希望有人能解释哪一个更好以及为什么?因为我有点困惑 (在msdn网站上研究方法访问时,它基本上只是给了我属性示例,这就是为什么我感到困惑的原因) 方法访问 public class LogInToken { private string Name; private string Password; public string Ge

我正在学习封装,并有这些控制数据访问的方法示例,这两个代码都工作并做相同的事情,但通过进一步的研究,我还没有找到任何关于方法访问的参考,所以我希望有人能解释哪一个更好以及为什么?因为我有点困惑

(在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");
            }
        }
    }
}

属性是看起来像属性的东西,以Person类为例,您可能有身高、偏好颜色、年龄和姓名

方法是提问,结婚

C#允许您使用get和set将属性实现为代码,尽管这在逻辑上是一个属性,(比如说FavoriteColor),但您实际上需要运行代码来设置或获取它(可能您在那里编写代码,然后在FaceBook上查找他们的个人资料,查看其是否显示FavoriteColor)。此外,您可以拥有一个可以自由读取但只能由某些人设置的属性(内部集、公共get)。此外,您还可以在集合上添加代码,以确保值是合理的颜色,(您不允许使用“dog”、“tree”或“Foof”)


注意,所有这些都可以通过Person.getFavoriteColor和Person.setFavoriteColor(这是Java的方式)来完成,但是c#语法糖很好而且干净

基于这个示例,您更喜欢哪一个

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

从本质上讲,第一个是一个语法糖,可以为C#6.0中发布的属性初始化编写更少的代码。C#3.0。而第二个让我想起了我还在大学的时候(哈哈)


就哪种实现更好而言,这取决于偏好,不是吗?作为一个懒惰的开发人员,我编写的代码甚至可以省去几次按键:)

属性是某些东西的特征或属性(不是.net意义上的属性,而是普通英语意义上的属性)。所以在你的情况下,属性是有意义的。
LoginToken
有名称和密码。想想这里的形容词

方法是诸如登录、连接、行走等操作。请在此处思考动词


按照惯例,酒店不应进行任何重物搬运。例如,在您的
LoginToken.Password
setter中,如果您正在连接到某个web服务或前往数据库以确认密码有效或格式有效(无论出于何种原因),则不会在属性setter中执行此操作。属性可以工作,但可以轻量级工作,因为按照惯例,这是隐含的,其他开发人员可能多次在循环中获取或设置属性。但是,如果您有一个方法
SetPassword(stringpassword)
或者更好的方法
ValidatePassword(stringpassword)
,那么开发人员很可能会调用该方法,缓存返回值,而不是在循环中调用它。但这又是惯例。

本文作者打破了什么是自动属性初始值设定项,这可能是一个重复。实际上,您的第一个示例只显示了自动属性,它已经存在于C#3.0.aah!感谢@Martheen指出这一点。在C#6.0中,您可以使用自动初始值设定项属性(如设置访问器可见性)执行更多操作
 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
  }
}