Singleton unter C#

Ein Singleton ist grob gesagt eine Klasse welche nur einmal initialisiert werden kann. Dies ist ganz praktisch für globale Objekte wie z.B. einen ID Generator, der nur einmal existieren darf. Doch wie schreibt man ein solches Singleton? Laut MSDN-Mag sieht das ganze so aus:

sealed class Singleton
  {
    private Singleton() {}
    public static readonly Singleton Instance = new Singleton() ;
  }

Diese Klasse kann man nun über Singleton.Instance aufrufen. Sie wird dabei bei der ersten Benutzung initialisiert. Da der Konstruktor private ist, kann sie von keiner anderen Klasse initialisiert werden. So wird dafür gesorgt das es nur eine Instanz gibt.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Probleme mit dem Resource Refactoring Tool

Ich nutze bei der Entwicklung ein sehr hilfreiches Tool namens Resource Refactoring Tool. Normalerweise taucht dieses im Menü Refactor als Extract to Resource auf. Bei mir ist es allerdings einfach verschwunden. Hier hilft es das Addin zu resetten. Dazu geht man in den Ordner C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE und öffnet dort eine Kommandozeile. In diese gibt man dann

devenv.exe /resetaddin Microsoft.VSPowerToys.ResourceRefactor.Connect 

ein und schon ist das Problem gelöst :)

Vertimas – Einfache Übersetzung von Resx Dateien

Die Übersetzung von .NET Programmen gestaltet sich doch recht schwierig. Wobei schwierig in diesem Fall das falsche Wort ist. Umständlich trifft es in diesem Fall besser. Vor allem wenn als Entwickler das Qt Übersetzungssystem mit Qt Linguist kennenlernen dürfte. Ein Problem bei der Übersetzung ist, dass man zu jedem Programm mehrere Ressourcen (resx) Dateien in den unterschiedlichsten Sprachen hat z.B. translate.resx, translate.de.resx und translate.nl.resx.

An dieser Stelle ist ein Tool wünschenswert welches diese ganzen Dateien nebeneinander darstellt und einigen Komfort bei der Bearbeitung bietet. Basierend auf dem Resx Resource Translator (http://resxtranslator.codeplex.com) von Hakan Lindestaf habe ich dabei ein Tool namens Vertimas (litauisch für Übersetzung) geschaffen welches einem diesem Arbeit leichter von der Hand gehen lässt.

Vertimas ist dabei ein Open Source Projekt welches unter der GPL steht. Die offizielle Projektseite ist dabei unter https://github.com/seeseekey/Vertimas zu finden. Über Feedback, Verbesserungen und Kritik freue ich mich :)

Interessantes Problem beim Bitmap locken in Verbindung mit Mono und .NET

Manchmal sucht man den Fehler an der falschen Stelle, wie ich gestern bei einem Quelltext feststellen dürfte welcher auf .NET und Mono laufen sollte. Man nehme folgenden C# Code:

Bitmap bmp=new Bitmap((int)width, (int)height, PixelFormat.Format32bppArgb);
BitmapData data=bmp.LockBits(new Rectangle(0, 0, (int)width, (int)height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

Marshal.Copy(intern.imageData, 0, data.Scan0, (int)(width*height*4));

bmp.UnlockBits(data);
data=null;
return bmp;

Dieser Code kopiert Daten in ein Bitmap. Unter .NET funktioniert dies tadellos. Also lag der Gedanke nah das dies ein Mono Problem ist. Nach etlichen Tests ergab sich dann aber das es genau umgekehrt ist. Es liegt an der Zeile:

BitmapData data=bmp.LockBits(new Rectangle(0, 0, (int)width, (int)height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

und zwar speziell an dem ImageLockMode.ReadOnly. Dort könnte z.B. ImageLockMode.ReadWrite stehen und schon würde es unter .NET und Mono funktionieren. Doch warum geht es nun bei .NET trotzdem mit der falschen Variante? Die .NET API reicht die Parameter korrekt an die GDI+ weiter, diese ignoriert sie aber. Aus diesem Grund funktionierte es unter .NET. Sprich Mono hat alles richtig gemacht :)

Vala

Erstaunt stellte ich gestern fest das der neue Standardfotomanager unter Ubuntu (Shotwell) in Vala geschrieben ist. Bei Vala handelt es sich um eine Programmiersprache welche stark an C# und Java angelehnt ist. Dabei benötigt sie aber keine Laufzeitumgebung. Man hat dann also eine Sprache welche eine moderne Syntax bietet und keine Laufzeitumgebung benötigt sondern nativ auf dem System läuft. Im Gegensatz zu .NET/Mono hat die Sprache keinen Garbage Collector sondern implementiert automatische Referenzzählung zur Speicherverwaltung.

Beim durchschauen der Syntax (verglichen mit C#) sind mir einige Unschönheiten aufgefallen welche einige Konstrukte nicht sehr elegant aussehen lassen, aber das muss man sich wahrscheinlich mal in einem kleinen Projekt anschauen. Es ist möglich mit Vala plattformunabhängige Anwendungen zu schreiben. Als Standardbibliothek steht einem die glibc sowie die Geelib zur Verfügung. Der Vala Compiler wandelt den Quellcode in C Code um und kompiliert diesen dann anschließend. Definitiv eine Sprache die man sich mal anschauen sollte :) Die offizielle Seite von Vala ist unter http://live.gnome.org/Vala zu finden.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Vala_%28Programmiersprache%29