The Moth - Generics in Compact Framework (original) (raw)

« Watchdog design for CF app | Visual Studio WinCE Emulators »

Wed, December 22, 2004, 05:09 AM under MobileAndEmbedded

A disclaimer up front: This is by no means a tutorial or even my original work on Generics. The subject has been discussed in depth ever since it was announced as part of Whidbey. Given that generics were not available in the Compact Framework in previous releases and I did say I would talk about them a bit, here goes some code for CF from the November CTP (tested in the emulator):

I bet 90% of the mileage on generics use will come out of using the classes in the framework and specifically the System.Collections.Generic namespace. An example is this:
' VB - consuming built-in collections

        Dim s As New System.Collections.Generic.Stack(Of Int32)

        s.Push(5)          'no boxing

        s.Push(6)

        's.Push("invalid") 'will not compile :-)

        Dim tot As Int32 = s.Pop() + s.Pop()          'no cast

// C# - consuming built-in collections

    System.Collections.Generic.Stack s;

    s = new Stack();

    s.Push(5); //no boxing

    s.Push(6);

    //s.Push("invalid"); //will not compile :-)

    int tot = s.Pop() + s.Pop(); //no cast

However, you can create your own generics classes and even structs:
' VB - Declare generic struct

Public Structure MyPoint(Of T)

    Dim x As T

    Dim y As T

End Structure

// C# - Declare generic struct

public struct MyPoint {

    T x;

    T y;

}

...and of course consume them:
' VB - consume generic struct

        Dim mp As New MyPoint(Of Single)

        mp.x = 12.3

        mp.y = 5

// C# - Consuming own struct

    MyPoint mp = new MyPoint();

    mp.x = 12.3;

    mp.y = 5.2;

Even more useful, you can create generic methods and impose constraints on the types:
'VB - generic method with constraints

Public NotInheritable Class MyMath

    Private Sub New()

    End Sub

     Public Shared Function Min(Of T As IComparable)(ByVal a As T, ByVal b As T) As T

        If a.CompareTo(b) < 0 Then        'no casting + intellisense help

            Return a

        End If

        Return b

    End Function

End Class

// C# - generic method with constraints

public static class MyMath {

    //Min with constraints

    public static T Min(T a, T b) where T : IComparable {

        if (a.CompareTo(b) < 0) {//no casting + intellisense help

            return a;

        }

        return b;

    }

}

' VB - Consume generic method

        Dim m As Int32 = MyMath.Min(6, 8)

// C# - Consume generic method

    int m = MyMath.Min(6, 8);

I have only scratched the surface here, if you want to know more about Generics I encourage you to go searching. I can recommend these articles: [1, 2]

UPDATE (7 Jan 05): Roman Batoukov has the implementation details
UPDATE (26 Jan 05): Nazim Lala has the details on reflection with generics