【问题标题】:How can a mutable class be modified outside the class?如何在类外修改可变类?
【发布时间】:2020-08-26 07:09:50
【问题描述】:

我了解封装的必要性以及声明为

的类中的变量
 public String VariableName{get; set; } or 

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

我理解这样做的原因之一是避免线程在竞争条件下访问变量并更改类属性。但这可能不仅仅是这种封装的原因。其他类如何更改此类的变量?我认为要直接访问我们需要使用 static 关键字的属性。否则,只能通过创建此类的对象来更改属性。另外,这实际上是如何封装的?我们可以使用对象的 VariableName 属性访问 _variableName 字段。所以,基本上我们仍然可以访问它。有人可以帮我理解这个概念吗?

TIA。

【问题讨论】:

    标签: oop c#-6.0 object-oriented-analysis


    【解决方案1】:

    因此,当您将值创建为私有时,它只能由您创建的类访问。即使您创建了该对象的实例,也不能直接调用另一个类中的私有变量。这就是我们创建 get 和 set 方法的原因。这使我们可以在调用该对象时更改我们想要更改的有关该对象的内容。因此,如果它在某个地方被调用,那一定是故意的,而不是偶然的。其实这是我所知道的。

    编辑:此外,当您对变量使用 FINAL 时,它永远不会被任何情况下的任何东西改变。所以这就是我们也使用 FINAL 的原因。

    【讨论】:

    • 例如,我用 Java 编写代码,当我使用 int final x = 5; x 的值始终为 5。即使您创建了一个 set 方法,它也无法更改它。这可能是您想要的想法。所以它是一经创建就无法更改的。
    • 在 C# 中,即readonly,它只是语言概念。该字段可以通过反射来改变。
    【解决方案2】:

    您的问题存在不少误解。我建议你检查C# documentation

    首先,使用属性与线程无关。属性是关于类作者控制对类所持有的数据的访问。其中一些控制可能与线程有关。

    接口只能声明属性,不能声明字段。所以,接口实现必须使用属性。

    static keyword 用于声明属于类型本身而非特定对象的成员。

    至于你的例子:

    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# 中无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2014-05-19
      相关资源
      最近更新 更多