Fragen zu Programmiersprachen

Veröffentlicht: 23. Mai 2002 | Aktualisiert: 08. Nov 2004

ask_the_experts1

Bild02

Event oder Delegate?

Beim Programmieren von Events in C# ist mir aufgefallen, dass ich das Schlüsselwort event gar nicht benutzen muss, um den Event-Mechanismus innerhalb der Applikation in Gang zu setzen. Ein einfaches Delegation-Pattern reicht aus. Wofür ist dann das Keyword event denn da?

Im Prinzip sind Events nichts anderes als Callbacks.

public delegate void EventDelegate();

wenn man dazu zwei delegate-vars deklariert

public class MyTestClass
{
     public event EventDelegate myEvent;
     public EventDelegate myCallback;
...

dann funktionieren die auf dieselbe Weise beim Aufruf. Unter der Haube
allerdings erzeugt der C#-Compiler für myEvent aber etwas mehr:

...class public auto ansi beforefieldinit MyTestClass extends
[mscorlib]System.Object
{
    .field private class eventtestCSharp.EventDelegate myEvent
    .field public class eventtestCSharp.EventDelegate myEventDelegate
    .event eventtestCSharp.EventDelegate myEvent
    {
      .addon instance void eventtestCSharp.MyTestClass::add_myEvent(class
eventtestCSharp.EventDelegate)
      .removeon instance void
eventtestCSharp.MyTestClass::remove_myEvent(class
eventtestCSharp.EventDelegate)
    }
    ...

Beide delegate-vars sind zwar im C#-Code public definiert, im IL-Code hingegen ist myEvent plötzlich private! Öffentlich hingegen ist eine "echte" Event-Eefinition (.event) mit gleichem Namen. Für einen "normalen" Delegate wie myEventDelegate treibt der Compiler nicht diesen Aufwand.

Events sind für das CTS etwas Spezielles. Microsoft hat sich nicht damit zufrieden gegeben, zu sagen, Ereignisse könnten doch einfach per Callback (auf einem Delegate) gemeldet werden. So wie man mit Property-Methoden verbergen kann, was sich hinter einer Eigenschaft verbirgt, so wollte man für Events ebenfalls Details des Mechanismus verbergen, indem man die (De)Registrierung von Event-Handlern über spezielle Add/Remove-Methoden erzwingt.

Darüber hinaus unterscheidet event die Definition von Events ausdrücklich von der von Delegates. In C# bringt das keinen Vorteil, aber in VB .NET tauchen Event-Delegate-Member-Variablen von C#-Klassen plötzlich in der Combox zur Auswahl von Methoden auf, wenn man eine Variable der Klasse mit WithEvents deklariert:

Dim WithEvents o as MyTestClass

Weitere Informationen gibt es unter:

http://msdn.microsoft.com/msdnmag/issues/01/08/net/print.asp

Bild02

Gibt es Dialoge wie Login-Abfrage noch in VB.NET?
Unter Visual Basic 6 gibt es verschiedene Formularvorlagen, wie Info-Dialog, Anmeldedialog, Begrüßungsbildschirm. Gibt es diese Dialoge auch unter VB .NET?

Nein, die gibt es nicht. Aber man kann sie sich selbst erzeugen und als Templates ablegen:

1. Zuerst die Formularvorlage nach den eigenen Wünschen zusammenstellen. Speichern beispielsweise unter login.vb.

2. Das Formular soll wie die anderen Formulare angeboten werden. Das heißt, Wahlmöglichkeit, wenn man im Projekt Add New Item aufruft. In diesem Dialog soll das Template unter der Rubrik UI zu finden sein.

2.1. Dazu muss ein Eintrag in der Datei C:\Program Files\Microsoft Visual Studio .NET\Vb7\VBProjectItems\LocalProject Items\UI\LocalUIProjectItems.vsdir gemacht werden. Informationen zum Dateiformat finden Sie unter ms-help://MS.VSCC/MS.MSDNVS/vsintro7/html/vxconvsdirfiles.htm.

2.2. Kopieren Sie in der Datei den Eintrag für winform.vsz (sollte der erste sein) ans Ende und änderen Sie ihn wie folgt:...\..\LoginForm.vsz|{164B10B9-B200-11D0-8C61-00A0C91E29D5}|LoginDialog|10|Dialog with a user and passwordfield|{164B10B9-B200-11D0-8C61-00A0C91E29D5}|4527| |login.vb

3. Der neu angelegte Eintrag zeigt auf eine Wizard-Beschreibungsdatei (loginform.vsz), die jetzt erzeugt werden muss.

3.1. Kopieren Sie dazu im Pfad C:\Program Files\Microsoft Visual Studio..NET\Vb7\VBProjectItems die Datei winform.vsz auf den Namen loginform.vsz.

3.2. Ändern Sie darin die Zeile für den Parameter "WIZARD_NAME" wie folgt: Param="WIZARD_NAME = LoginForm"

4. Jetzt müssen Support-Dateien für den Wizard angelegt werden.

4.1. Kopieren Sie im Verzeichnis C:\Program Files\Microsoft Visual Studio..NET\Vb7\VBWizards das Verzeichnis WinForm auf den Namen LoginForm.

4.2. Ändern Sie in der Datei LoginForm\Scripts\1033\default.js eine Zeile wie folgt (es muss form.vb durch login.vb ersetzt werden): var strTemplateFile = strTemplatePath + "\\login.vb";

4.3 Kopieren Sie die Dialog-Datei login.vb in das Verzeichnis LoginForm\Templates\1033. Die darin befindliche Datei form.vb kann gelöscht werden.

4.4. Ändern Sie in der Datei LoginForm\Templates\1033\login.vb einige Zeilen wie folgt:

Public Class [!output SAFE_ITEM_NAME]Me.Name = "[!output SAFE_ITEM_NAME]"

[!output...] ist ein Platzhalter, der bei Einsetzen eines Login-Dialogs über Add New Item durch einen eindeutigen Formularnamen ersetzt wird. Je nach Auslegung des Dialogs mag der Platzhalter auch noch an andererer Stelle einzusetzen sein.

Beim nächsten Aufruf von VS.NET sollte ein neuer Item mit dem Login-Dialog zur Verfügung stehen.

Das Beispiel bezieht sich auf die englische Version von VS.NET. Bei der deutschen mag zum Beispiel 1033 durch eine andere Zahl zu ersetzen sein.

Bild02

Wie kann ich unter VB .NET in einem String Anführungszeichen verwenden?
Ich möchte so etwas in Visual Basic .NET schreiben:

response.write("<img src=\"image\bild.gif\">")

Wie macht man das?

Um Anführungszeichen in einem String unterzubringen, muss man sie doppelt schreiben. Beispiel:

dim s as string = "ein wort in ""anführungszeichen"" eingeschlossen"
Bild02

Gibt es die Funktionen wie Split oder LCase in VB .NET?

Die angesprochenen Funktionen (bzw. deren Entsprechung) gibt es immer noch. Nur sind Sie eben VB-spezifisch. Zu empfehlen sind aber eher die sprachunabhängigen, BCL-weiten Funktionen.

Im Namensraum Microsoft.VisualBasic.Strings sind die VB-eigenen Funktionen enthalten. In der Klasse System.String stehen die allgemein gültigen Funktionen, etwa System.String.ToLower.

Bild02

Wie kann ich auf die ControlChars in VB.NET zugreifen?
Es wird empfohlen, in VB .NET die ControlChars-Klasse anstelle der VB6-Konstanten (vbCrLf, vbCr, usw.) zu verwenden. Allerdings kommt die ControlChars-Klasse ebenfalls aus dem Namensraum Microsoft.VisualBasic. Wie soll ich also einen Zeilenumbruch in einen String einbauen?

Für Control Chars kann man entweder Microsoft.VisualBasic.ControlChars oder die VB.NET-Konstanten vbCrLf usw. Schließlich können Control-Chars auch über die Chr-Funktion erzeugt werden. Alle diese Verfahren hängen aber, vom Namespace Microsoft.VisualBasic ab. Der ist allerdings immer automatisch in VB-.NET-Projekte eingeschlossen. Und kann auch in C# benutzt werden, sobald die Assembly "Microsoft Visual Basic .NET Runtime" eingebunden ist.
In C# gibt es dagegen reservierte Zeichensequenzen (zum Beispiel "\n") für viele VB-Char-Konstanten.
Ein sprachübergreifender Weg zur Erzeugung von Sonderzeichen besteht in der Nutzung einer Text-Encoding-Klasse:

Dim S As String 
S = "x" & System.Text.Encoding.ASCII.GetString(New Byte() {13, 10}) & "y"
Console.WriteLine(S)

Anzeigen: