Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的类型/命名空间别名约定#_C#_Naming Conventions_Namespaces_Alias - Fatal编程技术网

C# C中的类型/命名空间别名约定#

C# C中的类型/命名空间别名约定#,c#,naming-conventions,namespaces,alias,C#,Naming Conventions,Namespaces,Alias,在C#中定义是否有任何已建立的命名或编码约定 对于那些不知道的人来说,C语言有一个特性,可以在文件的本地为名称空间和类型定义别名。当与第三方库发生命名冲突时,以及在代码中缩短类型名称时,这可能非常有用。下面是它的一个示例 using Forms = System.Windows.Forms; 我在网上看到的大多数示例都倾向于使用未加修饰的大写名称作为别名,如上面示例中的别名表单。在某些地方,包括解释了命名空间System.Collections的别名为colAlias的示例。为了使其更加复杂,

在C#中定义是否有任何已建立的命名或编码约定

对于那些不知道的人来说,C语言有一个特性,可以在文件的本地为名称空间和类型定义别名。当与第三方库发生命名冲突时,以及在代码中缩短类型名称时,这可能非常有用。下面是它的一个示例

using Forms = System.Windows.Forms;
我在网上看到的大多数示例都倾向于使用未加修饰的大写名称作为别名,如上面示例中的别名表单。在某些地方,包括解释了命名空间System.Collections的别名为colAlias的示例。为了使其更加复杂,有些人可能会根据定义的是名称空间别名还是类型别名来选择不同的准则

为了说明我为什么对别名感兴趣,我将解释我在做什么。在最近的一个项目中,我开始简化一个模式,其中我有几个类继承自一个泛型基类,该基类通过使用类型别名接受复杂的类型参数

因此,使用这种技术,一旦应用了类型别名,下面的复杂示例就变得更具可读性

public class MyClass: MyGenericBaseClass<TripleLindyFancyAlgorithm<List<SomeValueType>>, List<SomeValueType>>
{
    public override List<SomeValueType> DoSomething(TripleLindyFancyAlgorithm<List<SomeValueType>> operation)
    {
        // ...
    }
 }
公共类MyClass:MyGenericBaseClass
{
公共覆盖列表剂量测量(TripleLinedyFancyalGorithm操作)
{
// ...
}
}
以及下面必须使用类型别名的cleaner版本

using Result = List<SomeValueType>;
using Algorithm = TripleLindyFancyAlgorithm<List<SomeValueType>>; // Note: cannot reference an alias within an alias definition!

public class MyClass: MyGenericBaseClass<Algorithm, Result>
{
    public override Result DoSomething(Algorithm operation)
    {
        // ...
    }
 }
使用结果=列表;
使用算法=TripleLinedyFancyalGorithm;//注意:无法在别名定义中引用别名!
公共类MyClass:MyGenericBaseClass
{
公共覆盖结果DoSomething(算法操作)
{
// ...
}
}

尽管这看起来简单得多,但很容易忘记像Result这样的别名实际上只是List的别名,并且没有名为Result的实际类型。为了直观地分离这些概念,我正在考虑遵循一些前缀约定,类似于在私有成员之前使用下划线“\ux”,以帮助区分类型别名和实际类型。然而,在我这么做之前,我想确保我没有重新发明轮子,因为可能已经有了更多的既定惯例。

就我个人而言,我只会用它来保持intelli sense的清洁

using StringBuilder = System.Text.StringBuilder;

如果你重命名类型,你会为维护程序员打开潘多拉的盒子。

我只会在名称空间冲突的情况下使用别名(也就是说,只有在我不得不使用别名的情况下)


至少对我来说,任何其他用法都会让人困惑和分心。

名称空间别名不是大多数代码库的常见功能-我最后一次使用它时,高级开发人员对它并不熟悉,尽管他已经使用C#很多年了

using Id = System.Int32;
因为它很少见,所以还没有为它制定惯例

我想说,如果您打算使用别名,请与您的团队讨论,以创建您自己的约定

我见过使用别名的几种不同方式:

  • 名称空间的首字母缩略词。通常是名称空间中的大写字母
  • 名称空间的最末端-如果复数为非复数
  • 一个描述性的短名称

命名空间别名最常见的两种情况是:

  • 我看到了它,我使用它(作为一种趋势)
  • 我从另一种语言移植代码
  • 对于第一个案例,没有任何评论。对于第二个示例,一个很好的示例是从C移植代码,并使用命名空间别名以实现实用性,如:

    using i64 = System.Int64;
    using u8 = System.Byte;
    using u32 = System.UInt32;
    using u64 = System.UInt64;
    

    即使你将上述别名视为懒惰的编程,它们也有助于避免错误。

    < P>我认为那些倾向于不使用它们的人<强>是< /强>给出你要的答案。那就是惯例。这并不是说它没有用处,但不使用它仍然是一种规范。

    您可以采用一种惯例来使用它们进行抽象

    using Id = System.Int32;
    
    这样,您就可以轻松地将该行替换为

    using Id = System.Guid;
    

    在某一点上,没有其他代码需要更改(假设您没有浏览抽象以创建对实际类型的依赖关系…

    我通常只在需要在不同名称空间中使用两个类似命名的类时使用它们,并且不希望在代码中完全指定类型:

    using xItem = My.Project.NameSpace.Item;
    using yItem = Your.ThirdParty.Framework.Item;
    

    但是您必须承认,在我给出的示例中,如果您必须编写100多个类似的类,这些类都具有相同的模式,那么类型别名功能可以显著提高可读性。虽然我同意这可能会让人困惑,但我认为在这种类型的示例中,让复杂的示例保持原样,即使不是更让人困惑,实际上也是一样的。关于示例,嵌套泛型,deep几乎从来都不是必需的,如果是,这是一个应该重新设计类的标志,而不是应该使用别名的标志。这对凡人来说太让人困惑了。@Dave-这是一个非常正确的观点,尽管要深入设计的细节,我必须透露促使我提出这个问题的实际代码的细节。为了提高效率,我将尽量少关注示例的合理性以及是否应使用类型别名,而更多关注C#代码中类型别名的约定。虽然我同意在没有保证的情况下使用此技术对维护非常不利,我认为没有任何改进的原始复杂示例可能更令人担忧。我可能有点疯狂,但我认为当它如此明确时,可读性更强。ChaosPandion,也许你是对的。然而,重点是讨论命名约定,尽管我认为考虑使用别名的编码准则是很重要的。这是第一个讨论公约的第一篇文章,这是我最初提出的提出这个问题所要做的。授予赏金。谢谢你回答这个问题