【问题标题】:Accessing class properties inside the class via the this.PropertyGet通过 this.PropertyGet 访问类内的类属性
【发布时间】:2015-06-02 15:42:51
【问题描述】:

我正在为矩阵构建一个 C# 类。我实际上在 SO 上找到了一些可以开始的东西,所以我不必从头开始。这个家伙的类有一个用于矩阵行和列的私有属性以及一个get()set() 属性。有时,这个家伙会通过名称 mRowCountmColumnCount 或类中的 this.RowCountthis.ColumnCount 来引用属性本身,以进行计算,如下所示(我只添加了相关代码):

public class Matrix
{
  private decimal[,] mInnerMatrix;
  private int mRowCount, mColumnCount = 0;

  public int RowCount
  {
    get { return mRowCount; }
  }
  public int ColumnCount
  {
    get { return mColumnCount; }
  }
}

有时在代码中,这个人使用名称 mRowCountmColumnCount 的属性,而其他时候使用 this.RowCountthis.ColumnCount 而不是以前的方式。有什么区别?有一种更好的方法吗?如果是这样的话,关于什么?特别是在布尔方法中,这些方法检查对象/矩阵是对角矩阵、对称矩阵还是方阵,开发人员在循环中使用this.RowCountthis.ColumnCount,这些循环贯穿保存矩阵数据的mInnerMatrix[] 数组.其他时候,他使用这些属性本身。谁能解释为什么有人会这样做或者这是一个错误?我应该使用什么以及应该在整个程序中使用它?

【问题讨论】:

    标签: c# matrix


    【解决方案1】:

    从技术上讲,getset 方法并不那么简单。例如,如果您不存储行数和列数,而是存储行数和总数,则必须将总数除以行数才能得到列数:

    public Cols {get {return _mTotal/_mRows;}}
    

    这不是最好的示例,但您可以理解。在您的简单情况下,使用字段或属性没有区别(如果您实际上有 set 方法但省略了它们,否则属性是只读的!)。但请注意,有一天您可能想在get 中实现一些逻辑。然后使用属性的代码可以正常工作,但使用字段的代码会失败。

    在一个类之外,你总是必须使用属性,如果有的话。实际上,您将声明字段private,以便只有在类中您才能访问它们。从技术上讲,您可以在类之外使用字段和属性,但这会导致混乱。

    另一方面,我不同意在一个类中混合属性和字段访问总是不鼓励的。有时您确实需要此访问权限,最简单的示例是当您的属性为只读时(只有 get)。

    【讨论】:

    • “另一方面,我不同意在一个类中混合属性和字段访问总是不鼓励的。” - 你能举一些混合访问很好的例子吗? get 的示例根本不是示例,正如我提到的“尽可能使用它们”,具有只读属性,事实上,这是不可能的
    • 好的,如果您的get 逻辑需要复杂的同步,但在某些方法中您已经同步,因此可以直接访问该成员怎么办?如果您的get 更新了数据库中的数据,而您在一个方法中刚刚更新了整个对象并且不需要更新的数据怎么办?如果您的set 更新数据库中的数据而您(处于锁定状态)想要一次更新所有对象怎么办?以及许多其他示例。
    • "如果您的集合更新数据库中的数据,而您(处于锁定状态)想要一次更新所有对象怎么办?比我有坏消息要告诉你 - 这意味着 OO 设计中存在一个大问题,并且使用直接成员访问来解决会导致更糟糕的情况......在无法访问属性或属性访问产生某些方面的情况下使用直接访问效果通常意味着麻烦和一团糟
    • 技术上可以为每个字段创建一个属性,然后满足您的建议。因此,我无法展示需要使用字段的场景。但是为了方便起见,您可以使用它,但前提是您知道自己在做什么。作为示例,它肯定不是最好的。在这种情况下,您通常会使用BeginUpdate/EndUpdate 之类的东西,但如果您不想让用户暂停更新直到EndUpdate 并仅在内部使用它,我会说直接使用字段还不错。跨度>
    【解决方案2】:

    如果您定义了属性 - 尽可能在类内部或外部使用它们,因为它们可能包含额外的逻辑,而不仅仅是直接成员访问。

    不使用属性的一个正当理由(改用直接访问) - 在构造函数中, 其他所有访问都应使用属性进行。

    在一个类中混合直接访问和属性是相当糟糕的做法

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 1970-01-01
      • 2011-07-27
      • 2013-07-30
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多