【问题标题】:c# update attribute via reference or methodc# 通过引用或方法更新属性
【发布时间】:2012-04-12 11:16:28
【问题描述】:

有点菜鸟的问题,但是:

我有一个自定义类定义为:

public class Icon
{
    string name;
int value;
public void setName(string nameIn)
{
    name = nameIn;
}
public void setValue(int valueIn)
{
    value = valueIn;
}
}

使用以下方法从同一应用程序域中的另一个类更新对象属性(在本例中为 Icon 类型的数组)是否更好:

fm.iconData[0].setName("Plum");

或者通过将 Icon 类中的实例变量修饰符更改为“public”并使用来设置是否更好:

fm.iconData[0].name = "Plum";

这是否打破了任何 OO 设计概念?

【问题讨论】:

  • 它没有回答你的问题,但通常我会倾向于使用属性而不是方法。 public string Name { get; set; } 或更多等同于您的 public string Name { private get; set; }

标签: c# object methods


【解决方案1】:

两者都没有。在这种情况下,使用属性而不是公共字段或显式 setter/getter 方法:

public class Icon
{
    public string Name {get;set;}
}

属性被编译为 setter/getter 方法,允许您稍后在需要时更改内部实现,因此仍然尊重封装。显式 setter/getter 方法不适用于 C#。

另见MSDN on properties

【讨论】:

    【解决方案2】:

    Name 是一个简单属性的明显示例。将其设为属性(不是公共字段)并为其赋值:

    fm.iconData[0].Name = "Plum";
    

    像这样定义这个属性:

    public string Name {get;set;}
    

    【讨论】:

    • 试一试——完美。有点奇怪,因为我可以像访问公共实例变量一样访问属性(这会破坏封装) - 但如果这就是属性存在的原因,那么我很喜欢它。
    • 属性看起来像变量,但如果需要,它们可以做更多的事情。它们应该保持简单,否则应该用返回值的方法替换。
    【解决方案3】:

    正如其他人所说,这应该是一个属性。如果您计划为属性添加额外的逻辑(例如验证、引发事件),您可以像这样定义属性:

    public class Icon
    {
        string name;
        public string Name
        {
            get { return name; }
            set
            {
                // custom logic can go here...
                name = value; // value is whatever has been set to this property
            }
        }
    }
    

    name 仅在类中可见,因为它是私有的。 Name 在外部可见。

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2020-12-24
      • 2011-01-23
      • 2019-05-07
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多