如何在类外修改一个可变类?

问题描述 投票:1回答:2

我理解封装的必要性,类中的变量声明为

 public String VariableName{get; set; } or 

 private string _variableName;
 public string VariableName {
    get {
       return _variableName;
    } 
    set {
       _variableName=value;
    }
}

这样做的原因之一我理解是为了避免线程在竞赛条件下访问变量,改变类属性。但这可能不仅仅是这个封装的原因。其他类怎么能改变这个类的变量呢?我想如果要直接访问一个属性,我们需要使用静态关键字。否则,只能通过创建这个类的对象来改变这个属性。另外,这实际上是如何封装的呢?我们可以使用对象的VariableName属性来访问_variableName字段。所以,本质上我们还是可以访问它的。谁能帮我理解一下这个概念?

TIA。

oop c#-6.0 object-oriented-analysis
2个回答
0
投票

所以,当你把你的值创建为private时,它只能被你创建的类访问。即使你创建了那个对象的实例,你也不能直接调用其他类里面的私有变量。这就是我们创建get和set方法的原因。这可以让我们在每次调用该对象的时候,改变我们想要改变的东西。所以如果在某个地方被调用了,那一定是故意的而不是偶然的。其实这是我知道的。

编辑 : 另外,当你对你的变量使用FINAL时,在任何条件下它都不会被任何东西改变。所以这也是我们为什么要用final的原因。


0
投票

你的问题中有不少误区。我建议你检查一下 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#中无效。

© www.soinside.com 2019 - 2024. All rights reserved.