Dion Hinchcliffe is an internationally recognized digital expert, bestselling book author, frequent keynote speaker, analyst, futurist, and transformation expert based in Washington, DC. He is currently Chief Strategy Officer at the industry-leading digital strategy and online community solutions firm, 7Summits.| By Miguel Katrib, Mario del Valle | Article Rating: |
|
| December 6, 2005 05:30 PM EST | Reads: |
26,464 |
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
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.
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();
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(...));
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>();
Published December 6, 2005 Reads 26,464
Copyright © 2005 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
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.
Dion Hinchcliffe is an internationally recognized digital expert, bestselling book author, frequent keynote speaker, analyst, futurist, and transformation expert based in Washington, DC. He is currently Chief Strategy Officer at the industry-leading digital strategy and online community solutions firm, 7Summits.Nov. 11, 2018 04:00 PM EST Reads: 3,170 |
By Pat Romanski Nov. 11, 2018 11:45 AM EST Reads: 2,284 |
By Elizabeth White Nov. 10, 2018 11:45 PM EST Reads: 2,064 |
By Pat Romanski Nov. 10, 2018 10:00 PM EST Reads: 3,206 |
By Pat Romanski Nov. 10, 2018 01:00 AM EST Reads: 2,941 |
By Pat Romanski Nov. 9, 2018 04:45 PM EST Reads: 2,282 |
By Yeshim Deniz Nov. 3, 2018 05:00 AM EDT Reads: 4,027 |
By Yeshim Deniz Nov. 2, 2018 03:00 PM EDT Reads: 3,210 |
By Elizabeth White In his general session at 19th Cloud Expo, Manish Dixit, VP of Product and Engineering at Dice, discussed how Dice leverages data insights and tools to help both tech professionals and recruiters better understand how skills relate to each other and which skills are in high demand using interactive visualizations and salary indicator tools to maximize earning potential.
Manish Dixit is VP of Product and Engineering at Dice. As the leader of the Product, Engineering and Data Sciences team at D...Oct. 30, 2018 03:45 PM EDT Reads: 14,062 |
By Zakia Bouachraoui Oct. 30, 2018 11:45 AM EDT |


In his general session at 19th Cloud Expo, Manish Dixit, VP of Product and Engineering at Dice, discussed how Dice leverages data insights and tools to help both tech professionals and recruiters better understand how skills relate to each other and which skills are in high demand using interactive visualizations and salary indicator tools to maximize earning potential.
Manish Dixit is VP of Product and Engineering at Dice. As the leader of the Product, Engineering and Data Sciences team at D...

Every organization is facing their own Digital Transformation as they attempt to stay ahead of the competition, or worse, just keep up. Each new opportunity, whether embracing machine learning, IoT, or a cloud migration, seems to bring new development, deployment, and management models. The results are more diverse and federated computing models than any time in our history.
On-premise or off, you have powerful tools available to maximize the value of your infrastructure and you demand more visibility and operational control. Fortunately, data center management tools keep a vigil on memory contestation, power, thermal consumption, server health, and utilization, allowing better control no matter your cloud's shape. In this session, learn how Intel software tools enable real-time monitoring and precise management to lower operational costs and optimize infrastructure for today even as you're forecasting for tomorrow.
Isomorphic Software is the global leader in high-end, web-based business applications. We develop, market, and support the SmartClient & Smart GWT HTML5/Ajax platform, combining the productivity and performance of traditional desktop software with the simplicity and reach of the open web.
With staff in 10 timezones, Isomorphic provides a global network of services related to our technology, wit...
DevOps has long focused on reinventing the SDLC (e.g. with CI/CD, ARA, pipeline automation etc.), while reinvention of IT Ops has lagged. However, new approaches like Site Reliability Engineering, Observability, Containerization, Operations Analytics, and ML/AI are driving a resurgence of IT Ops. In this session our expert panel will focus on how these new ideas are [putting the Ops back in DevOps...
In his session at 21st Cloud Expo, Michael Burley, a Senior Business Development Executive in IT Services at NetApp, described how NetApp de...
When building large, cloud-based applications that operate at a high scale, it’s important to maintain a high availability and resilience to...























