gpt4 book ai didi

c# - 成员变量和成员属性之间的区别?

转载 作者:可可西里 更新时间:2023-11-01 03:05:35 26 4
gpt4 key购买 nike

在某些情况下,我在类的顶部声明了成员变量,然后还声明了一个属性来访问或设置该成员变量,但我问自己,如果只访问该变量,那么该属性是否是必需的,并且从类内部而不是其他地方设置,那么使用属性访问和设置成员变量而不是直接对成员变量本身进行设置的优点是什么。这是一个例子:

public class Car
{

int speed; //Is this sufficient enough if Car will only set and get it.

public Car(int initialSpeed)
{
speed = initialSpeed;
}

//Is this actually necessary, is it only for setting and getting the member
//variable or does it add some benefit to it, such as caching and if so,
//how does caching work with properties.
public int Speed
{
get{return speed;}
set{speed = value;}
}

//Which is better?
public void MultiplySpeed(int multiply)
{
speed = speed * multiply; //Line 1
this.Speed = this.Speed * multiply; //Line 2

//Change speed value many times
speed = speed + speed + speed;
speed = speed * speed;
speed = speed / 3;
speed = speed - 4;

}
}

在上面,如果我没有 Speed 属性来设置和获取可变速度,并且我决定将 int speed 更改为 int spd,我将不得不在所有使用它的地方将 speed 更改为 spd,但是,如果我使用诸如 Speed 之类的属性来设置和获取速度,我只需要在属性的获取和设置中将速度更改为 spd,所以在我的 MutilplySpeed 方法中,像上面这样的东西 this.Speed = this.Speed + this .Speed + this.Speed 不会断。

最佳答案

如果变量是 private ,我通常不会为它创建属性。如果它以任何方式暴露在类型之外,出于不同的原因,我总是通过属性暴露它:

  • 今天可能没有必要,但如果以后有必要,那将是一个重大改变
  • 数据绑定(bind)仅适用于属性,不适用于字段(我认为,不是大数据绑定(bind)用户)
  • 它允许在访问值时插入验证、日志记录和断点

此外,如果该字段是通过属性公开的,我总是通过该属性访问它,即使是在类中也是如此。

更新
响应您更新的代码示例:此处的代码设计需要考虑许多事项。

  • 可读性与速度
  • “原子性”
  • 其他副作用

一个典型的建议(我觉得非常好)是“为清晰而写,为性能而测试”。这意味着当你写你的代码时,你首先关心的应该是看代码时是否清楚代码做了什么。这通常(但不总是)比代码的原始速度更重要。当您确定获得速度的位置时,编写速度优化。访问属性会比直接读取字段慢一点,但在大多数情况下,差异可以忽略不计(如果可以测量的话)。

原子性 可能是个问题。根据您的代码示例,我们有字段 speed,它通过属性 Speed 公开。如果 MultiplySpeed 方法需要对值执行多次更新,则在计算过程中,这些中间值将在不同时间通过 Speed 属性可用。无论您是直接更新字段还是通过属性更新字段,都是如此。在这种情况下,最好先将值放入局部变量,使用它进行计算,然后在完成后将该变量的值赋回给属性。

最后,其他副作用。可能是更改 Speed 的值应该引发事件(例如 SpeedChanged)。在这种情况下,在计算完成之前不要进行更新也可能是个好主意。

我喜欢将属性视为契约(Contract),将字段视为实现。任何需要该值的人(我的类型的核心除外)都应该使用该契约(Contract)。只有在有充分理由绕过契约(Contract)的情况下,才应依赖实现。

是的,如果您将对字段的访问封装在属性中,自然更改字段名称将需要更少的更新(并且字段名称可能也变得不那么重要)。

我希望这是有道理的,并且不要离题太多;)

关于c# - 成员变量和成员属性之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283026/

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