28

迅速で簡単な質問。名前空間エイリアス修飾子が何をするのか理解しています。名前空間のメンバーにアクセスするためのものですが、間接参照演算子も同様です。この状況の違い、なぜ一方を他方に使用するのか、またはそれぞれが同じことをどのように達成するのかについて、私は本当に困惑しています。

using colAlias = System.Collections;

namespace myns
{
    class TestApp
    {
        static void Main()
        {
            colAlias.Hashtable test = new colAlias.Hashtable();
            colAlias::Hashtable test1 = new colAlias::Hashtable();
        }
    }
}
4

5 に答える 5

13

::これは(プレフィックスのような)コーナーケース@であり、名前空間、クラス、およびキーワード間で名前が競合する非常にまれな発生に対処するためにあります。

::名前空間(および名前空間エイリアス)に対してのみ機能しますが、.。名前空間とサブクラスの両方で機能します。あなたがそれを必要とするほとんどの場所では、代わりに別の名前を使用する方が良いでしょうが、それは常にオプションであるとは限りません。

global::これは、自動生成されたコードで最も頻繁に見られる特殊なケースです。参照される名前空間をルートにリセットします。

たとえば、コードを自動生成し(フォームアプリ、EFなどの場合)、アプリが名前空間を使用するとしますYourCompany.Application。これで、顧客の1人が(自動生成を使用して)アプリに独自の名前空間を追加することにしましたTheirCompany.YourCompany.Application。これで、すべての自動コードが失敗します。これは、コンパイル時に.Netが名前空間とその名前空間のどちらを使用するかを認識しないためです。

この生成コードをglobal::YourCompany.Applicationで修正するには、自動ジェネレーターを使用するユーザーは、競合することなく、好きな名前空間を使用できます。

global::一部の.Netの顧客が。のような名前空間を追加することを期待していたため、Microsoftが追加したと思いますSystem

于 2012-08-28T10:11:00.037 に答える
6

あなたが言った:

名前空間エイリアス修飾子は、名前空間内のメンバーにアクセスするためのものですが、間接参照演算子も同様です。

うーん、ダメ。.演算子は、関数を含む任意のメンバーにアクセスするために使用されます。できませんConsole::WriteLine();

::次のような名前空間エイリアスから、名前空間を解決するためだけのものです。

using colAlias = System.Collections;
...
...
colAlias::Hashtable test = new colAlias::Hashtable();

またはグローバルから。

global::System.Console.WriteLine(..);

あなたはできません:

System.Collections::ArrayList a = new System.Collections.ArrayList();

ただし、エイリアスがある場合は.演算子も機能するため、この場合、違いはありません。

于 2012-08-28T07:11:13.860 に答える
2

これがどのように機能するかを説明するMSDNページがあります。

基本的に、あなたの状況では、それらは同じことを達成し、コードの可読性のために、単一のを使用することが好ましい.

グローバル名前空間以外では演算子を使用しません::が、それでも回避する方法は十分にあります。

編集:オペレーターが行うことの詳細については、::オペレーター(C#リファレンス)の記事で説明されています。

于 2012-08-28T06:48:51.107 に答える
1

名前空間修飾子の一般的な考え方は、名前が他の場所で使用されている場合でも、名前空間を参照できるようにすることです。「colAlias」という名前のクラスを宣言した場合、colAlias.Hashtableはクラスを参照しますが、colAlias::Hashtableは名前空間の値を参照します。

これはかなり狭いユースケースでglobal::あり、このオペレーターで私が見た唯一の典型的なユースケースです(未知のアプリケーションでコンパイルされる生成されたコードを作成するときに競合が発生しないようにする場合)。

于 2012-08-28T06:50:29.633 に答える
0

名前空間エイリアス修飾子(::)は、同じ命名規則を使用するCONFLICTING名前空間がある場合に、エラーを発生させることなく名前空間メソッドにアクセスするのに役立ちます。

たとえば、ここでmsdnhttp://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspxで説明されているよう

于 2012-08-28T06:49:23.573 に答える