だから私はMSDNのドキュメントを読んでいて、出くわしました:
http://msdn.microsoft.com/en-us/library/sf0df423.aspx
using
ディレクティブにエイリアスを使用する実用的な用途は何ですか?
私はそれが何をするのか理解していますが、なぜそれを使いたいのかわかりません。
だから私はMSDNのドキュメントを読んでいて、出くわしました:
http://msdn.microsoft.com/en-us/library/sf0df423.aspx
using
ディレクティブにエイリアスを使用する実用的な用途は何ですか?
私はそれが何をするのか理解していますが、なぜそれを使いたいのかわかりません。
2 つの異なる名前空間に同じ名前のクラスがある場合に便利です。そうなったとき、あなたには2つの選択肢があります。 using
1 つの名前空間で別の名前空間を使用しない (つまり、もう 1 つの名前空間には完全修飾名を使用する) か、using
通常は 1 つの名前空間で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
}
}
}
たとえば、異なる名前空間の同じ名前を持つ 2 つのクラスの短い名前が必要な場合に使用できます。名前空間を指定すると、クラス名が競合するため、別の名前を付けることができます。
using ImageControl = System.Windows.Controls.Image;
using Image = System.Drawing.Image;
それを使用する2つの本当に良い理由があります:
名前の衝突 (別々の名前空間にある同じ名前の 2 つのクラス) があります。完全修飾型 (完全な名前空間を含む) を書き出す代わりに、それらの 1 つにエイリアスを付けて、はるかに短いが同等にわかりやすい名前にすることができます。
a. 例: クラスを含むプロジェクトがあり、KeyValuePair<TKey, TValue>
System.Collections.Generic を別の用途にも使用しているとします。クラスにエイリアスを付けることができます。コードは、いたるところusing MyStringIntPair = MyProject.Collections.Generic.KeyValuePair<string, int>
にないため、はるかにきれいに見えます。MyProject.Collections.Generic
ネイティブ相互運用。私は個人的に、ネイティブlong
型を扱うときにこれが非常に役立つことを発見しました。ほとんどのオペレーティング システムでは、along
はポインターと同じサイズですが、Windows 64 ビットでは int と同じです。したがって、ほとんどのオペレーティング システムでは、 をlong
として表すことができIntPtr
ますが、Windows 64 ビットでは変更する必要があるため、型エイリアスを作成し、プリプロセッサ ディレクティブでその定義を変更します。
a. FreeType はlong
かなりの量を使用するため、そのバインディングを作成したときに、Windows 64 ビットでも動作するようにする必要がありました。OS に基づいた何らかの動的なサブクラス化を検討していましたが、プリプロセッサ ディレクティブと型エイリアスの方が単純で、今のところ作業は完了しています。例として、 longs を使用する 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
特に衝突する名前空間が複数ある場合