具有渗透力的C#属性获取器和设置器

时间:2018-07-19 10:50:50

标签: c# getter-setter

我正在创建一个矩阵类,所以我已经有一个

public double this[int row, col]

但是我也想以类似的方式轻松地设置和获取特定的行或列。我目前有:

public virtual Vector GetRow(int row)
{
    return m[row];
}

public virtual void SetRow(int row, Vector v)
{
    m[row] = v;
}

public virtual Vector GetCol(int col)
{
    return Transpose().m[col];
}

public virtual void SetCol(int col, Vector v)
{
    Matrix temp = Transpose();
    temp.SetRow(col, v);
    temp =  temp.Transpose();
    m = temp.m;
}

但是我想要的是这样的:

public virtual Vector Row(int row)
{
    get => return m[row];
    set => m[row] = value;
}

public virtual Vector Col(int col)
{
    // getter and setter logic here
}

有没有办法做到这一点?还是我绝对需要使用我创建的方法?我知道我可以按照自己想要的方式来做行或列,但是,并非我都不认为。

3 个答案:

答案 0 :(得分:1)

为此,您需要了解属性的概念,让我们看一下Microsoft docs

  

属性结合了字段和方法的方面。给的用户   一个对象,一个属性似乎是一个字段,访问该属性   需要相同的语法。对于类的实现者,属性是   一个或两个代码块,分别代表一个get访问器和/或一组   访问器。在以下情况下执行get访问器的代码块:   属性被读取;设置访问器的代码块在以下情况下执行   该属性被分配了一个新值。没有集合的属性   访问器被认为是只读的。没有获取访问器的属性是   被认为是只写的。具有两个访问者的属性是   读写。

     

与字段不同,属性未分类为变量。因此,   您不能将属性作为ref或out参数传递。

此行很重要:与字段不同,属性未归类为变量。因此,您不能将属性作为ref或out参数传递。

含义:您无法传递参数来获取和设置属性。它们在此处为Accessors-它们以对属性进行读\写的方式像变量一样起作用,但是您不能将它们视为字段。

它们为什么存在?

  
      
  1. 在每次访问或值突变的开始说“ get and set”很烦人,分心。

  2.   
  3. 提供对实际变量的直接访问会破坏封装,因此这不是一个选择。

  4.   

的意思是,它们在这里与OO编程概念一样有帮助-保持封装,并且它们是在程序中将值分配给变量的更简单方法。

答案 1 :(得分:0)

c#中的所有indexers被命名为this。它们可以被重载,因此您还可以实现:

public Vector this[int row]

public double this[int row, col]完全相同。但是,我们会注意到列和行的索引是相同的类型,因此您只能对列进行此操作(因为不能有两个具有相同签名的重载)。在这一点上,您必须确定这样做的好处是否大于打破对称性的机会。

答案 2 :(得分:0)

所以,在大家卸载了这个问题后稍加思考(由^-^提供的有用信息),我得出了一个效果很好的解决方案

    public enum RowCol {row, col}

    public Vector this[RowCol set, int rowcol]
    {
        get
        {
            switch (set)
            {
                case RowCol.col:
                    return Transpose().m[rowcol];

                default:
                    return m[rowcol];
            }
        }
        set
        {
            switch (set)
            {
                case RowCol.col:
                    Matrix temp = Transpose();
                    temp[RowCol.row, rowcol] = value;
                    temp = temp.Transpose();
                    m = temp.m;
                    break;

                default:
                    m[rowcol] = value;
                    break;
            }
        }
    }

所以,我认为这是我特定实现的最佳解决方案。感谢您的所有输入和信息。

编辑:由于行是矢量,所以我最终使用了这种解决方案,而不是ref,但是由于要存储列,我必须具有两个变量,因此列是一个构造值。相同的数据,一个用于行,另一个用于列。这对我来说似乎很浪费,而且我仍然需要找出一种无论如何都要同步两个变量的方法。