Welcome!

Microservices Expo Authors: Liz McMillan, Pat Romanski, Elizabeth White, Yeshim Deniz, Zakia Bouachraoui

Related Topics: Microsoft Cloud

Microsoft Cloud: Article

Dealing With The C# 2.0 Genericity

Leverage generics for flexible code, the forthcoming .NET 2.0 Framework will introduce new important features

The forthcoming .NET 2.0 Framework will introduce new important features. One of those features is genericity. Genericity is not really a new concept. It has been included in some previous languages as ADA, C++, Eiffel, and in the mathematical model of abstract data types (ADT). However, the C# 2.0 notation for genericity (see the first entry in the References section), the integration of genericity in the .NET type system, the efficient implementation of genericity in the CLR-JIT process, and the new generic features included in the reflection mechanism will strengthen .NET programmers' output.

Genericity in .NET rests on the same basic reasons for which .NET promotes strongly typed languages:

  • Readability: Explicit declarations tell readers about the intended meaning of the code
  • Reliability: Thanks to explicit type declarations, a compiler can easily detect inconsistencies and erroneous operations
  • Efficiency: By knowing the types early, a compiler will be able to generate a more efficient code
The first section of this article starts by presenting arrays, the humble and anonymous generic construction embedded in C# and many programming languages. The second section explains how a limited form of generic types can be currently implemented in C#, based on the object type. In the third section the main characteristics and benefits of genericity in C# 2.0 are illustrated, including the notion of constrained genericity. An additional section explains how we can interact between generics and non-generics. Finally, we present an interesting example about simulation of multiple inheritance with genericity.

Arrays: The Implicit Generic Construction Embedded in .NET
Perhaps because arrays are predefined in C# and embedded in the CLR, when using them programmers don't realize that they are dealing with a truly an efficient generic construction.

When you write a declaration like int[] a you are instantiating a generic container, known as an array of items of type int. Any type T can be used to define an array through the notation T[]. A set of common properties and functionalities implicitly applies to arrays no matter what type T is:

  • All array objects are created with the notation new T[k] where k must be a positive expression that defines the numbers of items in the array.
  • An int property Length applies to every array (no matter the type T) to return the number of items of the array. Items are numbered from 0 to Length-1.
  • All items of an array of type T[] have the same type T. Items of a value type T are initialized as such value type (zero for numeric types, false for bool type, and so on) and items of a reference type T are initialized to null.
    1.  For an array T[] a, a[i] acts as a variable of type T denoting the item at position i. When using in the right side, a[i] returns an item of type T, and when using in a left side, a[i]=x; x must be of type T.
Unfortunately, before C# 2.0, programmers could not define a custom parameterized type based on a type T.

Genericity Based on the "Wild card type" Object
Today C# programmers who want to define a stack type of int objects must write the code in Listing 1a. If they wish to define a stack of objects of a type Person they could write the code in Listing 1b (for simplicity, this is only a rough implementation of a stack). Note that both classes Stackofint and StackofPerson have similar codes. They differ only in the type they are based on (int or Person). We can avoid that replication by defining a sole Stack type based on the root type object (see Listing 2).

Here object acts like a wild card type. Since every type in .NET inherits from the base object type, and thanks to the boxing and unboxing features of .NET, programmers can seamless push either a reference object or a value object into a stack. Note that the parameter of Push is of type object, then some calls like s.Push(3) or s.Push(new Person(...)) are correct, because any type conforms to object.

