【问题标题】:Globally defining a function in C#在 C# 中全局定义一个函数
【发布时间】:2012-06-04 21:10:15
【问题描述】:

我有两个函数,我似乎在软件中包含了很多用于在类型之间转换字符串和字节数组的函数。用法是这样的:

string str = "Hello world";
byte[] b = strToByteArray(str);

首先,有没有办法可以将它包含在 System 命名空间中,这样我就不必再在代码中定义它了?

其次,有没有办法将它定义为字符串类的一部分,所以用法会更像:

string str = "Hello world";
byte[] b = str.ToByteArray();

【问题讨论】:

  • 1) 将常用的实用程序方法编译成 DLL。 2)重用DLL。 3) ???
  • 请注意,您的函数仅在给定特定编码的情况下才有意义。 当心 Unicode 的可怕之处
  • 只要将方法设为静态即可....

标签: c# function global definition


【解决方案1】:

Extension Methods 在 C# 中提供了您所要求的内容。

【讨论】:

  • 扩展方法只能将实例方法添加到现有类。如果你想要一个“近乎”的全局方法(没有实例),你必须用静态方法创建一个类
  • 你可以扩展字符串和字节[] ;)
  • @SteveB 实际上,您也可以静态调用扩展方法:Extensions.MyExtension("some string") 而不是"some string".MyExtension()。 @TomTom stringsealed,而 byte[] 作为基本类型无效,所以不,你不能这样做。
【解决方案2】:
  1. 不; C# 不支持顶级函数

  2. 您正在寻找扩展方法。

【讨论】:

    【解决方案3】:

    不要重新发明轮子,改用 Encoding 类。

    【讨论】:

      【解决方案4】:

      你为什么不使用System.Text.Encoding.Unicode.GetBytes

      首先,有没有办法可以将它包含在 System 命名空间中,这样我就不必再在代码中定义它了?

      我不知道您所说的“不再在代码中定义它”是什么意思。您可以将任何您想要的内容添加到System,但这通常是不受欢迎的。直接说

      namespace System {
          // add classes here
      }
      

      C# 没有您想要的顶级方法。 Eric Lippert 之前讨论过这个。

      其次,有没有办法将它定义为字符串类的一部分,所以用法会更像:

      我想你可以在string上定义一个扩展方法:

      public static class StringExtensions {
          public static byte[] GetBytes(this string s) {
              // do something and return byte[]
          }
      }
      

      如果需要,请将其放入命名空间 System。同样,这通常是不受欢迎的,您仍然必须引用包含定义的程序集。

      【讨论】:

      • 谢谢,扩展方法正是我所追求的。 “不再在代码中定义它”是指将其添加到标准包含中,因此我不必将其添加到每个新项目中。
      【解决方案5】:

      您可以为字符串编写扩展方法来满足您的需要: http://csharp.net-tutorials.com/csharp-3.0/extension-methods/

      然后你可以用每个字符串调用它:

      byte[] b = "Hello world".ToByteArray();
      

      对于实现,你可以顺便使用 Encoding.GetBytes

      【讨论】:

        【解决方案6】:

        您只需要在命名空间System 中自定义Extension Method

        namespace System
        {
            public static class StringExtensions
            {
                public static byte[] ToByteArray(this string source)
                {
                    // return result
                }
            }
        }
        

        【讨论】:

          【解决方案7】:

          有关更多信息,请参阅Why use the global keyword in C#?...您可以添加 using 语句来实现您正在寻找的语义,或者您可以使用 global 关键字。

          【讨论】:

            【解决方案8】:

            首先,有没有办法可以将它包含在 System 命名空间中,这样我就不必在 代码了吗?

            ???你想要什么?

            系统命名空间?将它们放入系统命名空间中的(静态)类中。命名空间与程序集、dll 等无关 - 你可以使用任何你喜欢的东西。

            另外,做大多数人都会做的事情——使用工具类开始一个项目。我周围有一些用于通用代码。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-10-26
              • 2019-07-03
              • 2018-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多