我有一个真正的函数数组,但是我想将它用作数组。我知道我可以写这些
int var { get{return v2;} }
public int this[int v] { get { return realArray[v]; }
但我如何实现类似数组的函数?我想做点什么
public int pal[int i] { get { return i*2; } }
但是这会出现编译错误
error CS0650: Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type.
error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression)
答案 0 :(得分:10)
在C#中,声明参数化属性的唯一可能方法是索引器。但是,您可以通过创建一个提供索引器的类并向您的类添加该类型的属性来模拟类似的东西:
class ParameterizedProperty<TProperty, TIndex> {
private Func<TIndex, TProperty> getter;
private Action<TIndex, TProperty> setter;
public ParameterizedProperty(Func<TIndex, TProperty> getter,
Action<TIndex, TProperty> setter) {
this.getter = getter;
this.setter = setter;
}
public TProperty this[TIndex index] {
get { return getter(index); }
set { setter(index, value); }
}
}
class MyType {
public MyType() {
Prop = new ParameterizedProperty<string, int>(getProp, setProp);
}
public ParameterizedProperty<string, int> Prop { get; private set; }
private string getProp(int index) {
// return the stuff
}
private void setProp(int index, string value) {
// set the stuff
}
}
MyType test = new MyType();
test.Prop[0] = "Hello";
string x = test.Prop[0];
您可以根据需要从类中删除getter或setter,将该想法扩展为只读和只写属性。
答案 1 :(得分:1)
正如您所注意到的,您不能像这样命名索引器,因此:
public int this[int i] { get { return i * 2; } }
或者,如果你真的开始命名pal
:
public class Wrapper
{
public int this[int i] { get { return i * 2; } }
}
...
public Wrapper pal { get { return _someWrapperInstance; } }
然后可以访问pal[ix]
,pal[3]
等
答案 2 :(得分:1)
要么返回一个数组对象:
public int[] pal { get { return realArray; } }
或者您返回一个具有索引器的对象:
public class ActingAsArray {
private int[] _arr;
public ActingAsArray(int[] arr) { _arr = arr; }
public int this[int v] { get { return _arr[v]; } }
}
public ActingAsArray pal { get { return new ActingAsArray(realArray); } }
答案 3 :(得分:1)
您不能在C#中重载(overloadable operators)括号运算符。正如您所示,您可以做的最好的是实现indexer。根据文档,您必须使用this
关键字来实现索引器。索引器的工作方式与属性非常相似,它们具有getter和setter,您可以在getter或setter中执行任何函数。
答案 4 :(得分:0)
如果你不介意使用一些VB.Net,它支持参数化属性(仍然打败我为什么在C#中不可能,因为.Net显然能够做到这一点)
这样你就可以在VB.Net中创建你的类,只需在你的项目中引用VB.Net DLL。
如果你的班级经常改变,这当然会有点烦人: - /