- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在某些情况下,我在类的顶部声明了成员变量,然后还声明了一个属性来访问或设置该成员变量,但我问自己,如果只访问该变量,那么该属性是否是必需的,并且从类内部而不是其他地方设置,那么使用属性访问和设置成员变量而不是直接对成员变量本身进行设置的优点是什么。这是一个例子:
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
,我通常不会为它创建属性。如果它以任何方式暴露在类型之外,出于不同的原因,我总是通过属性暴露它:
此外,如果该字段是通过属性公开的,我总是通过该属性访问它,即使是在类中也是如此。
更新
响应您更新的代码示例:此处的代码设计需要考虑许多事项。
一个典型的建议(我觉得非常好)是“为清晰而写,为性能而测试”。这意味着当你写你的代码时,你首先关心的应该是看代码时是否清楚代码做了什么。这通常(但不总是)比代码的原始速度更重要。当您确定获得速度的位置时,编写速度优化。访问属性会比直接读取字段慢一点,但在大多数情况下,差异可以忽略不计(如果可以测量的话)。
原子性 可能是个问题。根据您的代码示例,我们有字段 speed
,它通过属性 Speed
公开。如果 MultiplySpeed
方法需要对值执行多次更新,则在计算过程中,这些中间值将在不同时间通过 Speed
属性可用。无论您是直接更新字段还是通过属性更新字段,都是如此。在这种情况下,最好先将值放入局部变量,使用它进行计算,然后在完成后将该变量的值赋回给属性。
最后,其他副作用。可能是更改 Speed
的值应该引发事件(例如 SpeedChanged
)。在这种情况下,在计算完成之前不要进行更新也可能是个好主意。
我喜欢将属性视为契约(Contract),将字段视为实现。任何需要该值的人(我的类型的核心除外)都应该使用该契约(Contract)。只有在有充分理由绕过契约(Contract)的情况下,才应依赖实现。
是的,如果您将对字段的访问封装在属性中,自然更改字段名称将需要更少的更新(并且字段名称可能也变得不那么重要)。
我希望这是有道理的,并且不要离题太多;)
关于c# - 成员变量和成员属性之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2283026/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!