EDUCBA

EDUCBA

MENUMENU
  • Free Tutorials
  • Free Courses
  • Certification Courses
  • 600+ Courses All in One Bundle
  • Login

C# Generics

By Priya PedamkarPriya Pedamkar

Home » Software Development » Software Development Tutorials » C# Tutorial » C# Generics

C sharp Generics

Introduction to Generics in C#

So, what is the concept of Generics in C#? In simple words, it is the concept of defining type-independent classes, interfaces, methods, delegates, properties, etc. This means that you can define a generic class or method body and provide the actual type during invocation. Thus, Generics are like code-templates. They allow you to write a type-safe code-block without referring to any particular data-type. The type of your code is determined at compile-time during the invocation call for your class or method.

Syntax of Generics in C#

Let us look at the syntax of a generic declaration in C#. It is a very simple syntax. As a common practice, the letter ‘T’, in the capital and enclosed within angular brackets, denotes the declaration of a generic code in C#. But, this is not the mandate. Any letter in capital case enclosed within angular brackets can be used to denote a Generic code.

Start Your Free Software Development Course

Web development, programming languages, Software testing & others

Declaring a Generic Class:

public class MyGenericClass<U>

Instantiating a Generic Class:

MyGenericClass<int> = new MyGenericClass<int>();

Declaring a Generic Derived Class:

public class MyGenericDerivedClass<T> : MyGenericBaseClass<T>

Declaring a Generic Method:

public T MyGenericMethod(T item);

How Generics Work in C#?

When you declare a generic code in C#, the compiler produces a template equivalent to that code. This template is checked for all compilation errors except type-safety. The next step comes when the generic code is invoked or called in another part of the program. At the time of invocation, you specify the type that your generic code would be compiled with. When the compiler reaches the invocation point, it inserts the type specified in the previously compiled template. This is then re-compiled to check for type-safety. Once passed, the code is ready for execution. We would see the compiled code in the examples below to get a better understanding of generic templates.

Example of Generics in C#

Below are the different examples of Generics:

Generics with Class

Code:

using System;
using System.Collections.Generic;
public class GenericClass<T>
{
List<T> genericList;
public GenericClass()
{
genericList = new List<T>();
}
public void AddToList(T item)
{
genericList.Add(item);
}
public void DisplayList()
{
foreach ( var ele in genericList )
{
Console.Write("{0}\t", ele);
}
}
}
public class Program
{
public static void Main()
{
GenericClass<int> intGenericObj = new GenericClass<int>();
GenericClass<string> stringGenericObj = new GenericClass<string>();
intGenericObj.AddToList(28);
intGenericObj.AddToList(999);
intGenericObj.AddToList(0);
intGenericObj.AddToList(-123);
intGenericObj.AddToList(100);
stringGenericObj.AddToList("Hello");
stringGenericObj.AddToList("Bonjour");
stringGenericObj.AddToList("Ola");
stringGenericObj.AddToList("Ciao");
stringGenericObj.AddToList("Hallo");
intGenericObj.DisplayList();
Console.WriteLine("\n");
stringGenericObj.DisplayList();
}}

Output:

C sharp Generics 1.1

The same code can also be re-written as below. This illustrates the power of defining a generic class that can be made type-safe for multiple types in a single object.

using System;
using System.Collections.Generic;
public class GenericClass<T, U>
{
List<T> genericList1;
List<U> genericList2;
public GenericClass()
{
genericList1 = new List<T>();
genericList2 = new List<U>();
}
public void AddToList(T item1, U item2)
{
genericList1.Add(item1);
genericList2.Add(item2);
}
public void DisplayList()
{
foreach (var ele in this.genericList1)
{
Console.Write("{0}\t", ele);
}
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
{
Console.Write("{0}\t", ele);
}
}
}
public class Program
{
public static void Main()
{
GenericClass<int, string> genericObj = new GenericClass<int, string>();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
}
}

Popular Course in this category
C# Training Program (6 Courses, 17 Projects)6 Online Courses | 17 Hands-on Project | 89+ Hours | Verifiable Certificate of Completion | Lifetime Access
4.6 (8,847 ratings)
Course Price

View Course

Related Courses
ASP.NET Training (8 Courses, 19 Projects).NET Training Program (4 Courses, 19 Projects)

Output:

C sharp Generics 1.2

Compiled Code:

To get a perspective of how the data-type is resolved in Generics, let us look at the compiled code generated when we instantiate the class with integer and string types in the above example.

using System;
using System.Collections.Generic;
public class GenericClass
{
List<int> genericList1;
List<string> genericList2;
public GenericClass()
{
genericList1 = new List<int>();
genericList2 = new List<string>();
}
public void AddToList(int item1, string item2)
{
genericList1.Add(item1);
genericList2.Add(item2);
}
public void DisplayList()
{
foreach (var ele in this.genericList1)
{
Console.Write("{0}\t", ele);
}
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
{
Console.Write("{0}\t", ele);
}
}
}
public class Program
{
public static void Main()
{
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
}
}

