【问题标题】:Instantiate by cycling through list of dimensioned objects通过循环遍历尺寸对象列表来实例化
【发布时间】:2018-07-14 17:14:01
【问题描述】:

有什么办法可以做到这一点 - 这绝对是一种好奇心而不是必需品,基本上只是为了缩短书面代码......但它可能更容易在循环中添加构造函数变量......

代替:

public class item_holder
{
    public item ITEM1 = new item();
    public item ITEM2 = new item();
    public List<item> myItems = new List<item>();

    public item_holder()
    {
        myItems.Add(ITEM1);
        myItems.Add(ITEM2);
    }
}

我们可以有这样的东西吗?

public class item_holder
{
    public item ITEM1;
    public item ITEM2;
    public List<item> myItems = new List<item>();

    public item_holder()
    {
        myItems.Add(ITEM1);
        myItems.Add(ITEM2);

        foreach(item i in myItems)
        {
            i = new item();
        }
    }
}

【问题讨论】:

  • 一开始为什么要在课堂上存储两次相同的items?
  • 为什么item_holder 看起来是一个集合类,会暴露内部集合?集合对象也不需要临时变量。 Guidelines for Collections
  • @UnholySheep 因为我希望它们具有可作为类外部属性访问的特定名称,并且还能够在循环中遍历它们以对它们执行操作
  • 那么为什么不让他们properties呢?例如:public item ITEM1 { get { return myItems[0]; } }?

标签: c#


【解决方案1】:

你的第二个例子在两个方面不会像你想的那样起作用。

1) 不会分配 ITEM1 和 ITEM2 属性。

发生的情况是您将 2 x null 添加到您的 List。那些nulls 不再与ITEM1 或ITEM2 有任何关系。

2) 这 2 个新项目不会分配给您的 List

发生的情况是,foreach 运算符将指向null 的指针传递给变量i,但随后您的赋值只是用另一个指向新项目的指针覆盖了该指针。如果 List 包含除 null 以外的任何内容,也会发生这种情况。您正在覆盖指针。 i 则不再与List 有任何关系。

您似乎混淆了指针和引用。如果这全部使用引用,它将按照您假设的方式工作:对 ITEM1 和 ITEM2 的引用将被添加到列表中,并且它们将被分配一个新项目。不幸的是(对你来说:p),这不是它的工作原理。

【讨论】:

  • 接受了答案,因为没有其他答案,这是最好的解释。
【解决方案2】:

您可以使用for-statment,而不是foreach,后者要求项目已经在列表中

const int MaxCount = 20;

public List<item> myItems = new List<item>();

public item_holder()
{
    // Add 20 items to the list.
    for (int i = 0; i < MaxCount; i++) {
        myItems.Add(new item());
    }
}

使用编号变量的标准方法

string s1;
string s2;
string s3;
// ...
string sN;

如果改为使用数组并索引项目;

string[] s = new string[N];
s[0] = "hello";
s[1] = "world";

【讨论】:

  • 是的,这完全有道理,但我实际上希望我的item 有一个特定的实例名称,所以它可以通过名称访问,而这种方式是不可能的,这就是为什么我想先标注它们的尺寸。
  • 如果您想按名称访问它们,可以考虑使用 Dictionary,您可以在其中存储键和值。
  • 是的,这也是可能的,但我希望使用智能感知弹出实例名称,而不是传递可能拼写错误的字符串 - 我考虑使用常量作为名称,但我认为事情变得复杂。每次我从不同的角度攻击它时,我都会遇到同样的问题! :D
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 2010-10-22
  • 2010-11-17
  • 2013-05-29
  • 2015-06-27
  • 1970-01-01
  • 2020-06-09
  • 2020-11-21
相关资源
最近更新 更多