[英]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参数传递。
含义 :您不能传递参数来获取和设置属性。 他们在这里为访问者的 -他们的行为就像在读的方式变量\\写入财产,但你不能把他们当作领域。
它们为什么存在?
在每次访问或值突变的开头说“获取并设置”令人烦恼和分心。
提供对实际变量的直接访问会破坏封装,因此这不是一种选择。
意思是,它们在这里与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.