C#名前空間エイリアス-何が問題なのでしょうか?


95

次のような名前空間エイリアスをどこでいつ使用しますか

 using someOtherName =  System.Timers.Timer;

言語を理解する上で混乱を招くだけのようです。


6
using int = System.Int32C#のシステム全体についてはどうですか?便利ですね。他と同じように利用できます。
nawfal 2013年

@nawfalタイプエイリアスはエクスポートできないと思います。using int = System.Int32つまり、のようなものを定義して、宣言ファイル以外の場所で使用することはできません。したがって、これintInt32別名にすることは、他の手段によって実現されるか、コンパイラ/ランタイムで特別なことです。
KFL 2016年

1
@KFLは真実ですが、両方のメリットは同じです。
nawfal

1
@nawfalについてのあなたの議論using int = System.Int32は間違っていて誤解を招くものです- intあなたが説明した方法でエイリアスが実装されていないため、それは間違っています。あなたは型の別名がどのように同じように、世界的に使用することができますを意味するものであるため、それは誤解を招くですintにわたり使用されていますInt32
KFL、2016年

2
@KFL私は両方を意味しませんでした。タイプにカスタム名を付けると便利な理由を述べました。
nawfal

回答:


151

これは型のエイリアスであり、名前空間のエイリアスではありません。一義化することは有用です-たとえば、

using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;

(ps:Timer;-pをお選びいただきありがとうございます)

それ以外の場合、両方を使用して同じファイルで使用するSystem.Windows.Forms.TimerSystem.Timers.Timer、完全な名前を付け続ける必要があります(Timer混乱を招く可能性があるため)。

またextern、異なるアセンブリからの同じ完全修飾型名を持つ型を使用するためのエイリアスの役割も果たします-まれですが、サポートすると便利です。


実際、私は別の使用法を見ることができます:型にすばやくアクセスしたいが、usingいくつかの競合する拡張メソッドをインポートできないため、通常は使用したくない場合...少し複雑ですが...ここに例があります...

namespace RealCode {
    //using Foo; // can't use this - it breaks DoSomething
    using Handy = Foo.Handy;
    using Bar;
    static class Program {
        static void Main() {
            Handy h = new Handy(); // prove available
            string test = "abc";            
            test.DoSomething(); // prove available
        }
    }
}
namespace Foo {
    static class TypeOne {
        public static void DoSomething(this string value) { }
    }
    class Handy {}
}
namespace Bar {
    static class TypeTwo {
        public static void DoSomething(this string value) { }
    }
}

8
名前空間または型名のエイリアスを作成するために使用できます。
ショーンブライト

1
@Sean:はい、ただし、例はタイプ
に対するものでした

@lupefiasco:OPの選択がSystem.Timers.Timer便利;-p
Marc Gravell

ああ、あなたは具体的な例ではなく概念を参照していると思いました。Mea culpa。
Sean Bright

26

サブ名前空間やオブジェクト名が競合する名前空間が複数ある場合は、[例として]次のように使用できます。

using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;

...

src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();

さもなければ書かなければならないでしょう:

Namespace1.Subspace.DataAccessObjects.DataObject source = 
  new Namespace1.Subspace.DataAccessObjects.DataObject();

Namespace2.Subspace.DataAccessObjects.DataObject dstination = 
  new Namespace2.Subspace.DataAccessObjects.DataObject();

タイピングの手間を省き、コードを非常に読みやすくするために使用できます。


17

上記の例に加えて、(名前空間エイリアスではなく)タイプエイリアスは、ジェネリック型を繰り返し参照するときに便利です。

Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();

private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}

対:

using FooDict = Dictionary<string, SomeClassWithALongName>;

FooDict foo = new FooDict();

private void DoStuff(FooDict dict) {}

8

簡潔。

型名を共有する名前空間を明確にする利点はありますが、本質的には単なる砂糖です。


使用している記号が明確に表示されます。これは単なる砂糖ではありませんが、少し冗長です(新しい名前を定義したくない場合)。
Earth Engine

7

私はいつもこのような状況でそれを使用します

using Utility = MyBaseNamespace.MySubNamsepace.Utility;