Generics with Method

Code:

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
int[] intArr = {12, 23, 43, 94, 35};
double[] doubleArr = {12.3, 45.6, 98.7, 1.45, 82.653};
string[] strArr = {"Hello", "Bonjour", "Ola", "Ciao", "Hallo"};
Console.WriteLine("The largest integer in the array is {0}", findMax(intArr));
Console.WriteLine("The largest floating-point number in the array is {0}", findMax(doubleArr));
Console.WriteLine("The largest string in the array is {0}", findMax(strArr));
}
static T findMax<T>(T[] items)
where T : IComparable<T>
{
T max = items[0];
int position = 0;
for (int i = 1; i < items.Length; i++)
{
if (items[i].CompareTo(max) > 0)
{
max = items[i];
position = i;
}
}
return max;
}
}

Output:

C sharp Generics 1.3

The System.Collections.Generic namespace

The System.Collections.Generic namespace in C# contains interfaces and classes defining the generic collections. They allow the programmers to create generic collections that are better in performance and as strongly-types as the non-generic collections. This namespace contains Lists, Dictionaries, Linked Lists, Hashes, Key-Value Pairs, Stacks, etc, all of which are generic in nature. The programmers can implement them in their code.

Importance of C# Generics

Below is the Importance of C# Generics as follows:

  • Generics Allow Code-Reusability: the fundamental principle of good programming. You need not write the same code for each expected data-type. You simply define a type-independent code and tell the compiler that the actual data-type would be provided at the time of code invocation.
  • Prevent the Cost of Boxing and Un-Boxing: Of course, the use of generics can be bypassed through object class. The below two pieces of code are equivalent in their tasks.

Generic Code: public T MyFunc(T item);

Non-Generic Code: public object MyFunc(object item)

The object class supersedes all classes and thus the above non-generic code can also be used to generate type-independent code templates. But, there is a huge performance gap between the two codes. Using the object class incurs an additional cost of boxing and unboxing of the data-types. Generics eliminate this and are thus better in performance.

Conclusion

Thus, we have seen how generics are a must-learn programming feature. This is a highly useful concept, not only in C# but in most modern programming languages. Further, it is highly recommended to learn about the System.Collections.Generic namespace in C#. Also, to understand the performance of generics, deep dive into how boxing and unboxing have an impact on memory as well as execution time.

Recommended Articles

This is a guide to C# Generics. Here we discuss the Importance, How Generics Work in C# along with different examples and code implementation. You can also go through our other suggested articles to learn more –

  1. C# or Operator
  2. C# SortedSet
  3. C# finally
  4. C# Stack

C# Training Program (6 Courses, 17 Projects)

6 Online Courses

17 Hands-on Project

89+ Hours

Verifiable Certificate of Completion

Lifetime Access

Learn More

