我在问有关使用吸气剂和吸气剂的建议。 我在两个版本中编写了相同的代码:使用getter和setter以及仅使用class方法。而且我看不清它们之间的区别。
我用私人领域评分写了Book类。构造函数Book可以通过RatingSetter或RatingMethod将某些东西分配给Book.rating。 RatingMethod仅设置值,但我也可以创建仅用于获取值的方法。
class Book
{
public string title;
public string author;
private string rating;
public Book(string title, string author, string rating)
{
this.title = title;
this.author = author;
RatingSetter = rating;
RatingMethod(rating);
}
public string RatingSetter
{
get { return this.rating; }
set
{
if (value == "PG" || value == "PG-13" || value == "R")
{
rating = value;
}
else
{
rating = "NR";
}
}
}
public string RatingMethod(string rating)
{
if (rating == "PG" || rating == "PG-13" || rating == "R")
{
return this.rating = rating;
}
else
{
return this.rating = "NR";
}
}
}
我认为,安全性,验证或其他方面没有任何区别。 任何人都可以指导并帮助我了解有什么区别,以及为什么建议使用getter和setter方法。
答案 0 :(得分:4)
字母和字母是语法糖。编译器最终会将您的getter和setter编译为getter和setter 方法。因此,通过自己编写getter和setter方法,您就可以完成编译器的工作。
因此,我建议您使用getter和setter,因为它们的主要目的之一是替换getter和setter方法。
还有使用getter和setter的其他一些优点:
如果您只需要没有任何逻辑的吸气剂和装夹器,则字母和设定器可以为您节省很多时间:
public int Property { get; set; }
海事组织(IMO),吸气剂和吸气剂的美观性更好。比较:
obj1.Property += obj2.Property;
使用
obj1.SetProperty(obj1.GetPropert() + obj2.GetProperty());
我觉得后者只是括号太多了...
使设置方法和获取方法靠近属性声明。如果使用getter和setter方法,则可能会意外地在属性声明和getter / setter方法之间编写其他方法,从而导致getter / setter方法缓慢地“漂离”属性声明。下次要查找它时,需要上下滚动。使用getter和setter,它们将始终位于属性声明下方。
答案 1 :(得分:1)
属性是提供灵活机制以读取,写入或计算私有字段值的成员。
从本质上说,属性是一个有目的的成员,仅用于包装和访问私有成员,从而使“数据易于访问,并且仍有助于提高方法的安全性和灵活性。” / p>
在您的示例中,我将简单地将RatingSetter
重命名为Rating
,并像对待普通公共领域一样对待它。这样可以提高易用性,并减少其他人使用您的代码时的混乱。很明显,您在做什么和需要做什么。
也不建议设置公共字段,例如public string title;
相反,通常最好选择使用属性来包装此字段并将其设为私有,例如
private string title;
public string Title {get; set;}
您可以在班级之外使用公共属性,但是现在可以更好地控制某人访问或设置变量时的情况。
private string title;
public string Title {get; private set;}
仅允许从类外部进行读取访问。
现在可以更轻松地记录日志了,因为您可以在设置器中实现它:
private string title;
public string Title
{
get{ return title;}
set
{
// Logging Code Here
title = value;
}
}
总而言之,属性很简洁,功能很明显,就像一个字段一样,但是具有方法的所有功能和灵活性。
答案 2 :(得分:0)
功能相同。但是,它使代码更具可读性和可理解性。
在您的示例中,您通过调用rating
或RatingSetter
来验证RatingMethod
。考虑到您在团队中工作,而您的同事并不了解验证方法,只需致电this.rating = someValue
。对于您的示例,将没有任何验证。我的代码示例(未经测试)确保对每个分配的值都进行验证。
private string rating {
get { return this.rating; }
set
{
if (value == "PG" || value == "PG-13" || value == "R")
{
rating = value;
}
else
{
throw new UnknownRatingException();
}
}
}
public Book(string title, string author, string rating)
{
this.title = title;
this.author = author;
this.rating = rating //the set property is called
}