どこUtilityそれ以外(のような異なるコンテキストを持っているでしょうMyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility)が、私は期待/好むUtility常にその1つの特定のクラスを指すように。


6

複数の名前空間に同じ名前のクラスが複数ある場合に非常に便利です。例えば...

namespace Something.From.SomeCompanyA {
    public class Foo {
        /* ... */
    }
}

namespace CompanyB.Makes.ThisOne {
    public class Foo {
        /* ... */
    }
}

エイリアスを使用すると、コンパイラーを幸せにしたり、自分やチームの他のメンバーが物事をより明確にすることができます。

using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;

/* ... */

CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();

3

すべての名前空間に名前空間エイリアスを定義しました。これにより、クラスがどこから来たのかを簡単に確認できます。例:

using System.Web.WebControls;
// lots of other using statements

// contains the domain model for project X
using dom = Company.ProjectX.DomainModel; 
// contains common web functionality
using web = Company.Web;
// etc.

そして

// User from the domain model
dom.User user = new dom.User(); 
// Data transfer object
dto.User user = new dto.User(); 
// a global helper class
utl.SomeHelper.StaticMethod(); 
// a hyperlink with custom functionality
// (as opposed to System.Web.Controls.HyperLink)
web.HyperLink link = new web.HyperLink(); 

エイリアスの命名方法に関するガイドラインをいくつか定義し、誰もがそれらを使用しています。


1
エイリアスは、オブジェクトの物理的な場所よりも、エイリアスが使用されているコンテキストと関係があることが多いと思いませんか?
BenAlabaster、2009

2

エイリアスは単体テストで非常に便利です。単体テストを作成する場合、テスト対象を次のように宣言するのが一般的です。

MyClass myClassUT;

myClassUT主題UファインダーTの静的メソッドを持つ静的クラス用のライトユニットテストしたい場合は、EST。しかし、何?次に、次のようなエイリアスを作成できます。

using MyStaticClassUT = Namespace.MyStaticClass;

次に、次のようにユニットテストを記述できます。

public void Test()
{
    var actual = MyStaticClassUT.Method();
    var expected = ...
}

テスト中の対象が何であるかを見失うことはありません。


2

ある意味では、Visual Studioでコーディングするときに非常に便利です。

使用例:たとえばSqlConnection、名前空間のクラスなど、いくつかのクラスのみを使用するとしますSystem.Data。通常のコースでは、System.Data.SqlClient以下に示すように* .csファイルの先頭に名前空間をインポートします。

using System.Data;

今私のインテリセンスを見てください。コードエディターに入力するときに選択するクラスがたくさんあるため、このクラスは大幅に増加しています。全部のクラスを使用するつもりはありません。

ここに画像の説明を入力してください

そのため、*。csファイルの先頭にエイリアスを使用して、明確なインテリセンスビューを取得します。

using SqlDataCon = System.Data.SqlClient.SqlConnection

今私のインテリセンスビューを見てください。超クリアで超クリーンです。

ここに画像の説明を入力してください


1

私が知っている理由の1つ。インポートされた名前空間からの名前の衝突がある場合、短い名前を使用できます。例:

宣言using System.Windows.Forms;using System.Windows.Input; 、アクセスModifierKeysするときに同じファイルにある場合、名前ModifierKeysSystem.Windows.Forms.ControlSystem.Windows.Input名前空間の両方にあることに気付く場合があります。したがって、宣言using Input = System.Windows.Input;することで、System.Windows.Input.ModifierKeys経由で取得できますInput.ModifierKeys

私はC#の愛好家ではありませんが、エイリアスの名前空間は「ベストプラクティス」のように思えます。そうすれば、何を取得しているかを知ることができ、それ以上入力する必要はありません。


1

それらを使用して、コードを非常に簡単に変更できます。

例えば:

#if USE_DOUBLES
using BNumber = System.Double;
#else
using BNumber = System.Single;
#endif

public void BNumber DoStuff(BNumber n) {
    // ...
}
public void BNumber DoStuff2(BNumber n) {
    // ...
}
public void BNumber DoStuff3(BNumber n) {
    // ...
}

ディレクティブを変更するだけで、コード全体がfloatまたはで動作するかどうかを判断できますdouble

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.