我什么时候会在使用指令上使用别名

本文关键字:别名 指令 什么时候 | 更新日期: 2023-09-27 18:30:58

所以我正在阅读MSDN文档并遇到:

http://msdn.microsoft.com/en-us/library/sf0df423.aspx

using指令使用别名的实际用途是什么?

我明白

了什么,我只是不明白为什么我想使用它。

我什么时候会在使用指令上使用别名

如果在两个不同的命名空间中具有同名的类,这将非常有用。 当这种情况发生时,你有两个选择。 using一个命名空间而不是另一个命名空间(意味着对另一个命名空间使用完全限定名称),或者正常using一个命名空间,并使用别名using另一个命名空间。 由于别名比完全限定的名称短,因此它仍然更容易、更方便。

显然,最好的选择是不要在不同的命名空间中使用同名的公共类,特别是如果有人想在同一类中使用两者。

例如,

您可能在类 2 中使用了其他名称相同但命名空间不同的类。例如:

 using TextBoxForms = System.Windows.Forms.TextBox
 using TextBoxWeb = System.Web.UI.WebControls.TextBox
我喜欢

将其用于泛型,因为有时将它们写出来可能非常冗长。

using NatMap = System.Collections.Generic.Dictionary<IPAddress, IPAddress[]>;
...
NatMap natMap = new NatMap();

使用函数时:

void PrintNat(NatMap natMap) {
    foreach (IPAddress[] addresses in natMap) {
        foreach (IPaddress address in addresses) {
            // bla bla bla
        }
    }
}

使用它有两个很好的理由:

  1. 存在名称冲突(两个类位于具有相同名称的不同命名空间中)。您可以改用更短但同样具有描述性的名称,而不是写出完全限定的类型(包括完整的命名空间)。

    a. 示例:假设您有一个包含类KeyValuePair<TKey, TValue>的项目,并且您还将 System.Collections.Generic 用于其他用途。你可以用using MyStringIntPair = MyProject.Collections.Generic.KeyValuePair<string, int>来别名你的类,你的代码看起来会干净得多,因为没有到处都是MyProject.Collections.Generic

  2. 本机互操作。我个人发现这在处理本机long类型时非常有用。在大多数操作系统上,long的大小与指针相同,但在 Windows 64 位上,它与 int 相同。因此,对于大多数操作系统,我可以将long表示为IntPtr,但是对于Windows 64位,它需要更改,因此我创建了一个类型别名并使用预处理器指令更改其定义。

    a. FreeType使用了很多long,所以当我为它编写绑定时,我必须让它在Windows 64位上运行。我正在考虑某种基于操作系统的动态子类化,但预处理器指令和类型别名更简单,现在可以完成工作。一个例子是使用 long 的 FT_BBox 结构。

下面 FT_BBox 结构的简化相关版本:

using System;
using System.Runtime.InteropServices;
#if WIN64
using FT_Pos = System.Int32;
#else
using FT_Pos = System.IntPtr;
#endif
namespace SharpFont.Internal
{
    /// <summary>
    /// Internally represents a BBox.
    /// </summary>
    /// <remarks>
    /// Refer to <see cref="BBox"/> for FreeType documentation.
    /// </remarks>
    [StructLayout(LayoutKind.Sequential)]
    internal struct BBoxRec
    {
        internal FT_Pos xMin, yMin;
        internal FT_Pos xMax, yMax;
    }
}

从该链接

创建 using 别名,以便更轻松地将标识符限定为命名空间或类型。using 别名指令的右侧必须始终是完全限定的类型,而不考虑其前面的 using 指令。

因此,您可以将类型从

Foo.Bar.Foo.Bar.Foo.Bar.Foo.Bar.Foo.Bar.Foo.Bar

到更易于管理的东西,例如

FooBar

特别是如果您有多个冲突的命名空间

例如,

当您需要来自不同命名空间的两个具有相同名称的类的短名称时,可以使用它。如果指定命名空间,则类名会冲突,因此可以为其指定不同的名称:

using ImageControl = System.Windows.Controls.Image;
using Image = System.Drawing.Image;