5

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

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

using对指令使用别名有什么实际用途?

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

4

6 回答 6

10

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

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

于 2012-04-13T20:45:57.277 回答
5

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

 using TextBoxForms = System.Windows.Forms.TextBox
 using TextBoxWeb = System.Web.UI.WebControls.TextBox
于 2012-04-13T20:48:44.387 回答
5

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

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
        }
    }
}
于 2012-04-13T20:58:56.647 回答
3

从那个链接

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

所以你可能会改变一个类型

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

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

FooBar

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

于 2012-04-13T20:47:17.760 回答
3

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

using ImageControl = System.Windows.Controls.Image;
using Image = System.Drawing.Image;
于 2012-04-13T20:48:18.307 回答
3

使用它有两个非常好的理由:

  1. 存在名称冲突(两个具有相同名称的不同名称空间中的类)。除了写出完全限定的类型(包括完整的命名空间)之外,您还可以将其中一个别名改为一个更短但同样具有描述性的名称。

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

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

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

以下 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;
    }
}
于 2012-04-13T21:33:35.337 回答