博客
关于我
七天学习计划_c#_[1]泛型类(还有六天,明天继续写!)
阅读量:610 次
发布时间:2019-03-13

本文共 2947 字,大约阅读时间需要 9 分钟。

泛型(Generics)是C#语言中的一个强大特性,能够显著提升代码的类型安全性和可读性。以下将详细介绍泛型的概念、实现示例及其 использования方法,以帮助开发者更好地理解并应用该技术。

泛型的基本概念

在C#中,泛型允许在定义数据结构时指定类型参数,使得结构能够支持多种数据类型。这种机制增强了类型的安全性,确保在运行时避免了类型不匹配的问题。例如,使用MyStack

栈时,只能存储整数,不会出现类型混淆或装箱/拆箱操作。

泛型类的实现:一个栈的例子

以下是一个定义栈的泛型类及其使用方法的示例:

public class MyStack
{
private T[] stack;
private int stackPoint; // 当前栈指针
private int size; // 栈的容量
public MyStack(int size)
{
this.size = size;
this.stack = new T[size];
this.stackPoint = -1; // 初始指针位置
}
public void Push(T item)
{
if (stackPoint >= size)
{
Console.WriteLine("栈空间已满");
return;
}
stackPoint++;
stack[stackPoint] = item;
}
public T Pop()
{
if (stackPoint < 0)
{
throw new InvalidOperationException("栈为空");
}
T item = stack[stackPoint];
stackPoint--;
return item;
}
}
// 在Main函数中使用
MyStack
stack = new MyStack
(3);
stack.Push(1);
stack.Push(2);
stack.Push(3);
Console.WriteLine(stack.Pop()); // 输出3
Console.WriteLine(stack.Pop()); // 输出2
Console.WriteLine(stack.Pop()); // 输出1

default关键字的使用

default关键字用于为参考类型和值类型赋默认值。对于参考类型,赋值为null,而值类型则为其默认值,如int为0,double为0.0。这个机制在初始化时自动处理,简化了代码编写。

class MyGenericClass1
{
private T1 obj1;
public MyGenericClass1()
{
obj1 = default(T1); // T1为引用类型时赋null
// 如果T1是值类型,赋其默认值
}
}

带约束的泛型类

使用where关键字添加类型约束,确保类型符合特定条件。例如,T1定义为结构类型,T2为类类型,T3要求有一个无参数构造函数。这种约束在运行时进行,提升代码的健壮性和一致性。

class MyGenericClass2
where T1 : struct // T1必须是结构(值类型)
where T2 : class // T2必须是类(引用类型)
where T3 : new() // T3必须有无参数构造函数
{
private List
ProductList;
private List
Publisher;
public MyGenericClass2()
{
ProductList = new List
(new T2[1]);
Publisher = new List
(new T3[1]);
}
public T2 Buy(T1 num)
{
dynamic obj = num; // 运行时才检查类型约束
return ProductList[obj];
}
}
// 类定义
class Course
{
public string CourseName { get; set; }
public int Period { get; set; }
}
class Teacher
{
public string Name { get; set; }
public int Count { get; set; }
}

泛型方法示例

下面是一个泛型方法的例子,用于支持多种数据类型间的运算。例如,支持字符串相加或数值相加。

public class Helpers
{
public static T Add
(T a, T b)
{
return a + b;
}
}
// 使用方法
string result = Helpers.Add(" Hello", " World"); // " Hello World"
Console.WriteLine(result); // 输出 " Hello World"
int resultInt = Helpers.Add(5, 4); // 9
Console.WriteLine(resultInt); // 输出9

使用建议

  • 可扩展性:同一个泛型类能够支持多个类型,而无需编写不同的实现。

  • 减少装箱/拆箱:避免在装箱和拆箱操作中引入潜在异常,提升性能和代码可靠性。

  • 可读性和维护性:清晰的类型约束使得代码更易于阅读和维护,减少类型相关的错误。

  • 性能优化:正确使用泛型可以提高代码运行效率,尤其是在类型已知且检查频繁的情况下。

  • 注意事项

    • 类型约束:合理使用带约束的泛型,确保开发者和代码配合使用。

    • 性能检查:了解泛型的类型检查机制对性能的影响,熟悉方法调用和类型获取的成本。

    • 多态性:与多态不同,泛型在编译时进行类型检查,减少了虚拟方法和纯动态类型可能带来的开销。

    通过合理运用C#中的泛型技术,可以显著提升代码的质量和性能,同时减少错误和困难。

    转载地址:http://thkaz.baihongyu.com/

    你可能感兴趣的文章
    NIO蔚来 面试——IP地址你了解多少?
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NISP国家信息安全水平考试,收藏这一篇就够了
    查看>>
    NIS服务器的配置过程
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NiuShop开源商城系统 SQL注入漏洞复现
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP度量指标BELU真的完美么?
    查看>>
    NLP的不同研究领域和最新发展的概述
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>