oop - 如何在类外修改可变类?
问题描述
我了解封装的需要和声明为的类中的变量
public String VariableName{get; set; } or
private string _variableName;
public string VariableName {
get {
return _variableName;
}
set {
_variableName=value;
}
}
我理解这样做的原因之一是避免线程在竞争条件下访问变量并更改类属性。但这可能不仅仅是这种封装的原因。其他类如何更改此类的变量?我认为要直接访问我们需要使用 static 关键字的属性。否则,只能通过创建此类的对象来更改属性。另外,这实际上是如何封装的?我们可以使用对象的 VariableName 属性访问 _variableName 字段。所以,基本上我们仍然可以访问它。有人可以帮我理解这个概念吗?
TIA。
解决方案
你的问题有很多误解。我建议您查看C# 文档。
首先,使用属性与线程无关。属性是关于控制对类持有的数据的访问的类作者。其中一些控制可能与线程有关。
接口只能声明属性,不能声明字段。因此,接口实现必须使用属性。
static
关键字用于声明属于类型本身而不是特定对象的成员。
至于你的例子:
public String VariableName{get; set; }
这无非是编译器的“语法糖”。编译器将该代码转换为:
[CompilerGenerated]
private string <VariableName>k__BackingField;
public string VariableName
{
[CompilerGenerated]
get
{
return <VariableName>k__BackingField;
}
[CompilerGenerated]
set
{
<VariableName>k__BackingField = value;
}
}
为避免名称冲突,属性的支持字段的名称在 IL 中有效,但在 C# 中无效。
推荐阅读
- visual-studio-code - VS Code:如何同时滚动拆分面板
- python - 用字符串列表标记 Matplotlib 子图 y 轴
- python-3.x - 是否可以使用 Python 中的 ObjectId 字符串更新 MongoDB 字符串字段
- blockchain - 在 Ropsten 网络上部署智能合约
- reactjs - 如何根据 React 中方法的返回值禁用/启用按钮?
- apache-kafka - 代理地址更改后,Kafka Producer 无法重新连接和刷新元数据
- python - 有没有办法使用 python 读取受密码保护的 excel 文件?
- c# - 如何在 C# 中获取 File.Create("Score.txt") 的路径
- rust - 我可以在同一个 fn 中使用 `write!` 和 `file.write_all` 吗?
- angularjs - 为什么javascript中的打印功能在edge中不起作用,但在chrome中起作用