我正在学习封装,并且有这些控制数据访问方式的例子,两个代码都可以工作并做同样的事情,但是通过进一步的研究我还没有找到任何参考资料。方法访问,所以我希望有人可以解释哪一个更好,原因是什么?因为我有点困惑
(在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");
}
}
}
}
答案 0 :(得分:2)
属性看起来像属性,以Person类为例,你可能有Height,FavoriteColor,Age,Name。
方法是AskQuestion,Marry,.....
C#允许你使用get和set来实现属性作为代码,虽然这在逻辑上是一个属性,(比如FavoriteColor)你实际上需要运行代码来设置或获取它(也许你在那里编写代码)然后在FaceBook上查看他们的个人资料,看看它是否显示为FavoriteColor)。此外,您可以拥有一个可以免费阅读的属性,但只能由某些人进行选择(内部设置,公共获取)。你也可以在集合上添加代码,确保值是合理的颜色,(你不允许'狗'。'树'或'Foof')
注意所有这一切都可以通过Person.getFavoriteColor和Person.setFavoriteColor(这是Java的方式)完成,但c#语法糖很干净
答案 1 :(得分: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)!
就哪种实施更好而言,归结为偏好不是吗?作为一个懒惰的开发人员,我会编写代码,即使是几次击键也能保存我:)
答案 2 :(得分:0)
属性是某些东西的特征或属性(不是.net意义上的属性,但是常规英语)。所以在你的情况下属性是有道理的。 strSQL = " TRANSFORM Max(Value)" _
& " SELECT Request_ID, Status" _
& " FROM [DATA$]" _
& " GROUP BY Request_ID, Status" _
& " PIVOT Field_Name;"
有一个名称和密码。在这里想形容词。
方法是行动,例如登录,连接,行走等。在这里思考动词。
按照惯例,属性不应该做任何繁重的工作。例如,在您的LoginToken
setter中,如果您连接到某个Web服务或进入数据库以确认密码有效或以有效格式(无论出于何种原因),那么您不会在该属性中执行此操作二传手。属性可以工作,但轻量级工作,因为按照惯例,这是隐含的,其他开发人员可能多次获取或设置属性循环。但是,如果您有一个方法LoginToken.Password
或更好的SetPassword(string password)
,那么开发人员很可能会调用该方法,缓存返回值而不是在循环内调用它。但这又是惯例。