-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
Deploying unter .NET 3
05.07.06 - Base Framework Beitrag von Norbert Eder
.NET Framework 3.0 - Part 2
13.06.06 - Base Framework Beitrag von Norbert Eder
MSDN Wiki online
13.06.06 - Base Framework Beitrag von Norbert Eder
Windows Vista und das .NET Framework - Welche Version?
10.06.06 - Base Framework Beitrag von Norbert Eder| | In unserem Unternehmen, als auch in vielen anderen Unternehmen, als auch Foren, kehrt immer wieder die Frage in die allgemeine Runde ein, welche .NET Version denn nun standardmäßig mit Windows Vista ausgeliefert wird.
Nun, hier die Antwort: .NET 3.0
Verschrieben? Nein. Ich wiederhole: .NET 3.0
Was wird in .NET 3.0 neu sein? Nun, so wie es aussieht, handelt es sich dabei um eine Zusammenführung von WinFX und .NET 2.0. Weitere Entwicklungen des Basisframeworks wird es also vermutlich erst 2007 geben.
via Albert
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
C# Beginner: Enumeratoren vs Flags
09.06.06 - .NET, Base Framework Beitrag von Norbert Eder| | Enumeratoren sind ja den meisten C# Entwicklern durchaus bekannt. Flags allerdings werden nicht sehr oft eingesetzt. Diese Erfahrung habe ich in diversen Foren gemacht und daher möchte ich dazu ein paar Worte verlieren.
Enumeratoren
Ein Enumerator kann bestimmte vordefinierte Werte enthalten und ist vor allem für Aufzählungen sehr praktisch. Ein Beispiel wäre hierfür der Color-Enumerator. Dieser ermöglicht das einfache Auswählen von Farbwerten. Ein eigenes Beispiel würde wie folgt aussehen:
public enum TestEnum
{
EnumValue0 = 0,
EnumValue1 = 1
}
Für einzelne Items kann hier ein bestimmter Wert definiert werden, muss jedoch nicht. Standardmäßig repräsentiert ein Enumerator einen Int32-Value und beginnt bei 0, ausser anders definiert. Eine Zuweisung sieht beispielsweise wie folgt aus:
private TestEnum testEnum = TestEnum.EnumValue0;
Zu beachten ist, dass testEnum immer nur einen Wert enthalten kann. Dies führt uns nun zur Frage: "Was tun, wenn ich jedoch mehrere Werte speichern möchte?". Ganz einfach:
Flags
Flags können mehrere Werte enthalten. Zuerst jedoch ein Beispiel für die Definition eines Flags:
[Flags]
public enum TestFlag
{
FlagValue1 = 1,
FlagValue2 = 2,
FlagValue4 = 4,
FlagValue8 = 8,
FlagValue16 = 16
}
Im Grunde handelt es sich hierbei um einen Enumerator, dem zusätzlich das Attribut [Flags] verpasst wird. Zusätzlich sind die einzelnen Werte entsprechend des Dualsystems (1,2,4,8,16,32,...) anzugeben, da diese bei Mehrfachauswahl durch ein logisches Oder verknüpft werden.
TestFlag testf = TestFlag.FlagValue1;
testf := TestFlag.FlagValue2;
In diesem Fall hat testf den Wert 3. Dieser repräsentiert FlagValue1 und FlagValue2. Durch ein
testf -= TestFlag.FlagValue1;
reduziert sich der Wert auf 2, wodurch auch nur mehr dieses Flag gesetzt ist. Abfragen können nun folgendermaßen gemacht werden:
if ( (testf & TestFlag.FlagValue1) > 0) {}
Trifft diese Bedingung zu, ist das Flag gesetzt, andernfalls würde das Ergebnis 0 sein und die Bedingung würde folgerichtig nicht zutreffen.
if ( (testf & TestFlag.FlagValue1) == 0) {}
Auf diese Weise kann festgestellt werden, ob ein bestimmtes Flag nicht gesetzt ist. Trifft die Bedingung zu ist es nicht gesetzt, andernfalls schon.
Fazit
Dies sollte einen kurzen Einblick in die Welt der Enumeratoren und Flags bieten. Flags bieten in vielen Fällen eine einfache Lösung für Mehrfachauswahlen und können auch entsprechend in UserControls abgebildet werden, um dem User eine vereinfachte Darstellung zu bieten.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
System.IO.Compression - Hilfreich oder doch ein Scherz?
07.06.06 - Base Framework Beitrag von Norbert Eder| | Unter dem .NET Framework 2.0 gibt es ja den System.IO.Compression-Namespace. Dieser beinhält Klassen um Dateien zu zippen. Vorgangsweise sieht so aus, dass Daten in einen Stream geschrieben werden (beispielsweise einem GZipStream). Dieser zippt danach die Daten, welche in weiterer Folge in einer Zip-Datei abgelegt werden können.
Dies funktioniert wenn man eine einzelne Datei zippen möchte. Was ist, will ein gesamtes Verzeichnis gepackt werden? Gute Frage. Bis dato konnte ich noch keine Art Zip-Container finden. Dies bedeutet, man muss sich die einzelnen Positionen der Dateien innerhalb des Streams merken bzw. an einer Stelle vermerken, um diese wieder entpacken zu können. Ein handelsübliches Zip-Programm ist damit natürlich überfordert. Dies läßt die Frage offen, ob damit proprietäre Formate unterstützt werden sollen ...
Fazit
Ich hätte mir unter diesem Namespace doch wesentlich mehr vorgestellt. So ist er für mich nicht wirklich zu gebrauchen. Schade drum.
ZUSATZ
Für diejenigen, die nicht in die Kommentare sehen, hier ein Zusatz. Jay hat einen Link gepostet, der genau dieses Manko behebt:
.NET System.IO.Compression and zip files
| | | 4 Kommentare
- 1049 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
.NET 2.0: ComboBox und AutoComplete
22.05.06 - Base Framework Beitrag von Norbert Eder| | Unter .NET 2.0 gibt es eine sehr einfache Möglichkeit, der ComboBox eine AutoComplete-Funktion bzw. eine Vorschlags-Funktion zu verpassen.
Dazu einfach folgende Schritte ausführen:
1. AutoCompleteCustomSource setzen (zusätzlich zur normalen DataSource)
2. AutoCompleteMode auf Suggest stellen
3. AutoCompleteSource auf ListItems stellen
Fertig ist die Hexerei und der User freut sich über die verbesserte Usability. Statt Suggest (Punkt 2) gibt es auch noch weitere Möglichkeiten um eventuell eigene Einträge anzuhängen etc. Einfach mal ausprobieren.
| | | 1 Kommentar
- 1584 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
IronPython 1.0 Beta 6 verfügbar
28.04.06 - Base Framework Beitrag von Norbert Eder
C# vs. VB.NET
08.04.06 - Base Framework Beitrag von Norbert Eder
C#-Beginner: Exception-Handling unter C#
02.03.06 - .NET, Base Framework Beitrag von Norbert Eder| | Das Thema Exception-Behandlung scheint bei vielen .NET Programmierern noch nicht richtig angekommen zu sein. Immer wieder finden sich in diversen Beispielen und Fragen traurige Konstrukte, die hauptsächlich negative Erscheinungen zu Tage fördern. Also Beispiel sei hier ein neulich gesichteter Code gezeigt werden (nicht kopieren!!!!!):
try
{
StreamReader sr = new StreamReader("path");
string text = sr.ReadToEnd();
sr.Close();
}
catch (Exception ex) {}
Das Ergebnis? Nun, ist die Datei nicht vorhanden wird eine Exception geworfen und auch abgefangen, aber es passiert damit nichts. Es erfolgt weder eine Meldung an den User, noch ein Log-Eintrag, um etwaige Fehler zu einem späteren Zeitpunkt nachvollziehen zu können. Ein weiterer Effekt ist, dass beim "Testen" durch den Entwickler "alles funktioniert" - was natürlich nicht stimmt.
Nun gut, aber wie soll das Exception Handling dann wirklich umgesetzt werden? Ganz einfach. Der grundlegende try-catch-Block sieht so aus:
try {
// Implementierung
} catch (IOException ex) {
// Fehlerbehandlung für IO-Fehler
} catch (Exception ex) {
// Fehlerbehandlung für andere Fehler
} finally {
// Abschlussarbeiten
}
Hier noch eine genaue Beschreibung:
try: Im try-Teil des gesamten Blockes erfolgt die Implementierung der tatsächlichen Funktion.
catch: Hier ist die Fehlerbehandlung zu implementieren. Dies kann realisiert werden, indem die Fehlermeldungen bzw. zusätzliche Einträge in eine Log-Datei geschrieben werden oder eine User-Interaktion verlangt wird. Wie oben gezeigt, können mehrere Exceptions gezielt abgefangen und behandelt werden. In der MSDN finden sich zu allen Methoden auch Angaben darüber, welche Exceptions geworfen werden. Prinzipiell ist mit diesen Exceptions zu arbeiten und nicht direkt mit Exception selbst.
finally: Dieser Teil des Blockes wird in jedem Fall ausgeführt, also sowohl nach erfolgreichem Durchlauf des try-Teiles, als auch im Falle eines Fehlers. Dadurch bietet es sich an, im finally-Block Aufräumarbeiten durchzuführen. Dies kann beispielsweise das Schließen einer Datenbank-Verbindung sein.
Beim catch-Block muss nicht zwingend ein Typ angegeben werden. Ist dies nicht der Fall, dann werden sämtliche Exceptions behandelt. Von dieser Schreibweise würde ich jedoch eher abraten:
try {
} catch {
}
Des weiteren sollten Exception nicht für die Ablaufsteuerung einer Anwendung verwendet werden. Darunter wird verstanden, dass gezielt auf Exceptions abgefragt wird, um aufgrund des Exception-Typs zu entscheiden, welcher weitere Code anschließend ausgeführt wird. Exceptions sind sehr "teuer". Dies bedeutet, dass dadurch viele Ressourcen verbraucht werden. Daher sind Exceptions auch als solche zu behandeln.
Natürlich besteht auch die Möglichkeit eigene Exceptions zu implementieren. Dies macht vor allem bei der Entwicklung von größeren Frameworks (die auch von anderen Entwicklern benutzt werden) Sinn. Folgendes Beispiel soll eine eigene Exception verdeutlichen:
using System;
class MyException : ApplicationException
{
public MyException(string str)
{
Console.WriteLine(str);
}
}
Wie zu erkennen ist, ist von der Basisklasse ApplicationException abzuleiten. Der Konstruktor erhält einen Parameter und damit ist die einfachste Variante einer benutzerdefinierten Exception fertig. Weitere Möglichkeiten können aus der MSDN bezogen werden.
Zum Schluss möchte ich noch kurz ansprechen, wie der Programmierer selbst Exceptions werfen kann. Dies wird mittels des Schlüsselwortes throw getan:
throw new MyException("Eine benutzerdefinierte Exception ist aufgetreten");
Eine so geworfene Exception muss natürlich auch entsprechend behandelt werden.
Referenzen und weiterführende Artikel:
[1] Exception Management Architecture Guide
[2] Exception Class
| | | 3 Kommentare
- 1676 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL | Zurück Weiter
|
|
|
|
|
|
|