【问题标题】:Instantiate an array of objects, in simpliest way?以最简单的方式实例化一个对象数组?
【发布时间】:2012-03-09 03:31:31
【问题描述】:

给定一个类:

class clsPerson { public int x, y; }

有没有办法创建这些类的数组,每个元素都初始化为(默认)构造实例,而无需在 for 循环中手动执行,例如:

clsPerson[] objArr = new clsPerson[1000];

for (int i = 0; i < 1000; ++i)
    objArr[i] = new clsPerson();

我可以缩短 N 个对象数组的声明和实例化吗?

【问题讨论】:

  • 只是好奇:为什么将其命名为 clsPerson 而不是 Person?很明显,它是一个类——大多数东西都是类。
  • @Maniekb:Reed 的回答使用了三个循环。 Range中有一个循环,Select中有一个循环,ToArray中有一个循环。这比您需要的两个 more 循环。如果您想避免循环,那么您必须不惜一切代价避免使用 LINQ;它只不过是循环。
  • @phoog:延迟执行循环仍然是一个循环。这样看:假设您现在编写了 Range、Select 和 ToArray 的代码。 “for/foreach/while/etc”会在结果代码中出现多少次?我说如果“for”在代码中出现了 3 次,那么该代码中有 3 个循环。
  • @phoog:当然。但是那个内部枚举器只不过是一堆条件 goto,它们一遍又一遍地分支回到同一个地方,直到满足一个条件。这就是我定义一个循环的方式:一个有条件的 goto,它分支回到之前执行的代码,直到满足一个条件。

标签: c# arrays object constructor new-operator


【解决方案1】:

在这种情况下,必须为数组中的每个项目运行构造函数。无论您是否使用循环、集合初始化程序或辅助方法,都必须访问数组中的每个元素。

如果您只是在寻找一种方便的语法,尽管您可以使用以下语法

public static T[] CreateArray<T>(int count) where T : new() {
  var array = new T[count];
  for (var i = 0; i < count; i++) {
    array[i] = new T();
  }
  return array;
}

clsPerson[] objArary = CreateArray<clsPerson>(1000);

【讨论】:

    【解决方案2】:

    如果这样做有意义,您可以将class clsPerson 更改为struct Personstructs 总是有一个默认值。

    【讨论】:

      【解决方案3】:

      您必须为每个项目调用构造函数。如果不构造每个项目,就无法分配数组并在项目上调用类构造函数。

      您可以使用以下方法从循环中缩短它(一点点):

      clsPerson[] objArr = Enumerable.Range(0, 1000).Select(i => new clsPerson()).ToArray();
      

      不过,就我个人而言,我仍然会分配数组并循环遍历它(和/或将其移动到辅助例程中),因为它非常清晰且仍然相当简单:

      clsPerson[] objArr = new clsPerson[1000];
      for (int i=0;i<1000;++i) 
         clsPerson[i] = new clsPerson(); 
      

      【讨论】:

      • 嗯,我知道这很简单,但我看到了许多功能,例如: List list = new List({1,2,3});或 foreach(string in new string[]{"aaa", "bbb"})
      • @Maniekb 好吧,正如我所说 - 你可以使用 LINQ 来做,但在这种情况下我个人会避免它......
      • @Maniekb 当然,如果您想在初始化程序中输入 new clsPerson() 1000 次,您当然可以使用数组初始化程序语法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      相关资源
      最近更新 更多