我理解封装的必要性,类中的变量声明为
public String VariableName{get; set; } or
private string _variableName;
public string VariableName {
get {
return _variableName;
}
set {
_variableName=value;
}
}
这样做的原因之一我理解是为了避免线程在竞赛条件下访问变量,改变类属性。但这可能不仅仅是这个封装的原因。其他类怎么能改变这个类的变量呢?我想如果要直接访问一个属性,我们需要使用静态关键字。否则,只能通过创建这个类的对象来改变这个属性。另外,这实际上是如何封装的呢?我们可以使用对象的VariableName属性来访问_variableName字段。所以,本质上我们还是可以访问它的。谁能帮我理解一下这个概念?
TIA。
所以,当你把你的值创建为private时,它只能被你创建的类访问。即使你创建了那个对象的实例,你也不能直接调用其他类里面的私有变量。这就是我们创建get和set方法的原因。这可以让我们在每次调用该对象的时候,改变我们想要改变的东西。所以如果在某个地方被调用了,那一定是故意的而不是偶然的。其实这是我知道的。
编辑 : 另外,当你对你的变量使用FINAL时,在任何条件下它都不会被任何东西改变。所以这也是我们为什么要用final的原因。
你的问题中有不少误区。我建议你检查一下 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#中无效。