c# - 在类中使用支持字段
问题描述
在我们使用带有支持字段的属性的情况下,就OOP和封装而言,直接访问这些支持字段是一种好习惯,还是我们应该始终通过类属性?
public class SomeClass
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value == null ? "" : value; }
}
public void SetField()
{
...
_name = "alice";
...
}
public void SetProperty()
{
...
Name = "bob";
...
}
}
我的直觉是始终使用该属性,并且永远不要使用该字段,除非在 getter/setter 中,但我不知道这是个人偏好还是有首选标准或规则。
只是为了澄清一下,因为我不想被误解,我知道设置_name
是Name
不同的东西,我不是在问像我的例子中这样的二传手是否是个好主意。
编辑:我没有问我是否以及何时应该使用重复的问题/答案提及的自动属性。
解决方案
由于属性只不过是围绕支持字段的获取和设置方法,因此它们通常会实现一些在您访问该属性时应该运行的逻辑 - 最常见的是一些验证。
例如,想象一下代表一个人年龄的以下属性:
int Age { get; set; }
没有任何逻辑,您可以将任何int 分配给该属性,例如负值。因此,您在 setter 中引入了一些验证:
int Age {
{ get => return _age; }
{ set => _age = value > 0 ? value : 0 }
}
在您的班级中,您通常可以控制正在设置的值。话虽如此,没有真正需要验证输入。但是,我觉得最好还是这样做,以便拥有单点成员访问权限。此外,当您的班级变大时,很容易忘记有效的实际含义。因此,您可能很容易编写以下代码,这会在执行代码时让您头疼,因为它绕过了您的验证:
_age = -10;
事实上,它很少那么简单。您必须扫描所有可能触及支持字段的位置,以确定无效值的来源。
所以我更喜欢在声明类中使用属性。
推荐阅读
- c - C中三角形的周长
- node.js - 使用 Node / PostgreSQL 将相同的 UUID 发布到两个表中
- php - 防止用户角色更改 woocommerce 订单状态
- javascript - JS 中的 DISCORD 自我机器人
- mysql - 使用 MySQL 在日历中搜索空闲时间
- nginx - 我可以使用 Nginx 将 mp4 文件转换为 HLS 格式吗?
- python - 查找轮廓内的网格点
- javascript - Express JS:车把“每个”标签不显示内容
- python - 自动删除标签缩进的不和谐嵌入消息
- html - Bulma CSS 响应性不适用于 Bulma Carousel 或图像