代码之家  ›  专栏  ›  技术社区  ›  Nick Randell

在系统名称空间中编写自己的扩展方法可以吗?

  •  21
  • Nick Randell  · 技术社区  · 17 年前

    然而,我最近想到了在系统名称空间、System.Collections名称空间或其他一些有意义的系统名称空间中编写扩展方法。例如,我实现了以下内容。

    namespace System
    {
        /// <summary>Various array extensions</summary>
        public static class ArrayExtensions
        {
            /// <summary>Converts the array to a hex string</summary>
            /// <param name="value">The value.</param>
            /// <returns>The array as a hex string</returns>
            public static string ToHexString(this byte[] value)
            {
                var hex = new StringBuilder(value.Length * 2);
                foreach (byte b in value)
                {
                    hex.AppendFormat("{0:X2}", b);
                }
                return hex.ToString();
            }
        }
    }
    

    5 回复  |  直到 17 年前
        1
  •  22
  •   Scott Dorman    17 年前

    根据框架设计指南(第二版):

    不要将扩展方法与扩展类型放在同一名称空间中,除非它用于向接口添加方法或用于依赖关系管理。

    System.Collection.Extensions 命名空间或 Company.Collections Company.Collections.Extension 命名空间。

    为了使用扩展方法,必须导入包含发起类(定义扩展方法的类)的命名空间。如果将扩展方法添加到标准的.NET Framework命名空间之一,它们将始终(隐式)可用。

        2
  •  14
  •   Jeff Yates    17 年前

    System.Collections NickR.Collections NickR.System.Collections .

        3
  •  4
  •   Greg Beech    17 年前

    例如,我们做了很多工作 TimeSpan 对象,并且在框架中没有乘法或除法,所以我们添加了 MultiplyBy DivideBy 扩展方法,并将它们放在 System 名称空间,因为我们希望它们在 时间跨度 使用。

    另一方面,我们也做了大量的反射工作,在 Type OurCompany.Reflection 命名空间,因此必须专门导入它们。

    因此,对于内部API,决策可以归结为“我是否希望此方法在代码库中的任何类型可用的地方都可用?”。如果答案是肯定的,那么将其放在同一名称空间中,否则将其放在其他地方。

        4
  •  3
  •   Ricardo Villamil    17 年前

    我认为真正的问题不在于将它们放在哪里或命名为什么(系统或任何其他名称空间),而是要保持一致并始终使用相同的名称来避免问题(忘记它们在哪里)。

        5
  •  0
  •   Thomas Eyde    17 年前

    我将扩展方法放在名称空间中,这取决于我希望它们具有的可见性。这样,它们更容易发现,而且我通常会得到更少的名称空间导入。

    推荐文章