C# 我是否应该使用与.NET BCL';谁的名字?

C# 我是否应该使用与.NET BCL';谁的名字?,c#,vb.net,naming-conventions,classname,fully-qualified-naming,C#,Vb.net,Naming Conventions,Classname,Fully Qualified Naming,这种情况对你们中的一些人来说可能并不完全罕见:您有一些功能可以放入一个类中,但该类的完美名称(*)是由系统命名空间中的一个类或其他不是您的但您正在使用/导入的命名空间/类所采用的 (*)我所说的完美是指小而简洁、清晰的名字 例如,我有一个Utils类,它有一个Diagnostics(主要是调试Utils)类和一个Drawing类。我可以: 有一个DrawingUtils类和一个DiagnosticsUtils类,但这听起来像是糟糕的结构 选择一个同义词表,然后使用一个更糟糕、更长或笨拙的名字,而

这种情况对你们中的一些人来说可能并不完全罕见:您有一些功能可以放入一个类中,但该类的完美名称(*)是由
系统
命名空间中的一个类或其他不是您的但您正在使用
/
导入的命名空间/类所采用的

(*)我所说的完美是指小而简洁、清晰的名字

例如,我有一个
Utils
类,它有一个
Diagnostics
(主要是调试Utils)类和一个
Drawing
类。我可以:

  • 有一个
    DrawingUtils
    类和一个
    DiagnosticsUtils
    类,但这听起来像是糟糕的结构
  • 选择一个同义词表,然后使用一个更糟糕、更长或笨拙的名字,而这个名字仍然没有被随意使用
  • 用我的母语而不是英语写类名
  • 问问StackOverflow的聪明人
  • 我认为选项1-3不太可能:(

    编辑: 由于我选择的答案并没有明确地解决问题(我也没有),因此我建议面临同样情况的人问问自己:你会经常使用冲突的BCL类/名称空间吗?如果不会,那么让你的名字冲突(就像我在诊断中做的那样)。如果是,请添加限制类/命名空间可能性的单词

    实际上,这意味着:
    “绘图”
    :绘图的东西。
    “MyCustomControlDrawing”
    :只在
    MyCustomControlDrawing
    上绘制的东西。例如:
    “WidgetDrawing”

    编辑2:
    下一次要看的另一个解决方案:(由提供)。

    对我来说,故意编写冲突的类名是不值得的。您会让其他不熟悉您的代码库的开发人员感到困惑,因为他们希望使用BCL类,但最终会使用您的类(反之亦然)。然后,当他们必须使用别名编写特定的
    时,你就浪费了他们的时间

    老实说,提出有意义的标识符名称是一项有用的技能,但不值得推迟你的发展。如果你不能很快想出好的东西,就接受平庸的东西,继续前进。为这些名称操劳没有什么价值。我敢说,你可以做一些更有成效的事情


    编辑:我也不相信“小”是“完美”的组成部分标识符。当然,简洁明了,但如果需要较长的名称来表达特定构造的目的,就这样吧。毕竟我们有intellisense。

    我认为保留名称
    绘图
    诊断
    等没有任何问题。这是名称空间的目的之一,用于解决命名冲突。

    名称空间的美妙之处在于,它们允许您创建具有相同名称的类。当您使用
    语句将名称空间导入到文件中时,可以为名称空间指定别名

    using MyAlias = My.Custom.Namespace;
    
    这将使您的类与Microsoft的类分开

    然后,您可以将类引用为

    MyAlias.Diagnostics
    

    或者,您也可以为Microsoft的命名空间指定别名,但我不建议这样做,因为这会使其他开发人员感到困惑。

    使用命名空间来消除您的类与其他命名空间中的类之间的歧义。可以使用完全限定名,也可以使用using语句来告诉编译器您需要什么:

    using Type = MyReallyCoolCustomReflector.Type;
    
    现在,如果仍要使用系统命名空间中的类型类:

    System.Type sysType = anObject.GetType();
    

    一般来说,我会尽量避免名称重复,但这并不总是这样。我也喜欢简单、可读和可维护的代码。因此,这通常是一个折衷的决定。

    好吧,如果你想避免名称空间冲突,你可以做以下几件事:


    • 不要冲突,而是选择一个唯一的名称
    示例:

    如果您正在创建一个数学类,可以将您的类命名为
    CamiloMartin.MathHelper


    • 使用长名称空间来区分冲突
    示例:

    public class MyClass
    {
        public int SomeCalculation(int a, int b)
        {
            return MyNamespace.Math.SomeFunc(a, b);
        }
    }
    
    using System.Math;
    using SuperMath = MyNamespace.Math;
    
    namespace MyNamespace
    {
        public class MyClass
        {
            public int SomeCalc(int a, int b)
            {
                 int result = Math.abs(a);
                 result = SuperMath::SomeFunc(a, b);
    
                 return result;
            }
        }
    }
    

    • 使用别名进行区分
    示例:

    public class MyClass
    {
        public int SomeCalculation(int a, int b)
        {
            return MyNamespace.Math.SomeFunc(a, b);
        }
    }
    
    using System.Math;
    using SuperMath = MyNamespace.Math;
    
    namespace MyNamespace
    {
        public class MyClass
        {
            public int SomeCalc(int a, int b)
            {
                 int result = Math.abs(a);
                 result = SuperMath::SomeFunc(a, b);
    
                 return result;
            }
        }
    }
    

    请注意:.NET framework既没有
    Utils
    也没有
    Diagnostics
    类(但有名称空间)

    就我个人而言,我不喜欢像
    Utils
    这样的通用类,因为它们的方法不是很容易发现(通常过于通用或过于具体),因此我认为它们的使用仅限于内部类


    至于其他方面,我同意其他人的看法,名称空间很方便。(虽然如果
    系统
    中已有同名的类,我会三思而后行地命名该类,这不是因为名称冲突,而是因为我不能使用“original”类的原因可能意味着我要创建的类在语义上是不同的。)

    通常可以选择更具体的名称。以
    Utils
    为例。任何东西都可以称为实用程序。对于代码的读者来说,这个类名毫无价值

    通常,实用程序类是一组不适合其他任何地方的方法。请尝试将它们放在它们所属的位置,或根据某些条件对它们进行分组,然后使用组作为类名。根据我的经验,这种分组总是可能的

    一般而言:

  • 这就是我们正在做的(嘿,我们可以稍后重构它)

  • 用过一两次,但只在重要的类上使用。如果你还不知道“完美”的名字,尤其有用

  • 想都别想这个

  • 使用名称空间别名并不有趣。因此,如果可以的话,我会尽量避免使用它。

    “L'art pour L'art”-为了艺术而艺术。这就是我对你问题的看法。解决方案1很好,你为什么不应用它呢?我认为在我们的日常工作中还有更重要的问题:p@ukas: