我使用pinvokes调用本机代码。
如果我想创建一个本机对象数组,我目前正在执行以下操作
public class MyClass() {
// allocate a single myClass;
public MyClass() {
_myClass = myclass_create();
_length = 1;
}
public MyClass(int numArgs) {
//pInvoke call to create an array of myclass;
_myClass = myclass_array_create(UIntPtr);
_length = numArgs;
}
//access the indexed element of myclass
public MyClass this[int index] {
get {
MyClass ret = new MyClass();
ret._myClass = myclass_array_element(this._myClass, (UIntPtr)index);
return ret;
}
}
public int Length {
get {
return _length;
}
}
public void foo(){
//lots of other code
}
[DllImport(DLL_IMPORT_TARGET)]
private static extern IntPtr myclass_create();
[DllImport(DLL_IMPORT_TARGET)]
private static extern IntPtr myclass_array_create(UIntPtr numArgs);
[DllImport(DLL_IMPORT_TARGET)]
private static extern IntPtr myclass_array_element(IntPtr args, UIntPtr index);
// ... more dllimports here ...
//pointer to native object
IntPtr _myClass;
int _length;
}
现在使用如下:
// Create an array of 15 MyClass objects
MyClass myClass = new MyClass(15);
for( int i = 0; i < myClass.Length; ++i) {
//run foo on each object in the array
myClass[i].foo()
}
我有这个工作只是发现,对于一个没有做新数组的数组来调用new是有点不寻常的。
有没有办法可以覆盖此类的new运算符,因此可以使用new运算符的典型用法?
我希望代码看起来像这样
// Create an array of 15 MyClass objects
MyClass[] myClass = new MyClass[15];
for( int i = 0; i < myClass.Length; ++i) {
//run foo on each object in the array
myClass[i].foo()
}
有没有办法用我的代码执行此操作?
答案 0 :(得分:1)
不,您不能以任何方式覆盖数组初始化的行为。你需要:
使用包装数组的其他类型,如问题所示。
在创建数组后调用数组上的方法以添加额外的初始化(即为每个索引分配一堆值)。
创建一个新方法,在调用时,将创建并初始化数组。