2

C++

typedef struct someStruct {
   int val1, val2;
   double val3;
} someStruct;

someStruct a [1000] = { {0, 0, 0.0}, {1, 1, 1.0}, ... };

我知道在 C# 中初始化这样一个表的唯一方法是编写类似的东西

class SomeStruct 
{
   int val1, val2;
   double val3;

   public SomeStruct (int val1, int val2, double val3)
   {
      this.val1 = val1;
      this.val2 = val2;
      this.val3 = val3;
   }
}

SomeStruct[] a = new SomeStruct [1000] 
{ 
   new SomeStruct (0, 0, 0.0), 
   new SomeStruct (1, 1, 1.0), 
   ... 
};

有没有办法让一个(引用)类 SomeClass 类型的值数组而不是指向这些值的指针?

编辑:

关键是我想避免为数组中的每个结构调用 new 。所以我想要的是一个包含 1000 个结构的数组,而不是 1000 个指向 (1000) 结构的指针。我问的原因是 C# 处理这个问题的方式对我来说似乎非常低效,涉及大量内存和内存管理开销(例如 C++)。

我试过类似的东西

struct SomeStruct {
   int a, b;
   double c;
   }

SomeStruct[] a = new SomeStruct [1000] { {0,0,0.0}, {1,1,1.0}, ... };

但那是不可能的。因此,尽管我知道结构是值类型,但我得出的结论是,只有在将它们作为参数传递给函数时,这才是正确的,并且我必须使用 new,就像这样(在此处使用结构):

struct SomeStruct {
   int a, b;
   double c;
   SomeStruct (int a, int b, double c) {
      this.a = a; this.b = b; this.c = c;
      }
   }

SomeStruct[] a = new SomeStruct [1000] { 
   new SomeStruct {0,0,0.0}, 
   new SomeStruct {1,1,1.0}, 
   ... 
   };
4

3 回答 3

2

您可以在 C# 中使用 struct 关键字。C# 结构是值类型 - 结构数组是连续存储的结构,与 C++ 标准数组相同。

于 2010-09-01T13:38:01.180 回答
0

您可以通过为 SomeStruct 创建一个新集合(派生自IEnumerable<>)来做到这一点,您在初始化语法中使用的每个项目都会转换为.Add(...)对接口),使用匹配的参数,您可以使用相同的 C++ 语法。

例如。

public class SomeStructCollection : IEnumerable<SomeStruct> {
    private readonly SomeStruct[] someStructs = new SomeStruct[1000];
    private int currentIndex;

    public void Add(int val1, int val2, double val3) {
        someStructs[currentIndex++] = new SomeStruct(val1, val2, val3);
    }

    public SomeStruct this[int index] {
        get { return someStructs[index];
    }

    //Implement IEnumerable<> interface.
}

然后调用代码可以将值包装在某些块中

SomeStructCollection coll = new SomeStructCollection {
    {0, 0, 0.0}, {1, 1, 1.0}, { ... },
};
于 2010-09-01T13:54:05.120 回答
0

这很难看,但这会起作用(如果您将类型更改为struct而不是class

SomeStruct[] a = new SomeStruct [1000];
a[0].val1 = 0;
a[0].val2 = 1;
a[0].val3 = 2.0;
...
a[999].val1 = 0;
a[999].val2 = 1;
a[999].val3 = 2.0;

编辑:

如果这是一个全局字段,则声明astatic readonly.

于 2010-09-01T13:42:24.153 回答