首页 > 编程语言 >深入理解C#泛型:new与where关键字全解析

深入理解C#泛型:new与where关键字全解析

时间:2023-04-25 12:33:38浏览次数:45  
标签:C# 关键字 参数 泛型 new where public

C#泛型中new和where是重要的关键字,它们都可以用于约束泛型类型参数的限制;它们都用于提高代码的安全性和可用性,它们的作用在很大程度上提高了代码的可读性和可维护性。在这篇文章中,我们将一起了解泛型中的new和where,以及它们之间的区别。

1. new关键字

在C#泛型中,new关键字被用于指定泛型类型参数必须具有公共的无参数构造函数。

使用new关键字指定泛型类型参数需要有无参数构造函数时,可以保证我们在使用泛型类型参数来创建实例时不会发生运行时错误。如果我们使用了没有公共无参数构造函数的泛型类型参数,就会在运行时抛出异常。

使用示例:

 class ItemFactory<T> where T : new()
    {
        public T Fun()
        {
            var t=new T();
            return t;
        }
    }
    //调用:
      public  class Test
    {
        public  void Testfun()
{
            var rel= new ItemFactory<Pet>();
            rel.Fun();
         }
    }
    public  class Pet
    {
        //new默认带无参数构造函数,如果有参数的构造函数报错
        //public Pet(string test)
        //{ }
        public string Name { get; set; }
        public int Age { get; set; }
    }

.NET默认类带一个无参数的构造函数。

2. where关键字

在C#泛型中,where关键字用于指定泛型类型参数的约束条件。泛型定义中的 where 子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束。约束可指定接口、基类或要求泛型类型为引用、值或非托管类型。约束声明类型参数必须具有的功能,并且约束必须位于任何声明的基类或实现的接口之后。

使用示例:

  //只允许类
    class UsingClass<T> where T : class
    {
        public T Fun()
{
            return default(T);
        }
    }
    //只允许枚举
    class UsingEnum<T> where T : System.Enum
    {
        public T Fun()
{
            return default(T);
        }
    }
    //只允许类和结构类型
    class UsingClassStruct<T,U> where T : class where U : struct
    {
        public T Fun()
{
            return default(T);
        }
    }
  //欢迎公众号:DOTNET开发跳槽,领取海量面试题   

3、结语

本文简单介绍了new和where关键字及它们的案例,new和where关键字都是C#泛型中非常重要的关键字,它们在代码中起着至关重要的作用。学会正确使用和理解它们的区别,可以让我们编写更加安全、可读和可维护的代码。希望本文对你有所收获,欢迎留言和吐槽。

参考:微软官方文档

来源公众号:DotNet开发跳槽

标签:C#,关键字,参数,泛型,new,where,public
From: https://www.cnblogs.com/xbhp/p/17352265.html

相关文章

  • win环境基于docker搭建zookeeper伪集群
    创建路径:D:\Docker\zk-cluster在此路径下创建配置文件:docker-compose.ymlversion:'2'networks:zk-net:name:zk-netservices:zoo1:image:zookeeperrestart:alwayscontainer_name:zoo1ports:-"21......
  • Access和Trunk数据传输
    vlan中有两种接口模式access和trunk下面我们分析下这张两种的数据传输模式。我们知道交换机之间传输的是二层数据帧格式的,所以它的报文是下面的vlan帧格式就是在原始帧的源目mac地址和type之间加入了tag标签。我们就按照上图为例讲一下:access接口:access是单一链路,只能承载一个vlanS......
  • CentOS 7.x部署cerebro
    1、简介Cerebro是Elasticsearch版本5.x以前插件ElasticsearchKopf的演变,可以通过图形界面查看分片分配和执行常见的索引操作。完全开源,需要依赖Java1.8或更高版本才能运行。2、安装#安装javayum-yinstalljava#解压wgethttps://github.com/lmenezes/cerebro/relea......
  • 融云 CTO 岑裕:出海技术前沿探索和排「坑」实践
    在本文中,你将看到以下内容:全球通信网络在接入点、链路加速、服务商、协议等层面的动态演进;进入到具体市场,禁运国、跨国拦截、区域一致性差等细节“坑点”如何应对;融云如何从技术侧帮助开发者应对本地化用户体验和业务合规的挑战。具备全球化视野和能力的新一代创业者,让中国互联网产......
  • 目录操作函数(mkdir rmdir rename chdir getcwd opendir closedir readdir dup dup2)
      /*创建文件#include<sys/stat.h>#include<sys/types.h>intmkdir(constchar*pathname,mode_tmode);参数:mode:权限移除文件#include<unistd.h>intrmdir(constc......
  • 【面试宝典】C/C++ 基础
    一.语言基础 数组和指针的区别 数组指针概念是用于储存多个相同类型数据的集合。 数组名是首元素的地址特殊的变量,存放的是其它变量在内存中的地址。 指针名指向了内存的首地址赋值只能一个一个元素的赋值或拷贝同类型指针变量可以相互赋值存放方式连续......
  • windows环境下emacs的python简单配置
    首先参考了上一篇《emacs极简配置》,我的想法是打开兼容vim的viper到5级,然后一些基本的字体设定,然后如何执行python文件的一个全过程方法。1、先打开emacs,如果忘了怎么用了,看一下自带的教程,还是中文的,超级方便。2、学完后,键入C-xC-f并按~,这样就会打开默认的配置文件所在的目录......
  • ueditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • Halcon图像灰度值运算&图像截取及合并&灰度特征值介绍
    灰度膨胀运算gray_dilation_rect算子gray_dilation_rect(Image : ImageMax : MaskHeight, MaskWidth :)示例:gray_dilation_rect(Image,ImageMax,11,11)Image(输入对象):输入灰度图对象ImageMax(输出对象):输出膨胀后的灰度图对象11(输入参数1):滤波器掩模的高度数值越大......
  • gRPC 应用指引
    一、核心概念、架构及生命周期1、服务定义gRPC默认使用 protocolbuffers。serviceHelloService{rpcSayHello(HelloRequest)returns(HelloResponse);}messageHelloRequest{stringgreeting=1;}messageHelloResponse{stringreply=1;}gR......