我正在创建一个矩阵类,所以我已经有一个
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
}
有没有办法做到这一点?还是我绝对需要使用我创建的方法?我知道我可以按照自己想要的方式来做行或列,但是,并非我都不认为。
答案 0 :(得分:1)
为此,您需要了解属性的概念,让我们看一下Microsoft docs:
属性结合了字段和方法的方面。给的用户 一个对象,一个属性似乎是一个字段,访问该属性 需要相同的语法。对于类的实现者,属性是 一个或两个代码块,分别代表一个get访问器和/或一组 访问器。在以下情况下执行get访问器的代码块: 属性被读取;设置访问器的代码块在以下情况下执行 该属性被分配了一个新值。没有集合的属性 访问器被认为是只读的。没有获取访问器的属性是 被认为是只写的。具有两个访问者的属性是 读写。
与字段不同,属性未分类为变量。因此, 您不能将属性作为ref或out参数传递。
此行很重要:与字段不同,属性未归类为变量。因此,您不能将属性作为ref或out参数传递。
含义:您无法传递参数来获取和设置属性。它们在此处为Accessors-它们以对属性进行读\写的方式像变量一样起作用,但是您不能将它们视为字段。
它们为什么存在?
在每次访问或值突变的开始说“ get and set”很烦人,分心。
提供对实际变量的直接访问会破坏封装,因此这不是一个选择。
的意思是,它们在这里与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,但是由于要存储列,我必须具有两个变量,因此列是一个构造值。相同的数据,一个用于行,另一个用于列。这对我来说似乎很浪费,而且我仍然需要找出一种无论如何都要同步两个变量的方法。