web-dev-qa-db-ja.com

異なる名前空間で同じクラス名を処理するにはどうすればよいですか?

共通のライブラリ構造を作成しようとしています。私は私が望むすべての一般的なライブラリに対して個別のプロジェクトを作成することでこれを行っています

次の2つの名前空間があります:MyCompany.ERPおよびMyCompany.Barcode

"Utilities"という名前のクラスがあり、静的である必要があります。その場合、静的クラスにアクセスする前に、完全な名前空間名を指定する必要があります。

それを行うための他の好ましい方法はありますか?

または、私はBarcodeUtilsERPUtilsのようなクラスで異なる名前を使用する必要がありますか?

24
e4rthdog

その場合、静的クラスの前に完全な名前空間名を指定して、それにアクセスする必要がありますか?

いいえ、その必要はありませんが、詳細はこれらの型を使用するクラスと using宣言 によって異なります。

クラスで名前空間のoneのみを使用する場合、あいまいさはなく、先に進んで型を使用できます。

両方の名前空間を使用する場合は、使用法を完全に修飾するか、namespace/type aliases を使用して型を明確にする必要があります。

using ERPUtils = MyCompany.ERP.Utilities;
using BCUtils = MyCompany.Barcode.Utilities;

public void MyMethod()
{
  var a = ERPUtils.Method();
  var b = BCUtils.Method();
}
38
Oded

他に方法はありません。 usingディレクティブでエイリアスを作成できます:

using MC=MyCompany.ERP;
using MB=MyCompany.Barcode;
...
public void Test()
{
  var a = MC.Utilities.Method();
  var b = MB.Utilities.Method();
}

それらを管理する最も簡単な方法です。

19
Johnny_D

MSガイドライン は次のように述べています。

Element、Node、Log、Messageなどの一般的なタイプ名を導入しないでください。一般的なシナリオでタイプ名の競合が発生する可能性が非常に高くなります。

そして

単一のアプリケーションモデル内の名前空間の型に同じ名前を付けないでください。

代わりにBarcodeUtilitiesErpUtilitiesを使用することをお勧めします。 (ユーティリティクラスがクライアントコードで使用されることを意図していない場合を除いて、それらにUtilitiesという名前を付けてinternalにすることができます。)

12
millimoose

「ユーティリティ」は一般的すぎるため、クラスにあまり適していません。したがって、両方の名前をよりわかりやすい名前に変更する必要があると思います。

7
Matthew Watson

エイリアスを使用できます。

using BarcodeUtils  =  MyCompany.Barcode.Utilities;

衝突があるページ。ただし、これが多くの場所で発生している場合は、名前を変更するのが理想的です。

3
user3378

異なるクラス名を使用することをお勧めします。両方のユーティリティを実際に呼び出したい場合は、usingディレクティブでエイリアス機能を使用できます。

using ERP = MyCompany.ERP;
using Barcode = MyCompany.Barcode;

...
    ERP.Utilities.SomeMethod();
    Barcode.Utilities.SomeMethod();
1
Matt Varblow

両方に同じ名前を付ける場合は、完全パスを使用する必要があります。そうしないと、あいまいな参照エラーが発生します。

alias を使用できますが、次のように入力する必要がありません。

using Project = PC.MyCompany.Project;

もう少しわかりやすい別の名前を付けます。あ

0
Wouter de Kort

実際には、クラスの目的によって異なります。 Barcode.UtilitiesとERP.Utiliesを別々に配布する場合は、このままにしておくことをお勧めします。一方、同じクラスでonlyを使用する場合は、コードを簡単にするために2.メソッドを使用できます。

0
kkocabiyik