这个问题已经在这里有一个答案:
我问一个推荐使用getter和setter。我写了相同的代码有两种版本:使用getter和setter,并只使用类方法。我不能清楚地看到它们之间的区别。
我与私营领域的评价写的类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。
getter和setter方法只是语法糖。编译器将编译你的getter和setter到getter和setter方法最终。因此,通过自己编写getter和setter方法,你是那种做编译器的工作。
因此,我建议你使用getter和setter,因为他们的主要目的之一是取代getter和setter方法。
下面是使用getter和setter的其他一些优点:
public int Property { get; set; }
obj1.Property += obj2.Property;
同
obj1.SetProperty(obj1.GetPropert() + obj2.GetProperty());
我觉得后者只是有太多的括号...属性是,提供了一个灵活的机制来读,写,或计算私有字段的值的构件。
这基本上是他们的话说,属性是特定目的建造的成员,在纯粹的包装和访问私有成员,使之道“的数据可以很容易地访问,并仍然有助于促进的方法的安全性和灵活性。”
在你的榜样,我会重新命名RatingSetter
只是Rating
和对待它,就好像你将一个正常的公共领域。这促进了易用性,当其他人使用你的代码减轻混乱。这是比较明显的,需要做的事情,你在做什么。
这也是不可取的,有公共领域,e.g public string title;
相反,它通常是更好的选择使用属性来包装这个领域并使其私人例如
private string title;
public string Title {get; set;}
然后,您可以使用公共财产类之外,但现在有超过当有人访问或设置变量会发生什么更多的控制。
private string title;
public string Title {get; private set;}
这将只允许读取外部类的访问。
日志是现在更容易,因为你可以在setter方法实现:
private string title;
public string Title
{
get{ return title;}
set
{
// Logging Code Here
title = value;
}
}
所以总结一下,属性是简洁,功能明显,像场,但所有的力量和方法的灵活性。
该功能是相同的。但它使代码更易于阅读和理解。
在您的例子中,你通过调用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
}