Getters 和 Setters 与 class 方法
Getters and Setters versus class method
我想问的是关于使用 getter 和 setter 的建议。
我在两个版本中编写了相同的代码:使用 getter 和 setter 以及仅使用 class 方法。而我也看不清它们之间的区别。
我写了 class 本书,评分为私人领域。构造函数 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。
功能相同。但它使代码更具可读性和可理解性。
在您的示例中,您通过调用 RatingSetter
或 RatingMethod
来验证 rating
。假设您在一个团队中工作,而您的同事不知道验证方法,只是调用 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
}
getter 和 setters 只是语法糖。编译器最终会将你的 getters 和 setters 编译成 getter 和 setter methods。因此,通过自己编写 getter 和 setter 方法,您可以完成编译器的工作。
因此,我推荐你使用getters和setters,因为它们的主要目的之一是替代getter和setter方法。
以下是使用 getters 和 setters 的一些其他优点:
Getters 和 setters 如果你只需要 getters 和 setters 而没有任何逻辑,可以为你节省很多时间:
public int Property { get; set; }
在我看来,getters 和 setters 的审美更好看。比较:
obj1.Property += obj2.Property;
和
obj1.SetProperty(obj1.GetProperty() + obj2.GetProperty());
我觉得后者括号太多了。
让 setter 和 getter 靠近 属性 声明。如果你使用getter和setter方法,你可能不小心在属性声明和getter/setter方法之间写了其他方法,导致getter/setter方法缓慢“从 属性 声明中漂移”。下次您想找到它时,您需要上下滚动。对于 getters 和 setters,它们将始终低于 属性 声明。
来自 Microsoft、
A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field.
这基本上是他们说 属性 是一个专门构建的成员的方式,它仅用于包装和访问私有成员,从而启用 "data to be accessed easily and still helps promote the safety and flexibility of methods."
在您的示例中,我会将 RatingSetter
简单地重命名为 Rating
并将其视为普通的 public 字段。当其他人使用您的代码时,这会提高易用性并减少混淆。您正在做什么以及需要做什么会更加明显。
也不建议有 public 个字段,例如 public string title;
相反,通常最好选择使用 属性 来包装此字段并将其设为私有,例如
private string title;
public string Title {get; set;}
然后您可以在 class 之外使用 public 属性,但现在可以更好地控制当有人访问或设置变量时发生的情况。
private string title;
public string Title {get; private set;}
这将只允许从 class 外部进行读取访问。
记录现在更容易了,因为您可以在 setter 中实现它:
private string title;
public string Title
{
get{ return title;}
set
{
// Logging Code Here
title = value;
}
}
总而言之,属性简洁明了,功能明显,就像一个字段,但具有方法的所有功能和灵活性。
我想问的是关于使用 getter 和 setter 的建议。 我在两个版本中编写了相同的代码:使用 getter 和 setter 以及仅使用 class 方法。而我也看不清它们之间的区别。
我写了 class 本书,评分为私人领域。构造函数 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。
功能相同。但它使代码更具可读性和可理解性。
在您的示例中,您通过调用 RatingSetter
或 RatingMethod
来验证 rating
。假设您在一个团队中工作,而您的同事不知道验证方法,只是调用 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
}
getter 和 setters 只是语法糖。编译器最终会将你的 getters 和 setters 编译成 getter 和 setter methods。因此,通过自己编写 getter 和 setter 方法,您可以完成编译器的工作。
因此,我推荐你使用getters和setters,因为它们的主要目的之一是替代getter和setter方法。
以下是使用 getters 和 setters 的一些其他优点:
Getters 和 setters 如果你只需要 getters 和 setters 而没有任何逻辑,可以为你节省很多时间:
public int Property { get; set; }
在我看来,getters 和 setters 的审美更好看。比较:
obj1.Property += obj2.Property;
和
obj1.SetProperty(obj1.GetProperty() + obj2.GetProperty());
我觉得后者括号太多了。
让 setter 和 getter 靠近 属性 声明。如果你使用getter和setter方法,你可能不小心在属性声明和getter/setter方法之间写了其他方法,导致getter/setter方法缓慢“从 属性 声明中漂移”。下次您想找到它时,您需要上下滚动。对于 getters 和 setters,它们将始终低于 属性 声明。
来自 Microsoft、
A property is a member that provides a flexible mechanism to read, write, or compute the value of a private field.
这基本上是他们说 属性 是一个专门构建的成员的方式,它仅用于包装和访问私有成员,从而启用 "data to be accessed easily and still helps promote the safety and flexibility of methods."
在您的示例中,我会将 RatingSetter
简单地重命名为 Rating
并将其视为普通的 public 字段。当其他人使用您的代码时,这会提高易用性并减少混淆。您正在做什么以及需要做什么会更加明显。
也不建议有 public 个字段,例如 public string title;
相反,通常最好选择使用 属性 来包装此字段并将其设为私有,例如
private string title;
public string Title {get; set;}
然后您可以在 class 之外使用 public 属性,但现在可以更好地控制当有人访问或设置变量时发生的情况。
private string title;
public string Title {get; private set;}
这将只允许从 class 外部进行读取访问。
记录现在更容易了,因为您可以在 setter 中实现它:
private string title;
public string Title
{
get{ return title;}
set
{
// Logging Code Here
title = value;
}
}
总而言之,属性简洁明了,功能明显,就像一个字段,但具有方法的所有功能和灵活性。