C#高级编程:如何理解和使用泛型?

2021年3月23日15:00:58 发表评论 1,352 次浏览

泛型

是允许用户使用占位符定义类和方法的类。泛型已添加到C#语言的2.0版中。使用Generic的基本思想是允许类型(整数, 字符串, …等和用户定义的类型)成为方法, 类和接口的参数。集合的主要限制是缺乏有效的类型检查。这意味着你可以将任何对象放入集合中, 因为C#编程语言中的所有类都从对象基类扩展而来。这损害了类型安全性, 并且与C#作为类型安全语言的基本定义相矛盾。此外, 使用集合会涉及显着的性能开销, 这些形式的隐式和显式类型转换需要从集合中添加或检索对象。

为了解决类型安全问题,

。净

框架提供了泛型来创建类, 结构, 接口和方法, 这些类, 结构, 接口和方法为其使用的类型使用占位符。泛型通常用于为引用和值类型创建类型安全的集合。的

。净

框架在System.Collections.Generic命名空间中提供了一组广泛的接口和类, 用于实现通用集合。

通用类

C#中的泛型是它最强大的功能。它允许你定义类型安全的数据结构。结果是显着的性能提升和高级代码, 因为它有助于重用数据处理算法而无需复制特定于类型的代码。泛型与C ++中的模板相似, 但实现和功能不同。泛型引入了类型参数的概念, 因此可以创建推迟数据类型框架的方法和类, 直到该类或方法被声明并由客户端代码实例化为止。泛型类型比普通系统类型具有更好的性能, 因为它们减少了装箱, 拆箱和类型转换变量或对象的需求。

在通用类创建中指定参数类型。

要创建通用类的对象, 请使用以下语法:

BaseType 
  
    obj = new BaseType 
   
    ()

例子:

// C# program to show working of 
// user defined Generic classes
using System;
  
// We use < > to specify Parameter type
public class GFG<T> {
      
     // private data members
     private T data;
      
     // using properties
     public T value
     {
          
         // using accessors
         get
         {
             return this .data;
         }
         set
         {
             this .data = value;
         }
     }
}
  
// Driver class
class Test {
      
     // Main method
     static void Main( string [] args)
     {
          
         // instance of string type
         GFG< string > name = new GFG< string >();
         name.value = "lsbin" ;
          
         // instance of float type
         GFG< float > version = new GFG< float >();
         version.value = 5.0F;
          
         // display lsbin
         Console.WriteLine(name.value); 
          
         // display 5
         Console.WriteLine(version.value); 
     }
}

输出:

lsbin
5

说明:前面的示例定义了一个通用类, 玻璃纤维, 它使用通用类型参数" T"。在Main()方法中, 通过将" T"替换为" string"和" float"数据类型创建了GFG的两个实例。这些对象分别用于存储"字符串"和"浮动"值。 GFG类通过在其构造函数中接受所需的类型来确保类型安全。

具有各种参数的通用方法:正如方法可以采用一个参数一样, 泛型也可以采用各种参数。可以将一个参数作为熟悉的类型传递, 将另一个作为泛型类型传递, 如下所示:

例子:

// C# program to show multiple
// type parameters in Generics
using System;
  
public class GFG {
      
     // Generics method
     public void Display<TypeOfValue>( string msg, TypeOfValue value)
     {
         Console.WriteLine( "{0}:{1}" , msg, value);
     }
}
  
// Driver class
public class Example {
      
     // Main Method
     public static int Main()
     {
          
         // creating object of class GFG
         GFG p = new GFG();
          
         // calling Generics method
         p.Display< int >( "Integer" , 122);
         p.Display< char >( "Character" , 'H' );
         p.Display< double >( "Decimal" , 255.67);
         return 0;
     }
}

输出:

Integer:122
Character:H
Decimal:255.67

泛型的特征

泛型是一种通过多种方式改进程序的技术, 例如:

  • 它可以帮助你进行代码重用, 性能和类型安全。
  • 你可以创建自己的通用类, 方法, 接口和委托。
  • 你可以创建通用集合类。 .NET框架类库在System.Collections.Generic命名空间中包含许多新的通用集合类。
  • 你可以在运行时获取有关通用数据类型中使用的类型的信息。

泛型的优势

  • 可重用性:你可以在同一代码中将单个通用类型定义用于多个目的, 而无需进行任何更改。例如, 你可以创建一个通用方法来添加两个数字。此方法可用于添加两个整数以及两个浮点数, 而无需在代码中进行任何修改。
  • 类型安全:通用数据类型提供了更好的类型安全性, 尤其是在集合的情况下。使用泛型时, 你需要定义要传递给集合的对象的类型。这有助于编译器确保仅将定义中定义的那些对象类型传递给集合。
  • 性能:与普通系统类型相比, 泛型类型提供了更好的性能, 因为它们减少了对变量或对象进行装箱, 拆箱和类型转换的需要。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: