Mit C# in der Windows-Ereignisanzeige schreiben

Wenn es um das Thema „Logging“ geht, gibt es bei C# beliebig viele verschiedene Ansätze. Neben den weit verbreiteten Logging-„Frameworks“ wie u.a. log4net, besteht in C# ebenfalls die Möglichkeit in den Windows-„Log“ (im Deutschen Ereignisanzeige) seine Fehler und andere Probleme abzulegen. Aber was wird benötigt, um dorthin schreiben zu können? Nun zunächst muss die Anwendung, um dorthin schreiben zu können, seit Windows Vista im Administrator Modus laufen. Wie man dies für die Anwendung voraussetzen kann, folgt noch in einem weiteren Blog-Post, lässt sich aber auch schnell mittels Google lösen. Stichwort: Manifest. Weiterlesen

C# 6.0 – Dictionary Initialisierung

Mit C# 6.0 lassen sich auch Dictionaries direkt initsialisieren. Dabei spielt es auch keine Rolle welche Typen verwendet werden. Da hier nicht viel Erklärungbedarf bestehen dürfte, hier ein selbsterklärendes Beispiel (es werden Zeilennummern C++ Quellcodezeilen zugewiesen und im Dictionary gespeichert):

Dictionary<int, string> CppHelloWorldProgramCode = new Dictionary<int, string>
    {
        [1] = "#include <iostream>", 
        [2] = "", 
        [3] = "int main () {", 
        [4] = "  std::cout << \"Hello World!\" << std::endl;", 
        [5] = "  return 0;", 
        [6] = "}"
    };

C# 6.0 – Wie heißt du denn?

Um in C# 6.0 zu erfahren, wie eine Variable im Quellcode heißt, gibt es das neue Schlüsselwort „nameof„. Mit dessen Hilfe kann z.B. ein Umbennen von Variablen, welche anschließend im Logging oder Exception-Text (-Parameter) verwendet werden, so gestaltet werden, dass der Kompiler einen Fehler ausgibt, wenn die Bezeichnung nicht stimmt. Hier ein Beispiel:

public void DoSomething(string someValue)
{
    if (string.IsNullOrEmpty(someValue))
        throw new ArgumentException(nameof(someValue), $"A value for parameter \"{nameof(someValue)}\" is required!");

    // Do some stuff here
}

Und so reiht sich die neue Funktionalität wunderbar in der Sammlung positiver Aspekte von  C# ein.

SecureString effektiv nutzen und verwenden

Mit Hilfe der Klasse SecureString ermöglicht das .NET-Framework auch String Daten nicht vollig entblößt im Arbeitsspeicher abzulegen, um z.B. den Zugriff von anderen Applikationen zu vermeiden. Leider ist mit SecureString nicht allzu einfach umzugehen und es kommt vor, dass man diesen für Momentaufnahmen dennoch als normalen String im Speicher benötigt, um damit z.B. den Inhalt in einer Oberfläche anzuzeigen oder um die Daten speichern zu können. Hier kann mit der Hilfe von Datentyp-Extensions gut Abhilfe geschaffen werden. So können wir uns Methoden implementieren, die es uns ermöglichen auch den SecureString wieder im Quellcode effektiv zu nutzen und dennoch parallel die Sicherheit zu verbessern (auch wenn zur absoluten Sicherheit die Rückwandlung nicht möglich sein sollte). Weiterlesen

Wie wird in C# gerundet?

Das umwandeln von Float, Double oder Decimal in einen Integer funktioniert in C# nach der IEEE 754 Definition und ist somit nicht immer wie man es erwarten würde, wenn man nur den kaufmännischen Weg kennt. Zunächst einmal sollte erwähnt werden, dass es verschiedene Wege gibt aus einer Gleitkommazahl eine Ganzzahl zu machen. Ich werde euch hier die einzelnen Wege einmal vorstellen.

Der erste Weg, ist das direkte Umwandeln durch einen Datentyp-Cast. Hierbei werden jedoch Nachkommastellen einfach abgeschnitten statt wirklich gerundet zu werden. Dies würde wie folgt aussehen:

float myFloat = 4.8f;
int myInteger = (int)myFloat; // myInteger wird nun 4 sein.

Die nächste Möglichkeit ist das Umwandeln von Typen über die Convert-Klasse aus dem .NET-Framework.

float myFloat = 4.8f;
int myInteger = Convert.ToInt32(myFloat); // myInteger wird nun 5 sein.

Hierbei würden wir augenscheinlich zunächst das richtige Ergebnis erhalten, aber was ist, wenn unsere Zahl genau in der Mitte liegt? Hier kommt es dann zum Problem.

