拥有多个具有相同签名的索引器
Having multiple Indexer with the same signature
是否可以有两个或多个具有相同签名的索引器(或类似的东西)?
所以它看起来像这样
private int[,] X;
public int this[int a]
{
set
{
X[a, 0] = value;
}
}
public int this[int a]
{
set
{
X[a, 1] = value;
}
}
这会出错,因为这两种方法都是无名的并且具有相同的签名。那么是否可以命名这些方法但保留设置值的能力。即
C.FirstCol(2) = 3; //Same as C.X[2,0] = 3
C.SecondCol(5) = 4; //Same as C.X[5,1] = 4
编辑:我会尝试更好地解释它:
可以使用属性将行 C.SetX(value)
更改为 C.X = value
。
可以使用索引器
将行C.Set(num, value)
更改为C[num] = value
我想问的是如何更改这些行
C.SetA(num, value)
C.SetB(num, value)
至
C.A[num] = value
C.B[num] = value
或者
C.A(num) = value
C.B(num) = value
没有 A 或 B 作为数组
这不可能 - 编译器如何知道您要使用哪个索引器?并且没有您希望示例中包含的语法。
可以这样介绍方法:
public void FirstCol(int rowIndex, int value)
{
X[rowIndex, 0] = value;
}
和类似的第二列等。但老实说,我看不出有什么意义。也许引入二维索引器会更好?
您可以创建索引包装器:
class Indexer
{
private int[,] data;
private int index;
public Indexer(int index, int[,] data)
{
this.index = index;
this.data = data;
}
public int this[int a]
{
set {data[a,index] = value;}
}
}
然后在您的代码中使用它:
class Foo
{
private int[,] data;
private readonly Indexer first;
private readonly Indexer second;
public Foo()
{
first = new Indexer(0, data);
second = new Indexer(1, data);
}
public Indexer First
{
get{ return first;}
}
public Indexer Second
{
get{ return second;}
}
}
现在你可以说:
Foo f = new Foo();
f.First[2] = 3;
f.Second[5] = 4;
这个答案是示范性的,但不一定实用。如果你这样定义 class:
class Indexer<TKey, TValue>
{
Func<TKey, TValue> getter;
Action<TKey, TValue> setter;
public Indexer(Func<TKey, TValue> getter, Action<TKey, TValue> setter)
{
this.getter = getter;
this.setter = setter;
}
public TValue this[TKey key]
{
get { return getter(key); }
set { setter(key, value); }
}
}
你可以这样使用它:
Indexer<int, int> firstColumn = new Indexer<int, int>(
i => X[i, 0],
(i, v) => X[i, 0] = v);
public Indexer<int, int> FirstColumn
{
get { return firstColumn; }
}
Indexer<int, int> secondColumn = new Indexer<int, int>(
i => X[i, 1],
(i, v) => X[i, 1] = v);
public Indexer<int, int> SecondColumn
{
get { return secondColumn; }
}
哪个会让你这样做:
C.FirstColumn[2] = 3;
C.SecondColumn[4] = 5;
但是,我不建议这样做!简单地使用方法 Set(int i, int j, int value)
或索引器 int this[int i, int j]
.
会更直接
您可以使用二维索引器(如果我理解正确的话!):
private int[,] X;
public int this[int row, int column]
{
set
{
X[row, column] = value;
}
}
像这样使用:
C[2, 0] = 3;
C[5, 1] = 4;
是否可以有两个或多个具有相同签名的索引器(或类似的东西)?
所以它看起来像这样
private int[,] X;
public int this[int a]
{
set
{
X[a, 0] = value;
}
}
public int this[int a]
{
set
{
X[a, 1] = value;
}
}
这会出错,因为这两种方法都是无名的并且具有相同的签名。那么是否可以命名这些方法但保留设置值的能力。即
C.FirstCol(2) = 3; //Same as C.X[2,0] = 3
C.SecondCol(5) = 4; //Same as C.X[5,1] = 4
编辑:我会尝试更好地解释它:
可以使用属性将行 C.SetX(value)
更改为 C.X = value
。
可以使用索引器
将行C.Set(num, value)
更改为C[num] = value
我想问的是如何更改这些行
C.SetA(num, value)
C.SetB(num, value)
至
C.A[num] = value
C.B[num] = value
或者
C.A(num) = value
C.B(num) = value
没有 A 或 B 作为数组
这不可能 - 编译器如何知道您要使用哪个索引器?并且没有您希望示例中包含的语法。
可以这样介绍方法:
public void FirstCol(int rowIndex, int value)
{
X[rowIndex, 0] = value;
}
和类似的第二列等。但老实说,我看不出有什么意义。也许引入二维索引器会更好?
您可以创建索引包装器:
class Indexer
{
private int[,] data;
private int index;
public Indexer(int index, int[,] data)
{
this.index = index;
this.data = data;
}
public int this[int a]
{
set {data[a,index] = value;}
}
}
然后在您的代码中使用它:
class Foo
{
private int[,] data;
private readonly Indexer first;
private readonly Indexer second;
public Foo()
{
first = new Indexer(0, data);
second = new Indexer(1, data);
}
public Indexer First
{
get{ return first;}
}
public Indexer Second
{
get{ return second;}
}
}
现在你可以说:
Foo f = new Foo();
f.First[2] = 3;
f.Second[5] = 4;
这个答案是示范性的,但不一定实用。如果你这样定义 class:
class Indexer<TKey, TValue>
{
Func<TKey, TValue> getter;
Action<TKey, TValue> setter;
public Indexer(Func<TKey, TValue> getter, Action<TKey, TValue> setter)
{
this.getter = getter;
this.setter = setter;
}
public TValue this[TKey key]
{
get { return getter(key); }
set { setter(key, value); }
}
}
你可以这样使用它:
Indexer<int, int> firstColumn = new Indexer<int, int>(
i => X[i, 0],
(i, v) => X[i, 0] = v);
public Indexer<int, int> FirstColumn
{
get { return firstColumn; }
}
Indexer<int, int> secondColumn = new Indexer<int, int>(
i => X[i, 1],
(i, v) => X[i, 1] = v);
public Indexer<int, int> SecondColumn
{
get { return secondColumn; }
}
哪个会让你这样做:
C.FirstColumn[2] = 3;
C.SecondColumn[4] = 5;
但是,我不建议这样做!简单地使用方法 Set(int i, int j, int value)
或索引器 int this[int i, int j]
.
您可以使用二维索引器(如果我理解正确的话!):
private int[,] X;
public int this[int row, int column]
{
set
{
X[row, column] = value;
}
}
像这样使用:
C[2, 0] = 3;
C[5, 1] = 4;