Geschrieben von: Christian Holm
Kategorie: ASP.NET
This printed page brought to you by AlphaSierraPapa
Web Seiten gibt es viele, die meisten sind in HTML geschrieben. Will man Interaktionen mit dem Webserver, wie Formulare auswerten oder Datenbank-Records auslesen, in eine Webseite integrieren, so genügt reines HTML nicht mehr. Für einen ASP Programmierer ist dies nichts neues, denn es gibt schon seit geraumer Zeit die Möglichkeite server-side Skripts mit ASP zu schreiben. Die für ASP am häufigsten verwendeten Sprachen sind VBScript und JScript. Mit dem Erscheinen der .NET Platform und ASP.NET vollzieht sich allerdings ein Quantensprung in der Programmierbarkeit von Webseiten. In ASP.NET können Sie komplexe Anwendungen einfach implementieren, und mit C# (C Sharp) haben sie eine vollständige, objektorientierte Programmiersprache zur Verfügung. Mit C# haben Sie Möglichkeiten, die weit über die der Scriptsprachen VBScript und JScript hinaus gehen.
Unter der Verwendung von ASP.NET können Sie nicht nur professionelle Formulare erstellen, sondern haben mit C# auch ein Werkzeug, das die Möglichkeiten von C++ mit der einfachen Programmierbarkeit und Fehlersicherheit einer Scriptsprache verbindet. C# ist eine moderne, objektorientierte Programmiersprache die die Fähigkeiten von C++ besitzt, aber sich fast wie Visual Basic programmieren läßt. Damit sind Sie in der Lage, die Grenzen von VBScript um Lichtjahre zu überschreiten, da Sie mit C# Zugriff auf das Microsoft .NET Framework haben und sämtliche darin integrierten Klassen und Namespaces (Familien von Klassen) haben.
Wie immer bei unseren ASP.NET Artikeln können Sie vom downloadbaren Sourcecode nur dann profitieren, wenn Sie das Microsoft .NET Framework SDK auf einem Webserver installiert haben. Damit werden auf diesem Webserver ASP.NET Seiten ( .aspx ) ausführbar. Weiters ist es von Vorteil, daß der Leser schon Grundkenntnisse bzw. Erfahrung in grundlegenden Programmiertechniken besitzt - es finden sich etliche Artikel auf ASP-Heute, die Ihnen das notwendige Wissen verständlich näher bringen.
Anmerkung: Dadurch, daß in C#, wie auch in C++, die Befehle der Programmiersprache der englischen Sprache entlehnt, werde ich die sprachspezifischen Befehle, Schlüsselwörter etc., direkt aus der C# Syntax übernehmen und egebenfalls das entsprechende deutsche Äquivalent erklären.
Das werden sich sicherlich manche von Ihnen jetzt fragen. Klassen bzw. die damit verbundene objektorientierte Programmierweise sind sicherlich keine der leichtesten Übungen für einen Web-Programmierer. Jedoch sind Klassen der Hauptbestandteil der objektorientierten Programmierung. Also was macht C# Klassen so interessant für Webprogrammierer? Nun, für den Fall, daß Sie schon an die Grenzen von Scriptsprachen gestoßen sind, oder die vielseitigen Funktionen des .NET Framework bzw. Microsoft Windows 2000 DNA optimal einsetzten wollen, so liefert Ihnen dieser Artikel eine gute Einführung in das, was es nach der einfachen ASP/ASP.NET Programmierung zu erlernen lohnt - C# Klassen.
Zu diesem Artikel: Ich habe versucht, Interessierte ohne Basiswissen in C# nicht zu überfordern, und dennoch Profis nicht zu langweilen. Weiters achten Sie auf die Schreibweise der C# Befehle (Groß-/Kleinschreibung) in den Sourcecodes - denn C# ist case sensitive und unterscheidet sehr wohl zwischen Groß- und Kleinschreibung!
Schon leicht angestaubt, aber nichts destotrotz Tradition - das simple "Hello World" Beispiel. Es gibt natürlich weitaus einfachere Methoden den Schriftzug "Hello World" im Browserfester darzustellen, als mittels einer C# Klasse in ASP.NET. Aber hier soll das Beispiel als Einstieg für eine Ihnen vielleicht neue, effiziente und vielseitige Programmiertechnik geben - die objektorientierte Klassenprogrammierung.
Das Klassenmodell des .NET Frameworks und damit auch in C# ist hierarchisch aufgebaut, d.h. im einfachsten Fall enthält eine Klasse untergeordete Methoden, Eigenschaften (Properties) und einen Constructor, der bei der Instanzierung der Klasse ausgeführt wird.
Sehen wir uns zur weiteren Erkärung das Hello World-Beispiel an (im Download die Datei helloworld.aspx):
<script Language=C# runat=server> public class SimpleClass { string strText; //deklariere Variable //Constructor public SimpleClass(string strText) { this.strText = strText; } //Methode der Klasse public string DisplayText() { return strText; } } </script> <% @Page Language="C#" %> <% SimpleClass simple = new SimpleClass("Hello World"); Response.Write(simple.DisplayText().ToString()+"<br>"); %>
In dieser ASP.NET Seite ist zu beachten, daß die eigenliche C#-Klasse in einem sogenannten ASP.NET Wrapper eingebunden ist. Dieser ermöglicht die Ausführung der Klasse am Webserver. Der Script-Tag deklariert, daß die Sprache C# ist, und daß der Codeblock innerhalb von <SCRIPT> und </SCRIPT> am Webserver auszuführen ist (runat=server).
Nun aber zum eigenlichen Thema:
Die öffentliche Klasse "SimpleClass" wird mittels class Befehl definiert.
"Öffentlich" (Public) bedeutet hier, daß die Klasse auch von fremden
Programmen aufgerufen werden könnte, nicht nur aus der ASP.NET Seite heraus.
public class SimpleClass { //Definition vom Eigenschaften und Methoden ... }
Weiters besitzt die Klasse einen Constructor, der zwingend den gleichen Namen wie die ihm zugeteilte Klasse haben muß. Der Constructor ist eine spezielle Function oder Method, die ausgeführt wird, wenn die Klasse als Objekt instanziert wird. Im Constructor kann man zum Beispiel Resourcen reservieren, Datenbank Verbindungen öffnen oder Variablen auf definierte Werte setzen.
//Constructor public SimpleClass(...) { ... }
Immer dann, wenn man eine Klasse als Objekt instanziert, daher ein Kopie der Klasse an eine Variable übergibt, so wird der Contructor der Klasse ausgeführt.
In C# entspricht eine Method (Methode) im allgemeinen einer Sub bzw. Function in Visual Basic. Eine Function eines Objektes, die von ausserhalb des Objektes aufgerufen wird, nennt man Method oder Methode. Eine Objektmethode ruft man über den Syntax Object.Method auf. Eine aufrufbare Methode muß innerhalb der Klasse als public defniert sein. Natürlich kann jede Function auch von innerhalb der Klasse aufgerufen werden. Dies gilt sowohl für von außen zugängliche (public) als für nur von innerhalb der Klasse zugängliche (private) Functions.
public class SimpleClass { //Public Function. Kann als Methode angesprochen werden public string DisplayText() { return strText; } //Private Function, kann nur von innerhalb der Klasse aufgerufen werden. private void DeleteText() { strText = ""; } }
Damit wären wir schon beim nächsten Punkt: dem reinen ASP.NET Teil des Sourcecodes. Der ASP.NET Teil wird mit <% @Page Language="C#" %> eingeleitet. Hier wird die Programmiersprache der ASP.NET Seite festgelegt. Im allgemeinen mußen in einer ASP.NET Seite alle Codeblöcke, sowohl die innerhalb von <SCRIPT> als auch die innerhalb von <% %> die gleiche Programmiersprache haben.
Die ASP.NET Seite erstellt mittels new eine neue Instanz des SimpleClass Objektes, und speichert sie in der Variablen simple. Natürlich ist damit die Variable simple vom Type der Klasse. Der Wert, der in den Klammern des Klassennamens steht, wird automatisch an den Contructor der Klasse übergeben.
SimpleClass simple = new SimpleClass("Hello World");
Bei der Instanzierung des SimpleClass Objektes wird der Wert "Hello World" in der klassen-internen Variable strText gespeichert.
Nun zur nächsten Zeile des Sourcecodes, zur DisplayText-Methode in unserem Beispiel. Die DisplayText Methode der SimpleClass Klasse tut nicht wirklich viel, sie gibt nur einen Wert aus der Klasse zurück, nämlich den Wert der klassen-intern in der String-Variablen strText gespeichert ist. Genauere Details über die Verwendung von Methoden können Sie in den nachfolgenden Abschnitten lesen.
Schließlich erfolgt der Aufruf der DisplayText Methode der Klasse:
simple.DisplayText()Der Rückgabewert der DisplayText Methode wird mittels ToString explizit in eine Zeichenkette umgewandelt und mittels Response.Write im Browserfenster ausgegeben.
Response.Write(simple.DisplayText().ToString()+"<br>");
Response.Write ist Ihnen sicher von ASP her vertraut. Der Befehl sendet einfach eine Zeichenkette zum Browser.
Sollten Sie sich jetzt fragen, wo die tollen ASP.NET Webform Controls bleiben, so muß Ich sie vertrösten. Diese will ich Ihnen auch nicht vorenthalten, aber vertage deren Abhandlung auf einen der folgenden Artikel, der sich dann mit anspruchsvolleren Themen wie z.B. Vererbung von Klassen, Interfaces oder Event-Triggerung beschäftigt. Dort sollen dann auch die ersehnten ASP.NET Webform Controls zum Einsatz kommen.
In dem obigen Beispiel habe ich einen Wert mit Hilfe des Keywords return zurück gegeben. Damit der C# Compiler auch wirklich zufrieden ist, muß ich in der Method selbst den Datentyp angeben, der in diesem Fall string lautet:
... public string DisplayText() { ... } ...
Natürlich können Sie jeden Datentyp (integer, byte, bool, double, etc.) den Sie benötigen bei der Deklaration der Method festlegen. Sollte die Method einmal keinen Wert mittels return zurückgeben, so kennzeichen Sie dies bei der Deklaration der Method mit der Angabe von void.
Die benutzte Method DisplayText() war ja nicht besonders anspruchsvoll. Sie hat gerade mal einen Wert vom Datentyp string zurückgegeben. Wow! Aber C# kann bei Weitem mehr!! Deshalb habe ich auch ein weiteres Beispiel vorbereitet.
Sie erinnern sich sicher noch an das lösen von quadratischen Gleichungen aus Ihrer Schulzeit. Quadratische Gleichungen - einmal abgesehen von der Möglichkeit, daß komplexe Lösungen für manche Fachgebiete keine Lösungen darstellen - besitzten im allgemeinen immer zwei Lösungen. Deshalb wird auch unsere Methode zwei Lösungs-Werte retour liefern. Nebenbei, mathematische Aufgaben eigenen sich hervorragend zur Demonstration von Konzepten in Zusammenhang mit Klassen, da sie meist keine allzu großen Gedankenexperimente erfordern und man sich dadurch auf die Programmiertechnik konzentrieren kann.
Das nun folgende Beispiel verwendet zum Lösen der Gleichung x2+4*x-7=0 die die "kleine Lösungs Formel" in "p" und "q". Der nun folgende Sourcecode stellt eine von tausenden Möglichkeiten der Durchführung dar - Fangen wir mit dem ersten Abschnitt an:
<script Language=C# runat=server > class QuadExpr { double dVarP, dVarQ; double dZwischen; //Constructor public QuadExpr(double dVarP, double dVarQ) { this.dVarP = dVarP; this.dVarQ = dVarQ; } ...
Wiederum wird eine neue Klasse erstellt, die benötigten Variablen werden deklariert und der Constructor der Klasse angegeben. Neu ist hier die Verwendung von this in Verbindung mit den Namen der Variablen der Klasse innerhalb des Constructors. Eine als this bezeichnete Variable ist innerhalb aller Member Functions der Klasse verfügbar und steht stellvertretend für die aktuellen Instanz der Klasse, also defür das Objekt selbst.
//Method public void Calculate(out double dResX1, out double dResX2) { dZwischen = Math.Sqrt(Math.Pow((dVarP/2),2)-dVarQ); dResX1 = -dVarP/2 + dZwischen; dResX2 = -dVarP/2 - dZwischen; } } </script>
Die angeführte Methode Calculate berechnet die Lösungen der quadratischen Gleichung. Damit ich jetzt aber die zwei Lösungen innerhalb einer Method zurückgeben kann, muß ich bei der Deklaration der Methodenparameter die Ergebnisvariablen dResX1 und dResX2 mittels out als Rückgabeparameter kennzeichenen. Ein out Parameter ermöglicht die Wertübergabe von noch uninitialisierten Variablen. Die beiden Methoden der System.Math Klasse berechnen die Quadratwurzel eines Wertes (Sqrt), oder quadrieren (Pow) den übergebenen Wert.
<%@ Page Language="C#" %> <% QuadExpr quadex = new QuadExpr(4,-7); double dResX1,dResX2; quadex.Calculate(out dResX1, out dResX2); Response.Write("x1: "+dResX1.ToString()+"<br>"); Response.Write("x2: "+dResX2.ToString()); %>
Im Hauptteil der ASP.NET Seite wird nach dem Erstellen des quadex Objekts (vom Typ der Klasse QuadExpr) die Method Calculate aufgerufen, welche die Ergebnisvariablen der Lösung der quadratischen Gleichung errechnet und als out Parameter an die ASP.NET Seite übergibt. Wie gewohnt erfolgt die Ausgabe der Variablenwerte mittels Response.Write.
Ein weiterer wichtiger Aspekt in Bezug auf Klassen sind die Eigenschaften oder Propertieseiner Klasse.
Zum Abschluß möchte ich Ihnen eine Einführung in die Properties (Eigenschaften) von Klassen geben. Properties sind im allgemeinen die Members (Mitglieder) einer Klasse, über die man Werte an das Objekt übergeben oder aus dem Objekt erhalten kann. Properties stehen in einem engem Verhältnis mit den sogenannten Accessor Functions (get und set), die das Steuern und Überwachen der Ein- und Ausgaben erlauben, die über eine bestimmte Property des Objektes erfolgen.
Sie können mit Properties über den get Accessor die aktuellen Werte von Variablen der Klasse auslesen, auch wenn die Variablen selbst innerhalb der Klasse als private deklariert sind. Mit Hilfe des set Accessors können Sie Klassen-Variablen neue Werte zuweisen. Das kontrollierte Zuweisen und Auslesenvon Variablen der Klasse erfolgt also mit den erwähnten Accessor Functions get {...} und set {...}.
Mit dem nächsten, einfachen Beispiel möchte ich dies demonstrieren. Der Übersicht halber habe ich den gesamten Sourcecode in die Hauptabschnitte aufgeteilt.
<script Language=C# runat=server> public class GetSetVar { private int nVar1=0; //deklariere Variable //Property public int MyProperty { //Accessor function get get { return nVar1; } ...
In dem ersten Abschnitt deklariere ich zunächst die zu behandelnde Variable nVar1. Da die Variable nur von Funktionen innerhalb der Klasse gelesen werden soll, wird so als private deklariert. Dann habe ich die eigentliche Property namens Variable deklariert. Die Deklaration beinhaltet die oben besprochenen Accessor Function get, welche den aktuellen Wert einer privaten (private) Variablen holt. Die Variable hat den momentanen Wert 0 entsprechend der Variablendekaration. Um den Wert der Variablen zu ändern, definiert man eine set Accessor Function:
... //Property public int MyProperty { ... //Accessor function get set { nVar1 = value; } } } ...
Das Keyword value innerhalb der Definition des set Accessors enthält dabei immer den Wert, der der Property des Objektes gerade zugewiesen wurde.
Mittels set Accessor definiere ich, was bei der Zuweisung eines Wertes zur Property namens MyProperty an geschehen soll. In unserem Beispiel wird der Wert einfach in der privaten Variablen nVar1 im Objekt gespeichert.
Die vollständige Deklaration der Property namens MyProperty innerhalb der Klasse sieht also wie folgt aus:
... //Property public int MyProperty { //Accessor function get get { return nVar1; } //Accessor function get set { nVar1 = value; } } } ...
Nun wird im letzten Abschnitt des Codeblocks der Eigenschaft MyProperty des GetSetVar Objektes der Wert 3 zugewiesen. Dabei wird in der Klasse intern der Teil des set Accessors der MyProperty Eigenschaft ausgeführt.
In der darauffolgenden Anweisung wird der Wert der Property namens MyProperty ausgelesen. Genauer gesagt, es wird der Wert ausgelesen, den der get Accessor der MyProperty Eigenschaft zurückgibt.
<% @Page Language="C#" %> <% GetSetVar MyVariable = new GetSetVar(); MyVariable.MyProperty = 3; Response.Write(MyVariable.MyProperty.ToString()); %>
Bevor ich der Eigenschaft MyProperty einen neuen Wert zuweisen kann, muß ich natürlich wieder ein neues Objekt mit der Anweisung new erstellen. Danach erfolgt die Zuweisung mit Hilfe der Property (Eigenschaft) namens MyProperty neuen Objekts MyVariable. Zum Abschluß erfolgt wieder die Ausgabe des Wertes der Property an den Browser mittels Response.Write Befehl.
Beachte: Wie Ihnen sicherlich schon aufgefallen ist, muß hier eine Konvertierung (Umcasten) des Datentyps Integer auf String erfolgen. Dies ist deshalb erforderlich, da Response.Write in ASP.NET nur Strings behandeln kann. Andernfalls erwartet Sie ein lästiger Compiler Error!
Dieser Artikel war sicher eine der kürzesten Einführungen in die Verwendung von Klassen und eigentlich nur ein kleiner Schritt in die objektorientierte Programmierung. Über die objektorientierte Programmiertechnik und über Klassen wurden bereits ganze Berge von Bücher geschrieben, aber hier sollten Sie dennoch einen raschen Einstieg in die wesentlichen Punkte der objektorientierten Programmierung von C# Klassen in ASP.NET erhalten
Sie verfügen nun über die Grundlagen um etwas mit dem Begriff "Klassen" im Bezug auf Programmiersprachen anzufangen. Sie können Klassen mit oder ohne Constructors instanzieren, Methods definieren und diese außerhalb des <SCRIPT> Blocks der Klassendefinition in ASP.NET aufrufen. Sie können den Methods (Methoden) Werte übergeben und sogar mehrere Werte zurückgeben. Nun sollten Sie auch in der Lage sein, mittels Properties Werte aus einem Objekt zu holen oder gegebenenfalls wieder im Objekt zu speichern.
Im nächsten Artikel zu diesem Thema werden Sie dann fortgeschrittene Techniken der objektorientierten Programmierung unter C# kennenlernen, wie Klassen Vererbung von einer Basisklasse, die Benützung von Operatoren oder Wissenswertes über die Event-Behandlung. Natürlich werde ich Ihnen Interfaces nicht vorenthalten oder wie man externe C#-Dateien in ASP.NET Code einbindet.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001012.zip
A Brief History of C#
http:/www.aspheute.com/artikel/20000713.htm
Einstieg in Visual Studio.NET - die erste Webanwendung mit Visual C#
http:/www.aspheute.com/artikel/20031010.htm
Performancemessungen in .NET
http:/www.aspheute.com/artikel/20011206.htm
Sichere Konvertierungen von Referenztypen
http:/www.aspheute.com/artikel/20001019.htm
Sprachenintegration in .NET
http:/www.aspheute.com/artikel/20011010.htm
Thumbnailgenerierung in .NET
http:/www.aspheute.com/artikel/20020225.htm
Transaktionen in C# Business Tier Komponenten
http:/www.aspheute.com/artikel/20010619.htm
©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.