Thomas Wölfers Baustatik-Blog

Thomas Wölfers Baustatik Blog

Warum C# kein 'const' hat


Die kurze Begründung gibts bei Eric Gunnerson, die etwas längere bei Stan Lippman.

Im Wesentlichen läuft es darauf hinaus: Die CLR (die .NET Common Language Runtime) unterstützt 'const' nicht - und C# darum auch nicht.

Wieso die CLR das nicht unterstützt kommt nicht ganz raus; offenbar gibt es aber Probleme mit einige Sprachen bei denen 'const' nicht ohne weiteres eingebaut werden kann, mit denen aber auch für die CLR programmiert werden können soll.

Update: Daraus hat sich eine interessante Diskussion mit Raymond Chen ergeben. Es läuft darauf hinaus, das die CLR kein 'const' hat, weil das zu Problemen mit Visual Basic führen würde, was wiederum dazu führt das die interoperabilität von Code aus verschiedenen Sprache gestört wäre.

Ich halte das für ein ziemlich dürftiges Argument.


Microsoft verschenkt C/C++ Compiler


Ab sofort kann man das Visual C++ Toolkit kostenlos von Microsoft runterladen. Das Toolkit enthält:

  • Den C/C++ Optimizing Linker und Compiler aus Visual C++ 2003
  • Die C Runtime Library, die C++ Standard Library und die STL aus VC++ 2003
  • Die .NET Framework CLR. (Der Compiler kann nicht nur nativen Win32 Code sondern auch Code für die CLR erzeugen, MC++ - Managed C++)
  • Beispiel-Programme

Wer bereits Visual Studio 2003 oder Visiual C++ 2003 besitzt braucht das Toolkit nicht; wer einen tollen kostenlosen C++ Compiler mit Support für .NET sucht ist dabei gut aufgehoben. Eine IDE gibts allerdings nicht - aber zur Not tut es sicherlich auch SharpDevelop.

Das .NET SDK ist ja schon immer kostenlos gewesen. Darin befindet sich unter anderem der VB.NET und der C#.NET Compiler - sowie auch ein Debugger, den man auch für C/C++ Projekte verwenden kann.


Richtiges werfen von Exceptions


Vorweg: Beim nächsten mal wird es hier wieder etwas Bauingenieurs-lastiger werden; zumindest etwas weniger aus der Programmier-Ecke. Aber eben erst beim nächsten mal. :-)

Wenn Sie einen RSS-Reader verwenden, und sich für den Programmier-Kram nicht interessieren: Abonnieren Sie einfach nicht den kompletten Feed, sondern nur die Kategorien die Sie interessieren. (Die RSS-URLs der Kategorien dazu stehen rechts am Rand.)

Zu den Exceptions:

ICommand cmd = CommandManager.GetCommand( idCommand);

try
{
   UndoManager.BeginCollection("FooBarCommand");

   cmd.Execute( context);

}
catch( Exception ex)
{
   UndoManager.ForgetCollection();
   throw ex;
}
UndoManager.EndCollection();

Dieser Code - es geht im Wesentlichen um das 'throw ex' - ist eigentlich immer falsch.

Der Punkt dabei ist der: Durch das 'throw ex' landet der eigene Stack-Trace im Exception-Object, die Original-Information geht verloren. Eigentlich muss man statt dessen einen von zwei anderen Wegen gehen.

1. Es ist wichtig das man selbst im Stack-Trace der Exception auftaucht. M.a.w.: Man ist ein relevanter Teil der Exception-Chain.

In diesem Fall sollte man die Exception in eine eigene Exception verpacken und die Original-Exception in der InnerException der neuen Exception aufbewahren. Dadurch wird die Exception spezieller und gleichzeitig bleibt die Origial-Information (in der InnerException) erhalten:

catch( Exception ex)
{
   throw new MySpecialException( ex);
}

2. Man hat die Exception nur gefangen um aufräumen zu können, man ist aber kein wichtiger Teil der Exception-Chain. (So wie im Beispiel am Anfang.)

In diesem Fall sollte man eben aufräumen was es aufzuräumen gibt, und dann die unverönderte Exception - mit ihrem Original-Stacktrace - erneut werfen:

catch( Exception)
{
   UndoManager.ForgetCollection();
   throw;  // <- kein 'ex' !
}

