【问题标题】:Associate variable to a list [duplicate]将变量关联到列表[重复]
【发布时间】:2015-09-26 21:43:25
【问题描述】:

我不确定这在 C# 中是否容易实现。但我想知道如何轻松做到这一点。

public partial class Form1
{
  // I left out the unimportant code for this example
  private myControl cLeft,cTop,cBottom,cRight;
  private List<myControl>mControls;
  public Form1()
  {
  InitializeComponents();
  //this list should contain the fields cLeft,cTop,cBottom,cRight...
  mControls=new List<myControl>(){cLeft,cTop,cBottom,cRight};
  /* now I want that cLeft and so on get assigned...
  of course, this doesn't work because the list refers to the values of
   cLeft ... which are null. So I would need to store a reference to those fields to get this work.*/
  mControls.ForEach(x=>x=new myControl(this));
  }

}

我确信它可以通过反射来完成,但我认为应该有一种方法可以在 C# 中轻松做到这一点,还是不可能?

【问题讨论】:

  • 这是不可能的,即使有反射。你必须用unsafe 做一些诡计来实现这一点。这样做也是一个真的坏主意,你应该重新考虑你想要实现的目标。通过似乎与变量无关的代码在背后更改变量是不可调试代码库的秘诀。
  • @GrantWinney myControl 在设计器中不存在。这个问题不是询问创建控件,而是询问引用字段
  • @singsuyash 不相似。我想通过迭代“引用”列表来设置变量 cLeft 等等
  • 请注意,我将您的问题标记为欺骗,因为其他人实际上正在尝试您想要实现的目标。 params with ref。好主意,但不可能。

标签: c#


【解决方案1】:

这只是一个简单的循环,不需要使用 LINQ。你只需要一个for 循环。

for (int i = 0 ; i < mControls.Count ; i++) {
    mControl[i] = new myControl(this);
}

但是,不用写cLeftcTop等,用索引器引用即可:mControls[0]mControl[1]等。

请记住,foreach 循环或 ForEach 扩展方法不起作用。这是因为您正在更改变量的 reference。这只是引用类型的另一个令人困惑的(对于初学者而言)功能!

考虑这个方法

public void ChangeReference (string s) {
    s = "Hello";
}

你调用这个方法:

String s = "xxx";
ChangeReference (s);

通话后s 会是“Hello”吗?不,在方法中,你正在改变字符串在内存中的位置,但参数仍然在同一个地方!

【讨论】:

  • 我认为他的主要目标是在单个语句中快速实例化 cLeftcTop 等变量 - 而不是创建 x 个控件。虽然您的解决方案很可能是更好的方法,但它回答的问题略有不同
  • @Rob 我从来没有见过有人要求一个语句来实例化很多对象! OP 不太可能会问这个问题。从技术上讲,foreach 循环是一个语句块,它被视为一个“语句”。
  • 只是因为以前没有人问过,并不意味着这个问题没有问过:)。来自原始帖子:now I want that cLeft and so on get assigned...我并不是说这是一个好主意(事实上我在这个问题上发表了相反的评论)——但这似乎是 OP 所要求的。
  • @Sweeper ,最近我尝试询问 rob 提到了什么。但我不知道如何正确描述这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2016-08-01
  • 1970-01-01
  • 2017-07-13
  • 2018-11-05
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多