【问题标题】:Where should I put miscellaneous functions in a .NET project?我应该将杂项功能放在 .NET 项目中的什么位置?
【发布时间】:2009-09-24 14:50:41
【问题描述】:

我发现自己在使用 C# 处理文本解析器时不得不经常删除字符串的第一行。我整理了一个简单的函数来为我做这件事,但是来自 PHP 背景,我不知道把它放在哪里,因为我无法在类之外定义函数。在 .NET 中这样做的习惯方法是什么?我要创建一个静态类来存储我的函数吗?

【问题讨论】:

  • 什么样的.NET项目? ASP.NET? ASP.NET MVC?表格?银光? “放置位置”的约定因项目类型而异。

标签: c# .net string text function


【解决方案1】:

我一般会做一个 Helper 或者 Utility 静态类,然后在里面放对应的辅助函数。

此外,我尝试保持 Helper 和 Utility 类在逻辑上分组 - 将文本解析函数与对象转换函数放在一起是荒谬的。使用 TextUtils 类和 ConversionUtils 类可以消除混淆。

【讨论】:

  • 您可能还会从制作此类函数扩展方法中受益。
【解决方案2】:

是的,静态帮助类通常是执行此操作的方法。

此外,在 C# 3 中,您可以像这样声明方法:

public static string RemoveFirstLine(this string s) {
    ...
}

使其成为扩展方法。然后,您可以在任何字符串上调用它,就好像该方法是在字符串类型本身上声明的一样。

【讨论】:

  • 对于Butterfly所描述的,扩展方法绝对是要走的路。
  • 哇,扩展方法很简洁!这就是我最终使用的。感谢您提及他们。
【解决方案3】:

小心!

  • 交叉的通用实用程序函数应该存在于更高的实用程序命名空间中。字符串解析、文件操作等

  • 扩展对象应该存在于它们自己的命名空间中。

  • 适用于一组指定业务对象或方法的实用程序函数应该存在于这些对象的命名空间中。通常带有Helper 后缀,即BusinessObjectHelper。 命名在这里很重要。您是为各种方法创建一个容器,还是将它们分组为专门的对象(即解析器)更有意义?

【讨论】:

    【解决方案4】:

    我认为这没有标准。我倾向于制作一个名为 BlahUtil 的静态类。对于您的示例,我会将其设为StringUtil 上的静态方法。这有助于我将相关方法分组到合理的单元中,从而更容易发现它们并在团队之间共享它们。

    然后您还可以选择将这些方法中的哪些公开为扩展方法(自 c# 3.0 起):

    public static class StringUtil
    {
        public static string RemoveFirstLine(this string multiLineString)
        {
            // ...
        }
    }
    

    【讨论】:

      【解决方案5】:

      如果您使用的是 C# 3.0,您可能需要考虑使用扩展方法!

      public static class StringExtensions
      {
          public static string RemoveFirstLine(this string myString)
          {
               return myString.Remove("line..!");
          }
      }
      

      然后在代码中你可以这样做:

      string myString = "Hello World etc";
      
      string removedLineString = myString.RemoveFirstLine();
      

      【讨论】:

      • 我通常讨厌扩展方法。它们破坏了类和库对功能的封装。我是谁来“修复”.net 库?现在有人在我的代码 myString.Whargarble() 中遇到了一些方法。他们在哪里找到这种方法?我认为 myString = MyCompany.StringUtils.Whargarble(myString) 更清楚地说明了正在发生的事情。
      • 这是一个公平的观点,这取决于你如何实现你的代码:)。我不确定扩展是否被视为修复,它更多的是对它的扩展!他们通过点击它并选择 F12 找到它,并通过智能感知中的小图标识别它的扩展方法。如果您将它们添加到扩展名称空间中,它们不太可能会遇到它;然后你明确地“选择加入”使用它。我个人对此没有任何问题。它将如何“打破功能封装”!?它封装在一个扩展类中!
      【解决方案6】:

      通常我会创建一个 Utilities 类并定义静态辅助方法。

      【讨论】:

        【解决方案7】:

        我已经完成了静态“助手”类,但经过一些分析;这种类型的辅助函数总是以不同的类实现而告终。在您的情况下,您将拥有一个“基本文本解析器”类和一个覆盖“解析”方法的派生类。

        【讨论】:

          【解决方案8】:

          我会为这些函数创建一个静态工作者类。也许不是最好的方式,但是让事情变得简单的方式...... ;)

          K

          【讨论】:

            【解决方案9】:

            使用extension method 作为字符串。这就是他们的目的。

            【讨论】:

            • 在我写答案的时候添加了该死的!!
            【解决方案10】:

            您可以使用具有静态方法的类。 ParserUtils.RemoveFirstLine() 之类的东西。在 .NET 3.5 及更高版本上,当您的实用程序函数与您无法修改的类(如 String 类)相关时,您有时可以使用扩展方法。 Intellisense 将在项目中的任何字符串对象上显示扩展方法。

            【讨论】:

              【解决方案11】:

              扩展是在这种情况下要走的路。它从字面上将您的功能添加到发生中。唯一的问题是,2008年不可能做静态方法。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-10-11
                • 1970-01-01
                • 2012-08-10
                • 2018-06-27
                • 1970-01-01
                • 1970-01-01
                • 2010-12-04
                相关资源
                最近更新 更多