【问题标题】:best "macro way" to repeat C# lines重复 C# 行的最佳“宏方式”
【发布时间】:2012-08-11 18:40:09
【问题描述】:

在 C# 程序中,我有一个经常重复的错误检查:

try 
{
  File.Move(searchfolder + question1 +"_"+ filestring +".txt", 
            searchfolder + question1 +".txt");
}
catch (Exception ex) 
{
  File.AppendAllText(adminfolder + question1 +"_l.txt", "!"); 
  side.Value = Convert.ToString(ex) + "[Check-In error at "
                               + Convert.ToString(MYLINE) +"] "+ side.Value;
}

MYLINE 是一个数字,而 MYLINE 是唯一在我的程序中发生变化的东西。

因此,一个普通的 C++ #define 宏会使它更易于使用(我只需在程序顶部编写完整的“#define CHECKIN(MYLINE) ...”)。

专业人士如何在 C# 中处理这个问题?

【问题讨论】:

  • 您能否进一步澄清一下,是整个 try catch 块保持不变,只是 catch,还是只是异常的字符串模板?
  • 我希望你通常不要这样格式化你的代码。它是不可读的。
  • 您需要查看 String.Format()StringBuilder
  • 根据 decylone 的建议,您应该将最后一行更改为 side.Value = String.Format("{0}[Check-In error at {1}] {2}", ex, MYLINE, side.Value);
  • 顺便说一句,很好的异常处理......如果 File.AppendAllText 会抛出怎么办?

标签: c# macros


【解决方案1】:

...而 MYLINE 是我的程序中唯一改变的东西。因此,一个普通的 C++ #define 宏会使它更易于使用

好吧,也许吧,但由于 C# 没有宏的概念......只需使用一个方法:

static class FileMover
{
    public static void MoveMyFile(string myline)
    {
        // your existing code here
    }
}

附带说明,您的代码中存在明显的问题。在您的 catch 块中,您调用 File.AppendAllText()... 当然,这也可以引发异常。你需要考虑到这一点。

【讨论】:

  • 但是,我认为我需要在 FileMover 类的范围内(全局,对吗?)我的其他变量(搜索文件夹、问题 1 和文件字符串)所以这不会强迫我制作这些变量全球的? C++ 宏很好,因为它们避免了范围问题。
  • @bobuhito:您也可以简单地将它们作为参数传递。无论 C 和 C++ 中的宏是什么,它们在 C# 中都不存在。您需要遵守所使用语言的规则。
  • 老实说,我认为这对 C# 的创建者来说是一个错误的决定。我的代码比 C++ 方法长了大约 4 倍(在我看来,它在概念上也更糟)。如果没有人能打败它,我会很不情愿地将你的答案标记为最好的……但是,老实说,我现在认为专业人士要么离开 C#,要么使用一些具有宏语法的自建预处理器作为 C# 的包装器。跨度>
  • @bobuhito:好吧,你当然有权发表你的意见,但我已经被预处理器咬得够呛,在 C# 中不会错过它。难以调试,奇怪的运行时/编译时错误......我可以使用免费功能,但不需要宏 IMO。
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 2011-11-15
  • 2010-11-24
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
相关资源
最近更新 更多