The approach above has the benefit of no code replication, but it has the following flaws:

  • It is not possible to enforce the kind of data to be placed in the stack. As the following code snippet shows, we could create a stack and push an assortment of objects on it.

    Stack s = new Stack(10);
    s.Push(new Date(10,10,2000);
    s.Push(new Person(...));
    s.Push(100);

  • Boxing and unboxing operations that apply when pushing and retrieving objects of value types can be particularly onerous.
  • Because the compiler only knows that objects in the stack have the general type object, when we retrieve the objects from the stack we must cast them to the real type they have:

    int k = (int) s.Pop();
    Person p = (Person) s.Pop();

However casting has a run-time cost, and even worse, it is an error-prone approach because it is possible to write a wrong cast.

It would be significant if we could have the safety and efficiency of specific type definitions (as shown in Listing 1), and, at the same time, we could avoid code replication. Both benefits could be achieved with the forthcoming genericity of C# 2.0.

Genericity in C# 2.0
In C# 2.0 the aforementioned definition of Stack could be best obtained by using the generic notation shown in Listing 3.

Here Stack<T> denotes a generic type and T denotes a type parameter of this generic type. Instantiating this type parameter with an actual type will result in a type of specific stack:

Stack<Person> persons = new Stack<Person>(10);.

Now persons has the type Stack<Per-son>. This has the following benefits:

  • All operations defined in Stack<T> are applied to Stack<Person> without programming duplication
  • Compiler can accept the following code without doing casting:

    Person harry = new Person(...);
    persons.Push(harry);
    Person p = persons.Pop();

  • In an attempt to push on persons, an object of a type not conforming to Person will result in a compilation error:

    persons.Push(23); //Error because 23 is not of type Person

    It is possible to push on the stack persons an object of a subtype of Person. If the class Employee inherits from Person, then the following code is correct:

    persons.Push(new Employee(...));

A type parameter can be used as an instantiation parameter of another generic type. Note that in the Stack<T> definition, the parameter T is used to instantiate the internal array T[] items. It means that when we write Stack<Person>, its instance variable items will be of type Person[].

Furthermore, generic instantiation can be done recursively. For example, a three-dimensional list can be defined as follows:

List<List<List<string>>> stringCube =
new List<List<List<string>>>(5);

Multiple Type Parameters
A generic type can have any number of type parameters. For example, in the generic dictionary type

class Dictionary<TKey, TValue> {...}

TKey must be instantiated with the type that we want to use as the type of the key (the object to search in the dictionary), and TValue must be instantiated as the type of the object associated with the key. Some examples are:

Dictionary<string, string> englishSpanish = new Dictionary<string, string>();
Dictionary<string, long> phoneList = new Dictionary<string, long>();
Dictionary<string, Person> contactList = new Dictionary<string, Person>();

More Stories By Miguel Katrib

Miguel Katrib is a PhD and a professor in the Computer Science Department at the University of Havana. He is also the head of the WEBOO group dedicated to Web and object-oriented technologies. Miguel is also a scientific advisor in .NET for the software enterprise CARE Technologies, Denia, Spain.

More Stories By Mario del Valle

Mario del Valle is working toward his MS at the Computer Science Department at the University of Havana, and is a software developer at the WEBOO group dedicated to Web and object-oriented technologies.

Comments (1) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
.NET News Desk 12/06/05 06:45:57 PM EST

The forthcoming .NET 2.0 Framework will introduce new important features. One of those features is genericity. Genericity is not really a new concept. It has been included in some previous languages as ADA, C++, Eiffel, and in the mathematical model of abstract data types (ADT). However, the C# 2.0 notation for genericity (see the first entry in the References section), the integration of genericity in the .NET type system, the efficient implementation of genericity in the CLR-JIT process, and the new generic features included in the reflection mechanism will strengthen .NET programmers' output.

Microservices Articles
DevOpsSummit New York 2018, colocated with CloudEXPO | DXWorldEXPO New York 2018 will be held November 11-13, 2018, in New York City. Digital Transformation (DX) is a major focus with the introduction of DXWorldEXPO within the program. Successful transformation requires a laser focus on being data-driven and on using all the tools available that enable transformation if they plan to survive over the long term.
The now mainstream platform changes stemming from the first Internet boom brought many changes but didn’t really change the basic relationship between servers and the applications running on them. In fact, that was sort of the point. In his session at 18th Cloud Expo, Gordon Haff, senior cloud strategy marketing and evangelism manager at Red Hat, will discuss how today’s workloads require a new model and a new platform for development and execution. The platform must handle a wide range of rec...
CloudEXPO New York 2018, colocated with DXWorldEXPO New York 2018 will be held November 11-13, 2018, in New York City and will bring together Cloud Computing, FinTech and Blockchain, Digital Transformation, Big Data, Internet of Things, DevOps, AI, Machine Learning and WebRTC to one location.
Discussions of cloud computing have evolved in recent years from a focus on specific types of cloud, to a world of hybrid cloud, and to a world dominated by the APIs that make today's multi-cloud environments and hybrid clouds possible. In this Power Panel at 17th Cloud Expo, moderated by Conference Chair Roger Strukhoff, panelists addressed the importance of customers being able to use the specific technologies they need, through environments and ecosystems that expose their APIs to make true ...
In his session at 20th Cloud Expo, Scott Davis, CTO of Embotics, discussed how automation can provide the dynamic management required to cost-effectively deliver microservices and container solutions at scale. He also discussed how flexible automation is the key to effectively bridging and seamlessly coordinating both IT and developer needs for component orchestration across disparate clouds – an increasingly important requirement at today’s multi-cloud enterprise.
Modern software design has fundamentally changed how we manage applications, causing many to turn to containers as the new virtual machine for resource management. As container adoption grows beyond stateless applications to stateful workloads, the need for persistent storage is foundational - something customers routinely cite as a top pain point. In his session at @DevOpsSummit at 21st Cloud Expo, Bill Borsari, Head of Systems Engineering at Datera, explored how organizations can reap the bene...
SYS-CON Events announced today that DatacenterDynamics has been named “Media Sponsor” of SYS-CON's 18th International Cloud Expo, which will take place on June 7–9, 2016, at the Javits Center in New York City, NY. DatacenterDynamics is a brand of DCD Group, a global B2B media and publishing company that develops products to help senior professionals in the world's most ICT dependent organizations make risk-based infrastructure and capacity decisions.
Most DevOps journeys involve several phases of maturity. Research shows that the inflection point where organizations begin to see maximum value is when they implement tight integration deploying their code to their infrastructure. Success at this level is the last barrier to at-will deployment. Storage, for instance, is more capable than where we read and write data. In his session at @DevOpsSummit at 20th Cloud Expo, Josh Atwell, a Developer Advocate for NetApp, will discuss the role and value...
Consumer-driven contracts are an essential part of a mature microservice testing portfolio enabling independent service deployments. In this presentation we'll provide an overview of the tools, patterns and pain points we've seen when implementing contract testing in large development organizations.
Adding public cloud resources to an existing application can be a daunting process. The tools that you currently use to manage the software and hardware outside the cloud aren’t always the best tools to efficiently grow into the cloud. All of the major configuration management tools have cloud orchestration plugins that can be leveraged, but there are also cloud-native tools that can dramatically improve the efficiency of managing your application lifecycle. In his session at 18th Cloud Expo, ...