Dank an Brad Wilson


Wahre Geschichten: Die Programmierung der Kfz-Steuer


Ich hatte gestern abend ein interessantes Gespräch mit einer Dame die als Programmiererin für das Finanzamt arbeitet. Sie arbeitet in einem Team von 7 Personen die für die Programmierung der Kfz-Steuer zuständig ist.

Man stellt sich ganz unweigerlich die Frage: Was zum Henker gibts bei der Kfz-Steuer zu programmieren? Und genau das habe ich gestern abend auch gefragt. Die Antwort stellt zumindest eines klar: Der Verschwendung von Steuergeldern ist offenbar wirklich nichts entgegenzusetzen.

Die Sache ist: Die Kfz-Steuer ist eigentlich eine ganz einfache Sache. Wird das Auto angemeldet werden die Daten einmal erhoben - und damit hat sich die Sache eigentlich. Die Berechnung der Steuer ändert sich zwar hin- und wieder aufgrund verschiedener Parameter, und auch das Formular auf dem die zu zahlende Steuer ausgewiesen wird ändert sich hin- und wieder leicht, aber diese Aenderungen sind nur marginal. Nichts, was ein einzelner Programmierer mit 'C' oder C++ nicht auch an einem Nachmittag erledigen könnte. Letzten Endes sind das ja nur zwei Zettel.

Um genau zu sein: Die Gestaltung und Formatierung des Ausdruckes würde kein normaler Mensch 'programmieren' sondern eben einfach mit irgend einem Layout-Programm zusammenbasteln oder im schlimmsten Fall von Hand in HTML entwerfen. Aufwand: 10 Minuten.

Nur ist es eben so das beim Finanzamt eben alles anders ist: Statt die Dinge in einer Hochsprache oder mit einem Layout-Programm zu erledingen wird alles von Hand in Assembler (!) programmiert. Um den Ausdruck zu ändern wird kein Layout verändert, sondern es wird ein neuer Druckertreiber programmiert. Das ist ungefähr so, als würden Sie eine FEM-Berechnung mit 25.000 Elementen unter Verwendung von Papier und Bleistift durchführen.

Und so kommt es dann das da 7 Leute das ganze Jahr an einer Aufgabe arbeiten, die auch mit einer großzügigen Auslegung einfach nicht mehr als einen Mann-Monat in Anspruch nehmen sollte.

Es geht aber noch weiter: Diese Leute machen die Kfz-Steuer 'programmierung' für ganz Deutschland. Außer für NRW und Schleswig-Holstein. Da sitzen dann nochmal andere Leute, die genau das gleiche machen - nur ein bisschen anders. Es gibt natürlich keinen sinnvollen Grund dafür, weshalb zwei Bundesländer die Kfz-Steuer unbedingt gesondert abrechnen müssen - aber so ist es nunmal.

Das ist, ganz nebenbei bemerkt, auch der Grund dafür, weshalb die Kfz-Steuer in NRW und Bayern für das genau gleiche Fahrzeug gerne einmal unterschiedlich ausfällt: NRW und Bayern rechnen und runden ein wenig anders. Darum kommt am Ende eine leicht unterschiedliche Summe raus, beim Kfz-Steuer programmieren.


MSDN hat jede Menge RSS Feeds


Wer Software entwickelt sollte mal das kürzlich neu gestaltete msdn.microsoft.com besuchen. Neuerdings gibt es für verschiedene Themen eigene 'Developer Center'. Um auf dem Stand der Dinge zu bleiben, kann man also einfach den RSS Feed für zum Beispiel C# und C++ abonieren.

Auch interessant: Der neue RSS-Feed für MSDN Subscriber downloads. Darin findet sich alles, was man mit einem MSDN Abo runterladen kann.

 


c++ versus c#


gut in c++:

int len = array.Length();
for ( int i=0; i<len; i++ )
{
    array[i] = 0;
}

array.Length() ist außerhalb der Schleife - darum ist die Performance besser. Anders ist das bei C#: Aufgrund der Art und Weise wie der C# Compiler und die CLR interagieren ist der folgende Code die optimale Variante bei C#:

for ( int i=0; i<array.Length(); i++ )
{
    array[i] = 0;
}

( Dank an Brad Adams )

Andere Performance-Themen die man als .NET Entwickler lesen sollte: Link