Why so brittle?

C# has inherited a brittleness from the Visual C++ world.

By default an unhandled exception in any application will kill an application and return an exception trace even in a windows form.

In Delphi in a forms application the exception shows as a message box.

The assumption in Visual C++ and then C# is that an unhandled exception could result in data corruption so you must shut down now. The assumption in delphi is that some error has occoured.

It is possible to add simple code to emulate the Delphi behavior

// Add the following to your uses clause:
using System.Threading;

//In your main method before run implement the following

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(new CustomExceptionHandler().OnThreadException);

// Here is the exception handler (in production code use something more elegant, but for development this is fine:

        // Creates a class to handle the exception event.
        internal class CustomExceptionHandler
        {
 
            //Handles the exception event
            public void OnThreadException(object sender, ThreadExceptionEventArgs t)
            {
                DialogResult result = DialogResult.Cancel;
                try
                {
                    result = this.ShowThreadExceptionDialog(t.Exception);
                }
                catch
                {
                    try
                    {
                        MessageBox.Show(“Fatal Error”, “Fatal Error”,
                            MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
                    }
                    finally
                    {
                        Application.Exit();
                    }
                }
 
                // Exits the program when the user clicks Abort.
                if (result == DialogResult.Abort)
                    Application.Exit();
            }
 
            // Creates the error message and display it.
            private DialogResult ShowThreadExceptionDialog(Exception e)
            {
                string errorMsg = “An error occurred please contact the adminstrator ” +
                    “with the following information: “;
                errorMsg = errorMsg + e.Message + ” Stack Trace: ” + e.StackTrace;
                return MessageBox.Show(errorMsg, “Application Error”,
                    MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
            }
        }

    }

However this should be the default behaviour.

How Many Languages?

These days is is unlikely that one language is enough to get the job done.

Today I used:

  1. Delphi
  2. SQL
  3. Expect
  4. Python
  5. Want

I use compiled languages for the heavy lifting.
SQL is for data manipulation (mostly stored procs).
Expect and Python provide the flexible utilities (database creation).
Want (the delphi port of ant) provides the build tools.

Where are C#'s meta-classes?

In Delphi you can define a meta class and pass classes into methods.

TFoo = class(TObject);

TFooClass = class of TFoo;

function MakeFoo( aFooClass : TFooClass ) : TFoo;
begin
    result := aFooClass.Create();
end;

This allows very generic code where you can get away with just passing in a class name.
I use this heavily in Delphi as part of a test framework (the meta class represents test data).

I think that this can be done in C# using reflection but there should be a cleaner method.

12 application blocks?

The April edition of vsj magazine (www.vsj.co.uk) claims that there are 12 available blocks available at www.microsoft.com/resources/practices/code.mspx

The first 7 are part of the Enterprise Library:
Enterprise Library

These are the Microsoft Patterns and Practice best practices (I can only find 11 distinct items)

  1. Caching Application Block
  2. Configuration Application Block
  3. Cryptography Application Block
  4. Data Access Application Block
  5. Exception Handling Application Block
  6. Logging & Instrumentation Application Block
  7. Security Application Block
  8. Smart Client Offline Application Block
  9. Updater Application Block V2
  10. User Interface Process Application Block – Version 2.0
  11. Web Service Façade for Legacy Applications

Note that microsoft do not support these so as soon as you take them you own the code.
It would make a great open source project to take these on and centralise extensions to them.

Inheritance of constructors in C#

This is a serious problem with the C# langauage.

Given the following two classes:

class First
{
    First(string message)
    {
       System.Console.WriteLn(message);
    }
}

class Second
{

}

The following will not compile:

Second = new Second(“Test”);

Now I know if I add the following to Second

    Second(string message)  : base(message)
    {
    }

This is not much code for a simple constructor, but what about classes with multiple constructors like exceptions? That makes them more difficult to define than necessary.
   

System.Net

System.Net contains the ever useful WebClient class.

This allows code such as:

System.Net.WebClient wc = new System.Net.WebClient();
byte[] myDataBuffer = wc.DownloadData(url);
string download = System.Text.Encoding.ASCII.GetString(myDataBuffer);

This allows the text at a given url to be extracted.
Welcome to your own web spider.

API going AWOL

Microsoft in their infinate wisdom have decided to break the Mailslot API in the XP line and above. Mailslots were a great means of communicating between processes running under differing user accounts. Under XP these were made unreliable which renders them unusable.

In addition I have found that certain security API’s are missing on Windows Server 2003 custom builds. What is the point of developing against a fixed plaform if a custom build take away API calls?

Small Languages

Given that in .NET it is easy to write your own language these could be used to plug obvious holes in the mainstream languages. For example C# makes a pigs ear of it’s constructors.
The minimal syntax is

C () : base () { }

It is possible to have more code in the base () parameters than in the implementation itself.

You need to redefine any constructors that are required in a descendant class.
This makes the definition of mostly empty classes such as exception hireachies far more work than is actually needed.

Delphi has trivial to implement Exceptions :

type
   EBaseException = class(Exception);

  EMyException = class(EBaseException);

This makes their definition and use so useful.

I am wondering if it is possible to create an Exception Definition Language to ease this issue?
I will Blog about this experiment later.

Missing featues : array over enum

This is the first article in the blog comparing Delphi features to C#.
C# is a great language but is missing some incedibly useful features from Delphi.

In Delphi you can declare an enumeration as

TEnumColour = (Red, Green, Blue);

You can then declare an array over that enumeration:

TWaveLength : array[TEnumColour] of integer  = (100,200,300);

This is a very powerful technique for ensuring that an enumeration always has valid data.

I have yet to work out how to do this in C#

Localization and Databases

I got caught by another localizaion feature of SQL Server today.
SQL Server is not aware of regional settings.

This can be a real pain. If your machine uses say German regional settings and your database returns 1.01  if you use variant conversion routines (hey I am still using ado – we all can’t be on the bleeding edge) this can arrive as 101

This is not what is wanted. This has brought me to question where in a data access layer should the localization go?