0

在我所有的研究中,我了解到,当我想让用户访问内部属性时,我不应该直接访问该属性,而是通过 get/set 方法进行访问,例如:

class myClass
{
    private int x;

    public void SetX (int x)
    {
        this.x = x;
    }

    public int GetX ()
    {
        return this.x
    }
}

因为它提供了额外的好处,允许程序员更轻松地完全更改引擎而不影响用户,更容易调试并提供更多用于检查输入有效性的选项。

然而,自从我开始学习和编写 C# 以来,我注意到大多数语言“原生”的类都暴露了它们的属性,例如,设置/获取矩形 ( System.Drawing.Rectangle) 的位置或大小,您可以简单地访问直接X, Y,WidthHeight属性。

  • 我看到公开属性的唯一好处是代码更简单一些。暴露属性还有其他好处吗?

  • 我什么时候应该公开属性,什么时候不应该?

4

4 回答 4

2

你混淆了属性和字段。在 C# 中,属性可以像公共字段一样使用,但在内部调用它们的 get/set 方法。例如,您的具有属性的类如下所示:

class MyClass
{
    // Field, direct access to the internal representation
    private int x; 

    // Property, access via methods, but syntax like field access
    public int X {
        get { return this.x; } // generates a get-method "int get_X()"
        set { this.x = value; } // generates a set-method "void set_X(int value)"
    }
}

当您现在像这样设置属性 X:myClass.X = 42时,编译器会将其转换为myClass.set_X(42),这会调用set块中声明的方法。类似字段的语法只是为了方便。

因此,您确实应该更喜欢公开 set/get-methods。只是在 C# 中,这样做的首选方式是通过属性,它抽象出这些方法的实际调用,并允许您像字段一样使用它们。

于 2013-03-25T08:02:06.120 回答
1

所以基本上,你的问题是属性与公共变量。什么时候用什么?

阅读这篇文章,包括评论。

整个讨论的快速总结:

  • 反射在变量和属性上的工作方式不同,所以如果你依赖反射,
    使用所有属性会更容易。
  • 您不能对变量进行数据绑定。
  • 将变量更改为属性是一项重大更改。

公开数据成员的琐碎属性实现是大量代码,没有或几乎没有收益,只有合理的原因可以是:

  • 提供对由于某种原因无法声明为 const 的成员 var 的只读访问权限

  • 如果您正在编写一个供某些第 3 方使用的组件,并且有可能必须替换该组件而无需这些用户重新构建(将公共成员变量更改为属性会破坏接口,所以需要重建)。

此外,将公共字段包装在属性中,有两个原因 - 一个是您以后不能在不破坏二进制兼容性的情况下更改它。二是你不能绑定到字段。

Reflection code against fields looks very different from reflection code against 
properties (FieldInfo vs. PropertyInfo for starters). So even if you can 
recompile against the new binary, if you use reflection on that field 
you're hosed.
于 2013-03-25T07:51:32.150 回答
0

就像您说的那样,不直接访问您的变量的好处是您可以更改实现,而无需对您的类的用户进行任何更改。在面向对象编程方面,我认为这是一件重要的事情。

此外,通过使用属性,您仍然可以影响“get”或“set”的工作。这在某些情况下可能很有用。

于 2013-03-24T14:51:29.543 回答
0

在 C# 中,您使用属性而不是 getter/setter 方法,因为它们提供相同的功能。请注意,字段!= 属性。请参阅MSDN:属性

于 2013-03-24T14:41:33.143 回答