【问题标题】:C# Replacement for macro?C#替换宏?
【发布时间】:2011-07-28 22:25:00
【问题描述】:

我试图在我的代码中定义 10 个面板,但绝对不想这样做

public panel1();
public panel2();
etc....

快速谷歌搜索告诉我宏在 c# 中不可用。有没有我可以定义的某种数组来代替宏,或者我可以用其他方式来处理这个?

【问题讨论】:

  • 为什么/如何为此使用宏?
  • 当然您可以(并且应该)使用数组。 C 宏不再使冗余变量更容易接受,只是更容易处理。
  • 我不认为他指的是 C 宏——我以为他指的是 Lisp。
  • 为什么有人需要宏?
  • @manojlds 假设你不是拖钓,这里有一个很好的讨论:news.ycombinator.com/item?id=2545497

标签: c# macros


【解决方案1】:

你的问题不太清楚;但这是在 C# 中定义面板数组的方式:

Panel[] panels = new Panel[10];

您可以使用初始化表达式来填充面板:

Panel[] panels = new Panel[] { new Panel(), new Panel(), /* ... */ };

您更有可能想要循环某些内容并让一些逻辑创建数组 - 可能在循环中或作为 LINQ 表达式,例如:

Panel[] panels = Enumerable.Range(0,10).Select(n => new Panel(n)).ToArray();

【讨论】:

  • 如果您执行初始化表达式,并且它们都相同(如您的示例)或相似(如 1、2、3...),我建议您这样做 @987654324 @ 然后使用 for 循环来初始化值。干净多了。
  • @Tim S.:但此时代码中有循环或 LINQ 语句会损害可读性。鉴于您只想构建 10 个东西,您的代码越接近“给我 10 个东西”,您的意图就会越清晰。
【解决方案2】:

为什么不直接使用for 循环并用几行动态添加它们呢?像这样的:

for (int i=0;i<10;i++)
{
    Panel newPanel = new Panel();
    // each time through there is a new panel to use
}

【讨论】:

    【解决方案3】:

    我会像这样使用一个通用列表和上面提到的 for 循环:

    List<Panel> list = new List<Panel>();
    for (int i = 0; i < 10; i++)
    {
        list.Add(new Panel());
    }
    

    【讨论】:

      【解决方案4】:

      如果你只想要 10 个东西,那么你不希望你的表达式被循环或其他不相关的结构弄得乱七八糟。

      我建议使用:

      var panels = 10.Of<Panel>();
      

      ...可以通过以下扩展方法实现:

      public static T[] Of<T>(this int number) where T : new()
      {
        var items = new List<T>();
        for (int i = 0; i < number; i ++)
        {
          items.Add(new T());
        }
        return items.ToArray();
      }
      

      这将使您的代码意图更加清晰。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多