int myInteger1 = Convert.ToInt32(8.5); // myInteger1 wird nun 8 sein.
int myInteger2 = Convert.ToInt32(9.5); // myInteger2 wird nun 10 sein.

Um das Problem kurz aufzulösen: Hierbei wird immer zur nächsten geraden (sprich durch zwei teilbaren) Zahl gerundet. Im Falle von 8,5 also zur 8 und im Falle von 9,5 zur 10. Leider kommt es zu dem gleichen Problem, wenn man die Methode Math.Round verwendet. Es sei den, man benutzt eine Überladung für die Math.Round Methode unter der Angabe des „MidpointRounding„-Parameters. Mehr Informationen dazu gibt es hier:
https://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx

C# 6.0 – Auf NULL prüfen vereinfachen

Eine weitere Neuerung in C# 6.0 ist das vereinfachte prüfen, ob eine Variable „NULL“ ist oder ob diese bereits initialisiert worden ist. Der hierfür benötigte Operator ist das „?“, welches auch bereits bei Nullable-Typen verwendet wird. Hier ein kleines Beispiel der Verwendung:

string sTest = "Hello World";

char? thirdChar = sTest?[2]; // 'l'

sTest = null;
thirdChar = sTest?[2]; // null

sTest = "Hi";
thirdChar = sTest?[2]; // throws IndexOutOfRangeException

Auch dies erspart dem Programmierer wieder ein paar Zeilen, jedoch finde ich es zum jetzigen Zeitpunkt noch merkwürdig zu lesen. Wobei das wohl vergehen wird, wenn erst einmal die Übung mit besagter Funktionalität etabliert ist.

C# 6.0 – Lambda Expressions für Read-Only Properties

Als Ergänzung zu der Möglichkeit, in C# 6.0 ganze Methoden durch Lambda Expressions zu ersetzen, ist dies auch mit Read-Only Properties sehr simpel  möglich. Hierzu muss lediglich ein ähnlicher Aufbau wie bei den Methoden verwendet werden.

public string Name { get; private set; } 
public string BackwardsName => new string(Name.Reverse().ToArray());

C# 6.0 – INotifyPropertyChanged – Eine Basis für ein ViewModel

Mit C# 6.0 hat sich viel geändert und vor allem verbessert. So auch die Möglichkeit die Schnittstelle INotifyPropertyChanged einzubinden. Hier bekommt man zwar von der aktuellen ReSharper Version eine schöne Unterstützung, aber wer mehr will, muss noch Hand anlegen. Ich habe in diesem Video das Ganze soweit entwickelt, dass Properties direkt in einem Dictionary gespeichert werden und somit für den Quellcode schlanker aussehen. Trotz einiger Versprecher und Vertipper hier das Video zur Implementierung:


 

Weiterlesen

C# 6.0 – Lambda Expressions für Methoden verwenden

Mit der Version 6.0 von C# wird es möglich sein anstelle von Methoden-Implementation simple Lamdba Expressions zu verwenden, um so den Quellcode noch kleiner zu halten. Der hierbei benötigte Aufwand ist sehr überschaubar und ermöglicht es saubere Methoden zu definieren. Hier ein Beispiel:

public class Dog
{ 
    public string Name { get; private set; }
    public int Age { get; private set; }
	
    public Dog(string name, int age)
    {
        Name = name;
        Age = age;
    }
 
    public void AgeIncrement() => Age++;
    public int AgeInDogYears() => Age * 7;
}

Die beiden Methoden „AgeIncrement“ und „AgeInDogYears“ machen hierbei von der neuen Funktionalität Gebrauch. In der Theorie kann man den Quellcode oben noch weiter vereinfachen, aber ich wollte an dieser Stelle nur dieses eine Thema behandeln.

C# 6.0 – Read-Only Auto-Properties vom Konstruktor initialisieren

In C# 6.0 hat Microsoft die Möglichkeit geschaffen, Read-Only Auto-Properties vom Konstruktor zu initialisieren. Auch dann, wenn diese keinen direkten Setter haben. Hierbei gibt es zwei Möglichkeiten. Die eine ist die direkte Initialisierung bei der Definition der Eigenschaft. Die andere ist vom Konstruktor aus. Und dies würde so aussehen:

public DateTime CreationTime { get; } = DateTime.Now;

Und hier noch die direkte Initialisierung vom Konstruktor aus:

public class MyObject
{
    public string Name { get; }
 
    public MyObject(string name)
    {
        Name = name;
    }
}

So wird ungewolltes überschreiben noch besser verhindert.