繁体   English   中英

具有Perameters的C#属性获取器和设置器

[英]C# property getters and setters with perameters

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

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
}

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

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

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

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

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

含义 :您不能传递参数来获取和设置属性。 他们在这里为访问者的 -他们的行为就像在读的方式变量\\写入财产,但你不能把他们当作领域。

它们为什么存在?

  1. 在每次访问或值突变的开头说“获取并设置”令人烦恼和分心。

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

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

c#中的所有索引器都命名为this 它们可以重载,因此您还可以实现:

public Vector this[int row]

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

因此,在大家卸载了这个问题后(考虑了很多有用的信息,由^-^给出了一些思考之后),我得出了一个效果很好的解决方案

    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,因为行是矢量,但是由于要存储列,我必须具有相同数据的两个变量,因此列是一个构造值,一个为行设置,另一个为列设置。 这对我来说似乎很浪费,我仍然需要找出一种方法来同步两个变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM