gpt4 book ai didi

c# - 为什么我们要在类内部创建一个私有(private)变量,然后设置属性?

转载 作者:太空狗 更新时间:2023-10-29 19:58:14 25 4
gpt4 key购买 nike

为什么我们要在类中创建一个私有(private)变量,然后在 C# 中的以下几行中从中创建一个公共(public)属性?我也不明白获取和设置属性的概念。

我的意思是我们为什么要这样做

 public class MyClass
{
private string _myProperty;

public string MyProperty
{
get
{ return _myProperty; }
set
{ _myProperty = value; }
}

或者这个

public class MyClass
{
public string MyProperty {get;set;}
}

我的问题与这个非常相似: Why do we need to create class variables to get and set a property?

上面的帖子似乎没有解决我的问题。有人,请详细说明:

  • 为什么要先创建私有(private)变量,然后再从中创建公共(public)属性?为什么不一步呢?
  • 我们需要“获取”和“设置”什么?为什么有两种使用方法,有什么区别?

问题的答案可能太长。但是,即使您花费宝贵的时间只是为了正确解释一个点,我也非常乐意。提前致谢:)

最佳答案

将一个字段设为私有(private)并将其作为属性公开,赋予类控制设置和获取操作的权力,这在不同的场景中很有用。

验证

该类可以在将提供的数据存储到字段之前验证提供的数据:

class WeatherInfo {
private static readonly int minDegree = -273;
private static readonly int maxDegree = 75;
private int degree;
public int Degree {
get {
return this.degree;
}
set {
if (value < minDegree || value > maxDegree) {
throw new ArgumentOutOfRangeException();
}
}
}
..
..
}

无效字段值

在某些情况下,对象的字段可能没有有意义的值。提供一个 getter 方法,允许对象通知它的客户端。

class User {
private DateTime loginTime;
private bool loggedIn;
..
..
public DateTime LoginTime {
get {
if (!this.loggedIn) {
throw new InvalidOperationException();
}
return loginTime;
}
}
}

不提供二传手,或限制对二传手的访问

使用属性而不是字段的另一个好处是它允许对象限制对字段的访问。在前面的例子中,我们有一个没有 setter 的方法。这种方法的另一个用途是限制对 setter 的访问。

class Customer {
private string name;
private string family;
private string nameFamily;

public string name {
get {
return this.name;
}
private set {
if (!string.Equals(name, value)) {
this.name = value;
this.UpdateNameFamily();
}
}
}
private void UpdateNameFamily() {
this.nameFamily = string.Format("{0} {1}", this.name, this.family);
}
..
..
}

如您所见,这种方法的好处是它允许类在类内部更改属性时执行某些操作。

引发事件

用于引发 XXXXChanged 事件的常见模式是检查 setter 中的值并在更改时引发事件:

class Question {
public event EventHandler AnsweredChanged;
private bool isAnswered;
..
..
public bool IsAnswered {
get {
return this.isAnswered;
}
set {
if (this.isAnswered != value) {
this.OnIsAnsweredChanged();
}
}
}
private void OnIsAnsweredChanged() {
if (this.AnsweredChanged!= null) {
this.AnsweredChanged(this, EventArgs.Empty);
}
}
}

这种方法的另一个常见用途是实现 INotifyPropertyChanged界面。

无逻辑模型

即使您不需要任何可以通过属性实现的功能,并且您有一个无逻辑的类,最好的做法是不要将类字段暴露给类的外部世界。在这种情况下,您可以简单地使用自动属性作为遵循最佳实践的快捷方式,而无需直接定义字段。

class UserModel {
public string Username {
get;
set;
}
public DateTime Birthdate {
get;
set;
}
..
..
}

关于c# - 为什么我们要在类内部创建一个私有(private)变量,然后设置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29937629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com