浅析c#范型中的特殊关键字where & default

浅析C#范型中的特殊关键字where & default

范型参数的约束:where

C#中的范型可以使方法或类不依赖于具体类型,从而提供了更强的通用性和可扩展性。但范型也有一些局限性,如类型参数无法被强制转换为不相关类型,无法访问特定的方法或属性等。为了解决这些问题,可以使用“范型参数约束”。

范型参数约束的语法格式如下:

class ClassName<T> where T : constraint1, constraint2, ... , constraint_n

其中,T表示范型类型参数,constraint表示一条或多条约束,多条约束使用逗号隔开。

常见的范型参数约束包括:

  • where T : classT必须是引用类型。
  • where T : structT必须是值类型。
  • where T : new()T必须具有公共的无参数构造函数。

范型参数约束会限制类型参数的类型,让T在满足条件的情况下,能够调用约束类型的方法和属性。

下面是一个举例说明:

public class GenericClass<T> where T : IList<int>
{
    public int Sum(T list)
    {
        int sum = 0;
        foreach (int num in list)
        {
            sum += num;
        }
        return sum;
    }
}

这里的泛型类GenericClass中的类型参数T必须是IList<int>类型或其子类。因此,在Sum方法中,list可以调用IList<int>接口中的方法,如Add,而不需要担心无法访问此方法。

范型类型参数的默认值:default

所有类型参数的起始值都是null,但是在某些情况下,为了能够使用默认的起始值,可以使用default关键字。

default为泛型类型参数返回默认值。当使用default关键字时,必须将其放在类型参数名的右侧。

语法格式如下:

T defaultValue = default(T);

示例代码:

static void Main(string[] args)
{
    int i = default(int);
    string s = default(string);
    Console.WriteLine(i); // 输出0
    Console.WriteLine(s == null); // 输出True
}

在这个示例中,default(int)返回的是0,因为int是值类型,而default(string)返回的是null,因为string是引用类型。

默认值的使用场景:

public class TestClass<T>
{
    private T _t;

    public TestClass()
    {
        _t = default(T);
    }

    public override string ToString()
    {
        return _t.ToString();
    }
}

这里的_tT类型的对象,在调用TestClass构造函数时,将调用default(T),把其返回值赋值给_t变量。当使用ToString方法时,将使用该对象的默认ToString实现,并把输出写入到控制台。

这是一个范型类型参数的默认值示例,我们可以看到default关键字比手动赋值默认值的方式更加简单易用。

结语

wheredefault是C#范型中的两个关键字,可以约束范型类型参数并返回默认值。通过使用这两个关键字,可以显著提高代码的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析c#范型中的特殊关键字where & default - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#编译器对局部变量的优化指南

    下面是详细的攻略步骤: 1. 了解C#编译器的局部变量优化特性 C#编译器通过对代码进行优化,可以提高程序的性能和效率。其中一种优化技术就是对局部变量进行优化。在函数内部定义的局部变量,如果没有被后续的代码继续引用,那么编译器就会优化掉这些变量的存储和访问操作。这种优化可以减少内存开销和CPU的负载,从而提高程序的执行效率。 2. 使用C#编译器的自带优化选…

    C# 2023年6月1日
    00
  • C#使用DoddleReport快速生成报表

    下面是关于C#使用DoddleReport快速生成报表的完整攻略。 一、什么是DoddleReport? DoddleReport是一个基于C#的开源报表生成工具,在.NET平台上运行,可以轻松地生成各种类型的报表,如PDF、Excel、Word等。它可以使用任何.NET应用程序、ASP.NET网站、WinForms或WPF应用程序中编写的数据源,生成定制和…

    C# 2023年5月31日
    00
  • C# Clear():从集合中移除所有元素

    C#中的Clear()方法是一个实例方法,通常用于清空某些数据结构中的元素,例如字符串、数组、集合等。以下是C# Clear()的完整攻略,包括用法、示例和注意事项。 用法 Clear()方法是通过.运算符调用的实例方法,该方法不接受参数,返回值为void类型。可以使用Clear()方法来清空String、StringBuilder、List、Diction…

    C# 2023年4月19日
    00
  • C#反射调用dll文件中的方法操作泛型与属性字段

    C#反射可以让我们在运行时根据需要动态加载并调用其他程序集中的对象、函数和属性等,这对于某些需要动态处理对象的场景非常有用。而操作泛型和属性字段是其中的常见需求。下面是一份完整攻略: 一、加载dll文件 使用反射前,需要首先通过Assembly.Load()方法或者Assembly.LoadFile()方法或Assembly.LoadFrom()方法来加载需…

    C# 2023年5月15日
    00
  • C#自定义字符串压缩和解压缩的方法

    C#自定义字符串压缩和解压缩的方法 在C#中,我们可以使用System.IO.Compression命名空间提供的类来进行字符串压缩和解压缩。这里我们将介绍如何通过System.IO.Compression,自定义字符串的压缩和解压缩方法。 字符串压缩方法 字符串压缩方法是将字符串转化为压缩后的byte数组。这里我们采用GZipStream进行压缩。 // …

    C# 2023年6月8日
    00
  • C#绘图基本方法实例总结

    C#绘图基本方法实例总结 简介 本篇文章主要介绍C#绘图基本方法的实例总结,包括绘制线条、矩形、圆形、椭圆等基本图形的实现方法,同时介绍了如何使用画刷、画笔等一些绘图工具来实现更加丰富的效果。 绘制线条 使用Graphics对象绘制线条,可以使用以下方法: public void DrawLine(Pen pen, int x1, int y1, int x…

    C# 2023年6月1日
    00
  • C#根据反射和特性实现ORM映射实例分析

    实现ORM映射可以使用反射和特性相结合的方式来完成。这篇文章将详细介绍使用C#反射和特性来实现ORM映射的全过程。 1.什么是ORM ORM(Object Relational Mapping)即对象关系映射,在软件开发中经常用来将数据库中的数据转化为对象,使操作数据库变得更加简单和方便。ORM通常由程序代码和XML或注释等配置文件组成,其中程序代码使用反射…

    C# 2023年5月31日
    00
  • Unity的IPostBuildPlayerScriptDLLs实用案例深入解析

    Unity的IPostBuildPlayerScriptDLLs实用案例深入解析 什么是IPostBuildPlayerScriptDLLs IPostBuildPlayerScriptDLLs是Unity中的一个接口类,可以在BuildPlayer过程中自定义处理DLL文件。通过在Unity编辑器中实现该接口,可以在生成构建设置时自定义处理DLL文件,从而…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部