C#零基础入门篇(11.泛型的基本概念)

C#泛型的基本概念与应用

在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#中非常重要的特性,它通过类型参数实现了代码的复用性和类型安全性。掌握泛型的使用,可以帮助开发者编写更高效、更灵活的代码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值