0

经过长时间的搜索,我终于找到了清理我的刽子手游戏中的一些代码的获胜策略,但需要解释一下才能理解。

游戏打开时,我原本希望禁用所有字母按钮。所以我创建了一个方法来做到这一点,

private void disableletters();
{
  A.Enabled = false;
  B.Enabled = false;
         .
         .
         .
  Z.Enabled = false;
}

有效但不是很优雅。因此,遍历字母表以尝试压缩此代码似乎是合乎逻辑的。

private void disableLetters()
{
  char alphebetStart = Char.Parse("A");
  char alphabetEnd = Char.Parse("Z");

  for (i = alphabetStart; i <= alphabetEnd; i++);
  {
    string allLetters = i.ToString();
  }
}

但挑战似乎才刚刚开始,因为我不能像这样将这些新创建的字符串用作按钮表单,

i.ToString().Enabled = false;

出于显而易见的原因。它们是字符串,但需要被理解为它们的原始形式。

漫长的搜索终于找到了一个解决方案,但我不太明白它在做什么。神奇的是,

Controls[allLetters].Enabled = false;

“控件”揭示了一些神秘的东西,“获取控件中包含的控件集合”。代码按计划工作,但看起来它所做的是在说:“将您创建的那些新字符串从 A 到 Z 理解为它们最初的按钮名称。”

如果有人能简要解释这段代码在做什么,我将不胜感激。

4

2 回答 2

1

使用 LINQ,您还可以执行类似...

// where alphabet is a List<Char>
alphabet.ForEach(c => this.Controls[c].Enabled = false);
于 2013-10-09T21:33:40.890 回答
0

您的最终代码与您的变量没有任何关系。虽然有一个A表示控件的变量,但在表单中还有一个完全独立的集合,其中包含所有Control对象。这些控制对象中的每一个都有一个Name字段,其中一个具有一个字符串值"A""A"您可以轻松地在该集合中找到名称值为 的对象。碰巧有一个变量称为A引用该控件(从计算机的角度来看)是巧合。如果您将变量(但没有更改控件的名称)重命名为类似"A1",那么您仍然需要使用来使用集合"A"来获取控件。Controls

于 2013-08-15T17:41:32.103 回答