2012-08-28 8 views
25

Schnelle und einfache Frage. Ich verstehe, was das Namespace Alias-Qualifikationsmerkmal tut, es ist für den Zugriff auf Member in einem Namespace, aber auch der Dereferenzierungsoperator. Ich bin wirklich verblüfft über den Unterschied in dieser Situation, warum Sie einen über den anderen verwenden, oder wie sie jeweils das Gleiche erreichen.C# Namespace Alias-Qualifikationsmerkmal (: :) vs. Dereferenzierungsoperator (.)

using colAlias = System.Collections; 

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

+1 Nur weil ich seit ein paar Jahren in C# programmiert habe und ich diesen Operator noch nirgends gesehen habe. : D – Tudor

+0

@Tudor Gleiche Situation hier :) Sehr selten gesehen, aber ich lief heute darüber und wollte mehr erfahren. –

Antwort

11

Dies ist ein Eckfall :: (wie der @ Präfix) ist da, um mit den ziemlich seltenen Vorkommen, wo ein Name Konflikte zwischen Namespaces, Klassen und Schlüsselwörter.

:: funktioniert nur für Namespaces (und Namespace-Aliase), während .. funktioniert sowohl für Namespaces als auch für Subclasses. An den meisten Orten, an denen Sie es brauchen würden, wäre es besser, stattdessen einen anderen Namen zu verwenden, aber das ist nicht immer eine Option.

global:: ist ein Sonderfall, der am häufigsten in automatisch generiertem Code zu sehen ist - er setzt den referenzierten Namespace auf den Stamm zurück.

Angenommen, Sie generieren automatisch Code (z. B. für eine Formularanwendung, EF oder ähnliche Anwendungen), und Ihre App verwendet den Namespace YourCompany.Application. Jetzt entscheidet sich einer Ihrer Kunden (mit Ihrer automatischen Generierung), einen eigenen Namensraum in seiner App TheirCompany.YourCompany.Application hinzuzufügen. Jetzt alle Ihre Auto-Code schlägt fehl, weil, wenn es kompiliert. NET weiß nicht, ob Sie Ihren Namespace oder deren verwenden.

Um diesen Generierungscode mit global::YourCompany.Application zu reparieren, können diejenigen, die Ihren automatischen Generator verwenden, den Namespace verwenden, der ihnen gefällt, und keinen Konflikt verursachen.

Ich glaube, Microsoft hinzugefügt global::, weil sie einige .NET-Kunden erwarten, Namespaces wie System hinzufügen.

+0

_Ich denke, Microsoft hat global hinzugefügt :: weil ..._ Nicht genau: "Sie müssen möglicherweise auf zwei Versionen von Assemblys verweisen, die dieselben vollqualifizierten Typnamen haben" –

2

Es gibt eine MSDN page, die erklärt, wie das funktioniert.

Grundsätzlich in Ihrer Situation werden sie das gleiche erreichen und für die Lesbarkeit des Codes ist es bevorzugt, eine einzige . zu verwenden.

Ich würde den Operator :: für alles andere als den globalen Namespace nicht verwenden, und selbst dann gibt es mehr als genug Möglichkeiten, um es zu umgehen.

bearbeiten: Weitere Informationen, was der Operator tut, wird im Artikel :: Operator (C# Reference) erklärt.

0

Mit dem Namespace-Alias-Qualifikationsmerkmal (: :) können Sie auf Namespace-Methoden zugreifen, ohne Fehler zu verursachen, wenn CONFLICTING-Namespaces die gleiche Namenskonvention verwenden.

Zum Beispiel wie hier in Msdn erklärt http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx

+0

Vielen Dank für die Antwort, aber ich selbst habe das so gut verstanden, lies meine Beschreibung. Was ich wissen wollte, waren die Unterschiede, und zum Beispiel, warum Sie den Dereferenzierungsoperator nicht verwenden könnten, um auf den globalen Namespace zuzugreifen ... warum würden Sie einen über den anderen verwenden ... –

+1

@FranciscoAguilera Angenommen, Sie haben Ihre eigenen Systemklasse Wie würden Sie in diesem Fall den Dereferenzierungsoperator verwenden, um auf System.Console.WriteLine zuzugreifen, wenn Sie möchten? Sie verwenden also das Namespace-Alias-Qualifikationsmerkmal, um auf den globalen Namespace ( global :: System.Console.WriteLine()) zuzugreifen, um den Konflikt zu vermeiden. – TWickz

1

Die allgemeine Idee eines Namespace-Qualifikationsspiel ist, dass Sie den Namensraum selbst wenn der Name an anderer Stelle verwendet wurde, verweisen zu können. Wenn Sie eine Klasse mit dem Namen "colAlias" deklarieren, verweist colAlias.Hashtable auf die Klasse, aber colAlias ​​:: Hashtable würde auf den Wert des Namespace verweisen.

Dies ist ein ziemlich enger Anwendungsfall, und global:: ist der einzige typische Anwendungsfall, den ich für diesen Operator gesehen habe

6

Sie sagte:

Namespace Alias-Qualifikationsspiel der Fall ist, ist es für die Mitglieder in einem Namespace, aber so funktioniert das Dereferenzierungsoperator zugreifen.

Nun, nein. Der Operator . wird verwendet, um auf alle Elemente einschließlich der Funktionen zuzugreifen. Sie können nicht tun Console::WriteLine();

:: ist nur für Namespaces zu lösen, entweder aus einem Namespace alias wie folgt aus:

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

OR von global.

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

Sie nicht tun:

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

ABER, wenn Sie die . Operator funktioniert auch einen Alias ​​haben, so in Ihrem Fall, gibt es keinen Unterschied.

+0

Bedeutet das, dass der '.'-Operator alles tun kann, was der' :: '-Operator kann und mehr, außer dass er den globalen Namespace referenziert? – j00hi