重写c#类数组的默认new操作符

本文关键字:默认 new 操作符 数组 重写 | 更新日期: 2023-09-27 18:11:04

我使用pinvoke来调用本机代码。

如果我想创建一个本机对象的数组,我目前做以下操作

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操作符,以便可以使用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()
} 

有办法做到这一点与我的代码?

重写c#类数组的默认new操作符

不,您不能以任何方式重写数组初始化的行为。您需要:

  1. 使用不同的类型来包装数组,如问题中所示。

  2. 在创建数组后调用一个方法来添加额外的初始化(即为每个索引分配一堆值)

  3. 创建一个新方法,当被调用时,将创建并初始化数组。