0 Shares
Share
Tweet
Share
Primary Sidebar
C sharp Tutorial
  • Advanced
    • Inheritance in C#
    • Exception Handling in C#
    • Types of Exception in C#
    • C# FileNotFoundException
    • C# NullReferenceException
    • C# OutOfMemoryException
    • C# StackOverflowException
    • Custom Exception in C#
    • What is Multithreading in C#
    • C# finally
    • C# System.IO
    • What is StringBuilder in C#
    • DataReader C#
    • BinaryWriter in C#
    • C# BinaryReader
    • TextWriter in C#
    • TextReader in C#
    • C# StringReader
    • C# StringWriter
    • C# StreamReader
    • C# StreamWriter
    • C# FileInfo
    • What is Design Pattern in C#?
    • Multithreading in C#
    • Sorting in C#
    • Bubble Sort in C#
    • C# SortedList
    • C# SortedSet
    • C# SortedDictionary
    • Abstract Class in C#
    • Access Modifiers in C#
    • C# Generics
    • Deserialization in C#
    • C# Thread
    • C# Thread Join
    • C# Thread Sleep
    • C# Thread Synchronization
    • C# Class
    • Sealed in C#
    • Sealed Class in C#
    • Polymorphism in C#
    • C# Call By Reference
    • Virtual Keyword in C# 
    • Yield Keyword in C#
    • Regular Expression in C#
    • C# Lambda Expression
    • C# Predicate
    • Convert Object to JSON C#
    • Checkbox in C#
    • C# MessageBox
    • Collections in C#
    • List in C#
    • C# LinkedList
    • Listbox in C#
    • Protected in C#
    • C# EventHandler
    • Private in C#
    • this Keyword in C#
    • Static Keyword in C#
    • C# Out Parameter
    • Assert in C#
    • C# Delegates
    • C# Interface
    • Generics in C#
    • Timer in C#
    • C# Serialization
    • Metadata in C#
    • C# Stack
    • C# Using Static
    • Queue in C#
    • C# File.Exists
    • C# Tuples
    • C# Create JSON Object
    • Partial in C#
    • C# readonly
    • C# Action Delegate
    • C# Await Async
    • C# Dictionary
    • IEnumerable C#
    • C# Data Grid View
    • C# Dynamic
    • Web Services in C#
    • C# Pattern Matching
    • C# Extension Methods
    • C# XmlSerializer
  • Basic
    • Uses Of C#
    • C# Versions
    • C# Data Types
    • Variables in C#
    • Namespaces in C#
    • C# Compilers
    • C# Keywords
    • Iterators in C#
    • Objects in C#
    • C# Object Dispose
    • C# object to XML
    • C# check object type
    • C# Object Serialization
    • Pointers in C#
    • C# Literals
    • C# Commands
    • C# Custom Attribute
    • Type Casting in C#
    • String vs String C#
    • C# Struct vs Class
  • Operators
    • Logical Operators in C#
    • Conditional Operators in C#
    • Bitwise Operators in C#
    • C# OR Operator
    • C# Ternary Operators
    • Operator Precedence in C#
  • Control Statement
    • C# if Statement
    • Else If in C#
    • Continue in C#
    • Break in C#
    • Switch Statement in C#
    • Goto Statement in C#
  • Loops
    • C# For Loop
    • C# While Loop
    • C# do-while loop
    • C# foreach Loop
  • Arrays
    • Arrays in C#
    • 2D Arrays in C#
    • C# Jagged Arrays
    • String Array in C#
    • C# Multidimensional Arrays
  • Constructor and Destructor
    • Constructor in C#
    • Copy Constructor in C#
    • Static Constructor in C#
    • Destructor in C#
  • overloading and overrideing
    • Overloading and Overriding in C#
    • Overloading in C#
    • Overriding in C#
    • Method Overloading in C#
    • Method Overriding in C#
    • Operator Overloading in C#
  • Functions
    • C# Functions
    • C# String Functions
    • Math Functions in C#
    • Recursive Function in C#
    • C# Anonymous Functions
    • C# Local Functions
    • Enum in C#
    • Trim() in C#
    • clone() in C#
    • C# random
    • C# String Format()
    • C# String Interpolation
    • C# StartsWith()
    • C# String IndexOf()
    • DateTime in C#
    • C# Nullable
    • C# nameof
    • C# checked
    • C# String PadLeft
    • Convert String to Double in C#
    • Convert int to String C#
    • String to Date C#
    • C# intern()
    • C# Stopwatch
    • C# DirectoryInfo
    • C# Compare()
    • C# Base
    • C# SOAP
    • Lock in C#
  • Programs
    • Patterns in C#
    • Swapping in C#
    • Palindrome in C#
    • Factorial in C#
    • Fibonacci Series in C#
    • Random Number Generator in C#
    • Prime Numbers in C#
    • Armstrong Number in C#
    • Reverse String in C#
  • Interview questions
    • C# Interview Questions and Answers
    • C# OOP Interview Questions
    • C# Design Pattern Interview Questions

Related Courses

C# Certification Training

ASP.NET Course

.NET Course

Footer
About Us
  • Blog
  • Who is EDUCBA?
  • Sign Up
  • Corporate Training
  • Certificate from Top Institutions
  • Contact Us
  • Verifiable Certificate
  • Reviews
  • Terms and Conditions
  • Privacy Policy
  •  
Apps
  • iPhone & iPad
  • Android
Resources
  • Free Courses
  • Java Tutorials
  • Python Tutorials
  • All Tutorials
Certification Courses
  • All Courses
  • Software Development Course - All in One Bundle
  • Become a Python Developer
  • Java Course
  • Become a Selenium Automation Tester
  • Become an IoT Developer
  • ASP.NET Course
  • VB.NET Course
  • PHP Course

© 2020 - EDUCBA. ALL RIGHTS RESERVED. THE CERTIFICATION NAMES ARE THE TRADEMARKS OF THEIR RESPECTIVE OWNERS.

EDUCBA Login

Forgot Password?

EDUCBA
Free Software Development Course

Web development, programming languages, Software testing & others

*Please provide your correct email id. Login details for this Free course will be emailed to you
Book Your One Instructor : One Learner Free Class

Let’s Get Started

This website or its third-party tools use cookies, which are necessary to its functioning and required to achieve the purposes illustrated in the cookie policy. By closing this banner, scrolling this page, clicking a link or continuing to browse otherwise, you agree to our Privacy Policy

EDUCBA

*Please provide your correct email id. Login details for this Free course will be emailed to you
EDUCBA
Free Software Development Course

Web development, programming languages, Software testing & others

*Please provide your correct email id. Login details for this Free course will be emailed to you

Special Offer - C# Training Program (6 Courses, 17 Projects) Learn More