Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Das using Schlüsselwort

Geschrieben von: Christoph Wille
Kategorie: C#

Wer mit C# arbeitet, dem ist das using Schlüsselwort spätestens seit dem obligatorischen Hello World Programm bekannt - als Statement zum Import von Namespaces. Daß using noch einiges mehr zu bieten hat, zeigt dieser Artikel, indem er die using Directive und das using Statement näher beleuchtet.

Die using Directive

Beginnen wir bei der bekanntesten Verwendungsart der using Directive:

using System;

Damit wird der System Namespace importiert, was bedeutet, daß man statt der absoluten Referenz System.Console nun auch Console direkt verwenden kann. Kritisch würde es bei einer Applikation die in zwei Namespaces identische Klassennamen verwendet:

using System;

namespace Directive
{
  class MainApp
  {
    static void Main(string[] args)
    {
      // no using statements
      AspHeute.NamespaceOne.DemoClass oOne= new AspHeute.NamespaceOne.DemoClass();
      oOne.SayHello();
      AspHeute.NamespaceTwo.DemoClass oTwo= new AspHeute.NamespaceTwo.DemoClass();
      oTwo.SayHello();
    }
  }
}

namespace AspHeute.NamespaceOne
{
  class DemoClass
  {
    public void SayHello()
    {
      Console.WriteLine("Hello, world! (A.O.D)");
    }
  }
}

namespace AspHeute.NamespaceTwo
{
  class DemoClass
  {
    public void SayHello()
    {
      Console.WriteLine("Hello, world! (A.T.D)");
    }
  }
}

Dieses Beispiel ist zwar an den Haaren herbeigezogen, aber bei Verwendung von Libraries von Drittherstellern kann es sehr wohl vorkommen, daß Klassen mit identischen Namen auftauchen. Die einfache Variante - das Verwenden von using - wird vom Compiler mit einem Fehler quittiert.

using System;
using AspHeute.NamespaceOne;
using AspHeute.NamespaceTwo;

namespace Directive
{
  class MainApp
  {
    static void Main(string[] args)
    {
      // error CS0104: 'DemoClass' is an ambiguous reference
      DemoClass oDemo = new DemoClass();
    }
  }
}
...

Hier weiß der Compiler nicht mehr, aus welchem Namespace er die Klasse nehmen soll. Hier kann uns die using Directive allerdings mit ihrer Alias-Funktionalität aushelfen:

using System;
using DcOne = AspHeute.NamespaceOne.DemoClass;
using DcTwo = AspHeute.NamespaceTwo.DemoClass;

namespace Directive
{
  class MainApp
  {
    static void Main(string[] args)
    {
      DcOne oOne= new DcOne();
      oOne.SayHello();
      DcTwo oTwo= new DcTwo();
      oTwo.SayHello();
    }
  }
}

Die beiden identen Klassennamen werden mit Hilfe von using auf eindeutige Namen "umgebogen". Damit erspart man sich dann die volle Angabe der Namespaces wie im ersten Codesample. Natürlich kann man mit der Alias-Funktionalität auch die Namespaces selbst "verbiegen":

using System;
using NsOne = AspHeute.NamespaceOne;
using NsTwo = AspHeute.NamespaceTwo;

namespace Directive
{
  class MainApp
  {
    static void Main(string[] args)
    {
      NsOne.DemoClass oOne= new NsOne.DemoClass();
      oOne.SayHello();
      NsTwo.DemoClass oTwo= new NsTwo.DemoClass();
      oTwo.SayHello();
    }
  }
}

Damit verkürzt man sehr elegant lange Namespaces.

Das using Statement

Neben der using Directive gibt es auch das using Statement, das zu Unrecht weniger bekannt ist, denn es ist sehr nützlich in der Welt von .NET: es unterstützt bei der sauberen Auflösung von Resourcen-teuren Objekten.

Wie funktioniert das? Nun, das using Statement ist für Klassen gedacht, die das IDisposable Interface unterstützen (wer die SDK Hilfe installiert hat, kann diesen Hilfe Link klicken, um alle Klassen zu sehen, die dieses Interface implementiert haben). Dieses Interface besitzt genau eine Methode, nämlich Dispose. Diese Methode wird verwendet, um dem Objekt mitzuteilen, daß es seine teuren Resourcen freigeben kann, weil wir das Objekt nicht mehr verwenden werden (und der Garbage Collector es erst später auflöst).

Grundsätzlich sieht das using Statement so aus:

using (expression | type identifier = initializer)
{
  // Code der das Objekt verwendet
}

Ein weiterer wichtiger Vorteil des using Statements ist, daß auch im Falle einer Exception die Dispose Methode aufgerufen wird. Man erspart sich also Dispose Aufrufe im finally Teil des Exception Handlings - man kann sie vor allem nicht mehr vergessen, weil sie automatisch aufgerufen werden (für Objekte die mit using erzeugt wurden, klarerweise).

Für eine Applikation die Webseiten grabbt könnte man using wie folgt einsetzen:

using System;
using System.Net;

namespace Statement
{
  class MainApp
  {
    static void Main(string[] args)
    {
      WebRequest wrq = WebRequest.Create("http://www.aspheute.com/");
      using (WebResponse response = wrq.GetResponse())
      {
        // exception or not, response will always be disposed
      }
    }
  }
}

Es fehlt hier der Exception-Handling Code, aber: Dispose wird immer aufgerufen, was speziell bei offenen TCP/IP Verbindungen sehr nützlich ist, denn unlimitiert kann man diese nicht aufmachen. Somit hilft using die Resourcen zu schonen, vor allem mit dem Vorteil, daß man als Programmierer nicht mehr auf den Aufruf von Dispose vergessen kann!

Schlußbemerkung

Die using Directive und das using Statement sind beides nützliche Helfer, die die tägliche Arbeit erleichtern - und den Code verbessern können.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Das ASP.NET DataGrid selbst erweitern
Exception Handling in C#
Index Server Abfragen per Web Service
On-the-fly Erstellung von vCard's
Sichere Konvertierungen von Referenztypen

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.