Montag, 31. Januar 2011

C#: Namespaces

Grundlagen

Ein Namespace ist so etwas ähnliches wie ein Ordner - nur halt für Code anstatt für Dateien.
Jeder Code in C# muss in einem Namespace sein. Namespaces können verschachtelt werden. Wenn man in VC# eine neue Klasse erstellt, wird automatisch ein Namespace mit folgendem Aufbau "dazugedichtet": ProjektName.OrdnerNameDerDatei
Dieser Name darf (und sollte ;) ) geändert werden.
Um auf einen Namespace zuzugreifen hat man verschiedene Möglichkeiten.

Beispiel 1:

namespace BGE
{
  public class A {...}
  public class B {A myAInstance;}
}

In diesem Beispiel sind die Klassen A und B im selben Namespace. Damit B A implementieren kann, muss nicht explizit der Namespace-Name angegeben werden.

Um das Zeug ausserhalb des Namespaces zu benutzen gibt es zwei Möglichkeiten:
- Man benutzt die using-Direktive um den Namespace bekannt zu machen.
- oder man schreibt explizit den Namen des Namespace vor die benutzten Klassen/Variablen/Etc.

Beispiel 2:

using BGE;
namespace MyProgram
{
  class C {A myClassInstance;}
}

oder

namespace MyProgram
{
  class C {BGE.A myClassInstance;}
}

Wie man sieht, kann man A in C implementieren, indem man erst die using-Direktive benutzt oder den Namen des Namespace direkt hinschreibt.

Verschachtelung

Namespaces können ineinander verschachtelt werden. Ein Namespace NB in einem anderen Namespace NA hat Zugriff auf alles, was in NA UND NB ist. NA hat jedoch keinen expliziten Zugriff auf Zeug in NB.

Beispiel 3:

namespace BGE.Managers {...}

entspricht

namespace BGE
{
  namespace Managers
  {...}
}

Verschachtelungen werden mit einem Punkt getrennt. Um in BGE auf Managers zuzugreifen, schreibt man einfach Managers.xyz, um AUSSERHALB von BGE auf Managers zuzugreifen, schreibt man BGE.Managers.xyz (bzw. using BGE.Managers)
Namespaces sind partiell, es muss nicht alles in der selben Datei stehen.

Using Direktive

Mit der using-Direktive kann man einiges anstellen. Das wichtigste ist wohl, einen Namespace direkt verfügbar zu machen:

using BGE;
using BGE.Managers;

Die Direktive kann auch benutzt werden um einen Namespace-Namen abzukürzen. Das da geht zum Beispiel nicht, das würde eventuell Konflikte geben:

using MyGame.Managers
using BGE.Managers

Wir haben hier zweimal einen Managers-Namespace mit eventuell den selben Klassen-Namen. Um diese explizit zu trennen OHNE immer den vollen Namen zu schreiben, kann man sich eine Abkürzung überlegen:

using MM=MyGame.Managers
using BM=BGE.Managers

Nun kann man über MM auf die Manager des MyGame-Namespaces zugreifen und über BM auf die Manager im BGE-Namespace.

Meine Abkürzungen

Ich habe für mich folgende Standards gewählt:

(using)
Xna    = Microsoft.Xna.Framework;
XGfx   = Microsoft.Xna.Framework.Graphics;
XInput = Microsoft.Xna.Framework.Input;
SysCol = System.Collections.Generic;

Keine Kommentare:

Kommentar veröffentlichen