在C#中,泛型是一种强大的编程特性,它允许开发者在定义类、接口、方法等时使用类型参数,从而实现代码的复用性和类型安全性。以下是关于C#泛型的详细讲解:
### 1. **泛型的基本概念**
泛型允许开发者在编写代码时延迟指定具体的数据类型,而是在使用时再指定。这样可以提高代码的复用性、类型安全性和性能。
例如,不使用泛型时,可能我们需要为不同类型的数据定义多个集合类:
```
class IntList
{
private int[] items;
// ...
}
class StringList
{
private string[] items;
// ...
}
```
使用泛型后,可以简化为:
```
class List<T>
{
private T[] items;
// ...
}
```
这里的`T`是一个类型参数,可以在实例化`List`时指定为`int`、`string`或其他任何类型。
### 2. **泛型的类型参数**
在定义泛型时,类型参数用尖括号`<>`表示。类型参数可以是任意类型,但有一些限制:
- 类型参数必须以字母开头。
- 类型参数可以是多个,用逗号分隔,例如`Dictionary`。
### 3. **泛型类**
泛型类是最常见的泛型使用场景之一。例如,`List`是.NET框架常用的中泛型类。
```
public class Box<T>
{
private T content;
public void SetContent(T content)
{
this.content = content;
}
public T GetContent()
{
return this.content;
}
}
```
使用时:
```
Box<int> intBox = new Box<int>();
intBox.SetContent(123);
Console.WriteLine(intBox.GetContent()); // 输出:123
Box<string> stringBox = new Box<string>();
stringBox.SetContent("Hello");
Console.WriteLine(stringBox.GetContent()); // 输出:Hello
```
### 4. **泛型方法**
泛型方法允许在方法级别使用类型参数,而不需要整个类是泛型的。
```
public class Utility
{
public static T GetMax<T>(T a, T b) where T : IComparable
{
return a.CompareTo(b) > 0 ? a : b;
}
}
```
使用时:
```
int maxInt = Utility.GetMax(10, 20); // 返回 20
string maxString = Utility.GetMax("apple", "banana"); // 返回 "banana"
```
### 5. **泛型接口**
泛型接口允许接口定义中包含类型参数,实现从而更灵活的接口设计。
```
public interface IRepository<T>
{
T GetById(int id);
void Save(T entity);
}
```
实现时:
```
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class UserRepository : IRepository<User>
{
public User GetById(int id)
{
// 实现获取用户逻辑
return new User { Id = id, Name =Alice "" };
}
public void Save(User entity)
{
// 实现保存用户逻辑
}
}
```
### 6. **泛型约束**
泛型约束允许对类型参数进行限制,确保类型参数满足某些条件。常见的约束包括:
- **where T : class**:限制类型参数必须是引用类型。
- **where T : struct**:限制类型参数必须是值类型。
- **where T : new()**:限制类型参数必须有无参构造函数。
- **where T : IComparable**:限制类型参数必须实现`IComparable`接口。
- **where T : BaseClass**:限制类型参数必须继承自`BaseClass`。
例如:
```
public class Box<T> where T : IComparable
{
private T content;
public void SetContent(T content)
{
this.content = content;
}
public T GetContent()
{
return this.content;
}
}
```
### 7. **泛型的优势**
1. **类型安全**:编译器会在编译时检查类型是否匹配,减少运行时错误。
2. **代码复用**:通过泛型可以编写通用的类、方法和接口,减少重复代码。
3. **性能优化**:泛型在运行时不会进行装箱和拆箱操作,提高了性能。
### 8. **泛型的限制**
虽然泛型非常强大,但也有一些限制:
- 泛型类型参数不能直接使用`new()`创建对象,除非使用`new()`约束。
- 泛型类型参数不能直接访问静态成员。
### 9. **泛型的高级用法**
- **协变和逆变**:允许在泛型接口或委托中使用更灵活的类型转换。
- **协变(out)**:允许从派生类型转换为基类型。
- **逆变(in)**:允许从基类型转换为派生类型。
- **泛型委托**:如`Func`和`Action`,广泛用于事件处理和回调。
### 10. **总结**
泛型是C#中非常重要的特性,它通过类型参数实现了代码的复用性和类型安全性。掌握泛型的使用,可以帮助开发者编写更高效、更灵活的代码。
C#泛型的基本概念与应用
4261

被折叠的 条评论
为什么被折叠?



