在C#中定义namespace or type aliases是否有任何既定的命名或编码约定?
对于那些不知道的人,C#语言有一个功能,可以在名称空间和类型的文件本地定义别名。当与第三方库存在命名冲突以及缩短代码中的类型名称时,这可能很有用。以下是它的外观示例。
using Forms = System.Windows.Forms;
我在网上看到的大多数示例都倾向于使用未缩写的大写名称作为别名,例如上面示例中的别名 Forms 。在某些地方,包括official MSDN page,其中解释了名称为 colAlias 的示例,用于命名空间 System.Collections 。为了使其更复杂,根据是否定义了命名空间别名或类型别名,可能会优先选择一些指南。
为了给出一些背景知道为什么我对别名的指南感兴趣,我会解释我在做什么。在最近的一个项目中,我开始简化一个模式,其中我有几个继承自泛型基类的类,它通过使用类型别名接受复杂类型参数。
因此,使用这种技术,下面的复杂示例将变得更加可读,一旦应用了类型别名。
public class MyClass: MyGenericBaseClass<TripleLindyFancyAlgorithm<List<SomeValueType>>, List<SomeValueType>>
{
public override List<SomeValueType> DoSomething(TripleLindyFancyAlgorithm<List<SomeValueType>> operation)
{
// ...
}
}
在使用类型别名的必须清洁版本之下。
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)
{
// ...
}
}
虽然这看起来更简单,但很容易忘记像结果这样的别名实际上只是List的别名,并且没有名为结果的实际类型。为了在视觉上分离概念,我正在考虑遵循一些前缀约定,类似于在私有成员之前使用下划线'_',以帮助区分类型别名和实际类型。在我这样做之前,我想确保我不会重新发明轮子,因为可能已经有更多已有的惯例。
答案 0 :(得分:14)
我只会在名称空间冲突的情况下使用别名(即仅当我 时)。
至少对我来说,任何其他用途都只是令人困惑和分心。
答案 1 :(得分:9)
命名空间别名不是大多数代码库的常见功能 - 我使用它的最后一个地方,高级开发人员不熟悉它,尽管已经使用C#多年。
由于很少见,因此尚未制定公约。
我想说如果您打算使用别名,请与您的团队讨论,以创建您自己的约定。
我看到过使用别名的几种不同方式:
答案 2 :(得分:6)
就个人而言,我只会用它来保持智能清洁。
using StringBuilder = System.Text.StringBuilder;
如果您重命名类型,则会为维护程序员打开Pandora的框。
答案 3 :(得分:4)
命名空间别名的两种最常见的情况是:
对于第一种情况,没有评论。对于第二个,一个很好的例子是从C移植代码并使用命名空间别名来实现如下:
using i64 = System.Int64;
using u8 = System.Byte;
using u32 = System.UInt32;
using u64 = System.UInt64;
即使您将上述别名视为懒惰编程,它们也有助于避免错误。
答案 4 :(得分:2)
我认为那些倾向于不使用它们的人 会给出你要求的答案。那个是的惯例。这并不是说它没有用,但不使用它仍然是常态。
答案 5 :(得分:2)
您可以采用约定将它们用于抽象。
using Id = System.Int32;
这样您就可以轻松地用
替换该行using Id = System.Guid;
在某些时候,没有其他代码必须改变(假设你没有透过抽象来创建对实际类型的依赖...)
答案 6 :(得分:0)
当我需要在不同的命名空间中使用两个类似命名的类时,我通常只使用它们,并且不想在代码中完全指定类型:
using xItem = My.Project.NameSpace.Item;
using yItem = Your.ThirdParty.Framework.Item;