首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么c#编译器在使用new()约束的泛型类型调用new in时会发出Activator.CreateInstance?

在C#编译器中,当使用new()约束的泛型类型调用new()时,会发出Activator.CreateInstance的原因是为了确保满足new()约束的条件。new()约束要求泛型类型参数必须具有无参数的构造函数。为了在运行时检查这个条件,编译器会使用反射来生成一个新的实例。

Activator.CreateInstance方法是一个通用的对象实例化方法,它可以在运行时动态创建一个指定类型的实例。在这种情况下,编译器使用Activator.CreateInstance来确保满足new()约束,从而确保程序的正确性。

以下是一个简单的示例,说明了为什么C#编译器在使用new()约束的泛型类型调用new()时会发出Activator.CreateInstance

代码语言:csharp
复制
public class MyClass<T> where T : new()
{
    public T CreateNew()
    {
        return new T();
    }
}

在这个示例中,MyClass的类型参数T受到new()约束,这意味着T必须具有无参数的构造函数。当调用CreateNew()方法时,编译器会生成一个新的T实例。为了确保满足new()约束,编译器会使用Activator.CreateInstance来创建这个实例。

总之,C#编译器在使用new()约束的泛型类型调用new()时会发出Activator.CreateInstance,以确保满足new()约束的条件,并确保程序的正确性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# 基础知识系列- 5 反射和

前言 为什么要把反射和放在一起讲呢,这里是处于个人对C#一个很棒观感,因为C#反射是可以获取元素,而不像Java一个让我比较难受地方就是Java实际编译时候会擦除类型信息。...(); 使用类和普通类不同地方就是,类告诉编译器你要传递类型。...使用 做标记,中间写类型,表示这是一个为XXX类。通常与其他语言不同地方是,C#支持所有类型,意思就是没有额外声明时候,可以使用任意类型作为参数传递。...约束标记 约束 实际开发过程中,我们会对一些参数进行类型约束,那么约束应该怎么写呢,看示例: public void Demo(T arg) where T : 约束内容...C#里有个很有意思地方,那就是标记。

1.5K60

C# new

C#中,new关键字有三种主要用法: new 运算符 (New Operator): 用于创建对象和调用构造函数。这是new关键字最常见用法,用于实例化类和调用构造函数。...new 约束 (New Constraint): 用于声明中,指定类型参数必须具有公共无参数构造函数。这种用法确保了类型参数被实例化时,会调用类型默认构造函数。...但需要注意是,这种隐藏是静态,也就是说,在编译时就确定了使用哪个版本方法,而不是在运行时动态决定。 new 约束,是怎么实现约束?...毕竟编译器拥有在编译器就能识别具体类了。现在可以马后炮讲:正因为是编译器只有在编译期才确定具体类型,所以编译器无法事先知道要直接调用哪些无参构造函数类,所以才用到了反射。...试想一下 ,如果你框架中有些方法用到了无参构造函数约束,并且处于调用热路径上,其实这样性能是大打折扣,因为反射 Activator.CreateInstance 性能肯定是远远不如直接调用无参构造函数

15620
  • C# 约束 new() 你必须要知道

    C# 约束 new() 你必须要知道事 注意:本文不会讲如何使用,关于概念和约束使用请移步谷歌。 本文要讲的是关于约束无参构造函数 new 一些底层细节和注意事项。...毕竟编译器拥有在编译器就能识别具体类了。 现在可以马后炮讲:正因为是编译器只有在编译期才确定具体类型,所以编译器无法事先知道要直接调用哪些无参构造函数类,所以才用到了反射。...试想一下 ,如果你框架中有些方法用到了无参构造函数约束,并且处于调用热路径上,其实这样性能是大打折扣,因为反射 Activator.CreateInstance 性能肯定是远远不如直接调用无参构造函数...注意,我这里说反射是通俗概念,因为我找不到CLR内部方法实现代码,其实现过程细节有同学陈鑫伟评论中指出来了。 那么有没有什么方法能够使用约束这个特征同时,又不会让编译器去用反射呢?...所以与此处动态调用是冲突。 的确没错,委托必须要在初始化表达式时就要确定类型

    1.8K60

    C# 中关于 T

    前言 C# 里面的不仅可以使用型函数、接口,也可以使用类、委托等等。使用时候,它们会自行检测你传入参数类型,因此它可以为我们省去大量时间,不用一个个编写方法重载。...没有任何约束情况下,类型参数可以是任何类型编译器只能假定 System.Object 成员,它是任何 .NET 类型最终基类。如果客户端代码使用不满足约束类型编译器发出错误。...例如,基类约束告诉编译器,仅此类型对象或派生自此类型对象可用作类型参数。编译器有了此保证后,就能够允许类中调用类型方法。...类是 C# 语言中一种强大特性,它允许定义类时,使用类型参数来表示其中某些成员。...使用,可以对类型进行 where 约束,限制其可以接受类型。这可以帮助我们确保代码只能在特定类型上运行,并提供更严格类型检查。 C# 中提供了更加灵活、安全和高效编程方式。

    31340

    C# 中关于

    前言 C# 里面的不仅可以使用型函数、接口,也可以使用类、委托等等。使用时候,它们会自行检测你传入参数类型,因此它可以为我们省去大量时间,不用一个个编写方法重载。...没有任何约束情况下,类型参数可以是任何类型编译器只能假定 System.Object 成员,它是任何 .NET 类型最终基类。如果客户端代码使用不满足约束类型编译器发出错误。...例如,基类约束告诉编译器,仅此类型对象或派生自此类型对象可用作类型参数。编译器有了此保证后,就能够允许类中调用类型方法。...类是 C# 语言中一种强大特性,它允许定义类时,使用类型参数来表示其中某些成员。...使用,可以对类型进行 where 约束,限制其可以接受类型。这可以帮助我们确保代码只能在特定类型上运行,并提供更严格类型检查。 C# 中提供了更加灵活、安全和高效编程方式。

    39820

    .NET高级特性-Emit(2)类定义

    废话不多说,首先,我们先来回顾一下C#内部由什么东西组成:   (1) 字段-C#类中保存数据地方,由访问修饰符、类型和名称组成;   (2) 属性-C#类中特有的东西,由访问修饰符、类型、名称和...  (3) 实现-C#类可以实现多个接口,并实现接口中所有方法   (4) -C#类可以包含参数,此外,类还可以对实现约束   以上就是C#类所具备一些元素,以下为样例: public...从上图我们可以很清晰看到.NET层级结构,位于树顶层浅蓝色圆点表示一个程序集Assembly,第二层蓝色表示模块Module,模块下均为我们所定义类,类中包含类参数、继承类信息、实现接口信息...T,并添加约束 //定义参数 var genericTypeBuilder = typeBuilder.DefineGenericParameters("T")[0]; //设置约束 genericTypeBuilder.SetGenericParameterAttributes...(GenericParameterAttributes.NotNullableValueTypeConstraint);   (5) 继承和实现接口,注意当实现类参数需传递给接口时,需要将接口添加参数后再调用

    1.1K20

    C# 编译特性对性能影响

    C#作为一种强类型语言,具有丰富支持,允许开发者编写可以应对不同数据类型通用代码。然而,编译时,针对结构和类作为参数时,会对性能产生不同影响。...编译行为 C#中,编译行为取决于参数类型。具体而言,当参数是结构(Struct)时,编译器会针对每个具体结构类型生成特定实现。...而当参数是类(Class)时,编译器则可能生成更通用实现。 结构 vs 类 结构(Struct) 结构是值类型,它们存储栈上,具有较小内存开销。...类(Class) 类是引用类型,存储堆上,需要通过引用进行访问。当参数是类时,编译器可能生成更通用实现。这可能导致较低性能,因为通用实现需要进行动态调度和引用类型操作,增加了一些开销。...测试性能差异 针对不同参数进行性能测试是一种有效方法,以观察结构和类对编译特性影响。测试中,可能会发现对结构类型参数,其性能可能更高,而对类类型参数,其性能可能略低。

    19310

    C#详解

    为什么使用 为了了解这个问题,我们先看下面的代码,代码省略了一些内容,但功能是实现一个栈,这个栈只能处理int数据类型: public class Stack     {         private...实例化类时,根据用户指定数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际数据类型,等同于用实际类型类,所以不同封闭类本地代码是不一样。...以上约束表明,T必须是从Stack和IComparable继承,V必须是Stack或从Stack继承,否则将无法通过编译器类型检查,编译失败。...由以上示例可知,C#实例方法被调用时检查重载是否产生混淆,而不是类本身编译时检查。同时还得出一个重要原则: 当一般方法与方法具有相同签名时,会覆盖方法。...使用范围 本文主要是类中讲述,实际上,还可以用在类方法、接口、结构(struct)、委托等上面使用使用方法大致相同,就不再讲述。 小结 C# 是开发工具库中一个无价之宝。

    1.2K60

    C#详解

    为什么使用 为了了解这个问题,我们先看下面的代码,代码省略了一些内容,但功能是实现一个栈,这个栈只能处理int数据类型: public class Stack     {         private...实例化类时,根据用户指定数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际数据类型,等同于用实际类型类,所以不同封闭类本地代码是不一样。...以上约束表明,T必须是从Stack和IComparable继承,V必须是Stack或从Stack继承,否则将无法通过编译器类型检查,编译失败。...由以上示例可知,C#实例方法被调用时检查重载是否产生混淆,而不是类本身编译时检查。同时还得出一个重要原则: 当一般方法与方法具有相同签名时,会覆盖方法。...使用范围 本文主要是类中讲述,实际上,还可以用在类方法、接口、结构(struct)、委托等上面使用使用方法大致相同,就不再讲述。 小结 C# 是开发工具库中一个无价之宝。

    96821

    C# 学习笔记(9)——

    C# 2.0 提出特性使类型可以被参数化,从而不必再为不同类型提供特殊版本方法实现。...无论调用类型方法还是初始化实例,都需要用真实类型来代替 T。你可以把 T 理解为类型一个占位符,即告诉编译器调用时必须为其指定一个实际类型。...(); } } 类型参数推断 由于使用时都需要写“”等符号,阅读代码时,一旦代码变多,难免另开发人员感觉头晕。...通过使用编译器类型推断,你可以代码时省略掉这些符号,具体实际类型则由编译器自选推断 public static class GenericClass { public static...where 关键字来限制某个类型实参类型 C# 中有四种约束可以使用,它们语法类似:约束要放在方法或类型声明末尾,并且要使用 where 关键字 1、引用类型约束 引用类型约束表示形式为T

    17520

    C#用处

    为什么使用 为了了解这个问题,我们先看下面的代码,代码省略了一些内容,但功能是实现一个栈,这个栈只能处理int数据类型: public class Stack { private int[]...C#编译机制如下: 第一轮编译时,编译器只为Stack类型产生“版”IL代码和元数据,并不进行类型实例化,T中间只充当占位符。...C#几个特点 如果实例化类型参数相同,那么JIT编译器会重复使用类型,因此C#动态能力避免了C++静态模板可能导致代码膨胀问题。...C#采用“基类、接口、构造器、值类型/引用类型约束方式来实现对类型参数“显示约束”,提高了类型安全同时,也丧失了C++模板基于“签名”隐式约束所具有的高灵活性。...实例化类时,根据用户指定数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际数据类型,等同于用实际类型类,所以不同封闭类本地代码是不一样

    1.3K10

    浅谈

    下面展示了类定义: // List 类 // IList 接口 // T:类型参数,定义时候不设定,使用时候指定具体类型,如int,string等 public...使用类型并指定类型实参时,实际是CLR中定义一个新类型对象,新类型对象从类型派生自那个类型派生。...} } C#还提供更多对验证和约束能力,编译代码时,C#编译器会进行分析,确保代码使用于当前已有或将来可能定义任何类型。...o1变量来调用CompareTo方法,但是许多类型都没有提供CompareTo方法,所以C#编译器不能编译上述代码,因为这个方法不适用于所有类型。...T temp = new T(); } } 类型变量转型 使用C# as操作符: T obj = arg1; string s = obj as string; 为类型变量设置默认值

    1K30

    2.1  使用(generic),可以编写在编译时类型安全通用代码,无须事先知道要使用具体类型,即可在不同位置表示相同类型引入之初,主要用于集合。...关于方法调用,前文仅仅给出了关于类型实参粗略描述。调用方法时,有时无须在代码中给出类型实参,编译器可以帮我们决定具体采用哪个类型。...有时对于某个类型形参,需要它只限于特定类型,这就有了类型约束概念。 2.1.5 类型约束 类型方法中声明类型形参时,可以使用类型约束来限定哪些类型可以用作类型实参。...说明 关于List不能转换为List类型原因,第4章介绍时会深入探讨,这里暂且只考虑约束内容。...2.1.7 类型初始化与状态 前面typeof调用结果显示:List和List是由同一个类型定义构造出来两个类型使用时会被当作不同类型来对待;而且初始化和处理静态字段时

    1.4K10

    .NET面试题系列 -

    “可变性是以一种类型安全方式,将一个对象作为另一个对象来使用。“ - Jon Skeet 相比反射,委托等较为抽象概念要更接地气得多,而且平常工作时,我们几乎时刻都和有接触。...方法 方法使用契机一般为传入类型可能有很多种,但处理方式却相同情境。这时我们可以不需要写很多个重载,而考虑用方法达到代码复用目的。配合约束,可以写出更严谨方法。...约束分为如下几类: 接口约束实参必须实现某个接口。接口约束可以有多个。 基类型约束实参必须是某个基类派生类。...构造函数new()约束实参必须具有可访问无参数构造函数(默认也可)。new()约束出现在where子句最后。 如果方法没有任何约束,则传入对象会被视为object。...协变与逆变 协变性和out关键字搭配使用,用于向调用者返回某项操作值。例如下面的接口仅有一个方法,就是生产一个T类型实例。那么我们可以传入一个特定类型

    72030

    C#7.3 新增功能

    可以对支持模式任何类型使用 fixed 语句。 可以使用其他约束。 对现有功能进行了以下增强: 可以使用元组类型测试 == 和 !=。 可以多个位置使用表达式变量。...1.5 增强约束 现在,可以将类型 System.Enum 或 System.Delegate 指定为类型参数基类约束。...有关详细信息,请参阅有关 where 约束类型参数约束文章。 将这些约束添加到现有类型是不兼容更改。 封闭式类型可能不再满足这些新约束要求。...如果方法含有实例接收器情况下被调用,则编译器将丢弃静态成员。 没有接收器时,编译器将仅添加静态上下文中静态成员,否则,将同时添加静态成员和实例成员。...当一个方法组包含类型参数不满足其约束某些方法时,这些成员将从候选集中移除。 对于方法组转换,返回类型与委托返回类型不匹配候选方法将从集中移除。

    1.6K10

    1-

    C#由CLR在运行时支持,这使得可以CLR支持各种语言上无缝集合; C#代码在被编译[第一次编译]为IL代码和元数据时[IL和元数据], 采用特殊占位符来表示类型,并用专有的...C#类型携带有丰富元数据,因此C#类型可以应用于强大反射技术;采用[基类, 接口, 构造器, 值类型/引用类型]约束方式来实现对类型参数"显式约束", 提高了类型安全性。...但这些成员本身可以包含在类型中,并使用类型类型参数]; 方法可以包含在类型中,也可以包含在非类型中[即普通类型]。...约束 为什么要有约束呢?...基类约束:表是类型参数必须是继承子指定类型; 构造器约束:只支持无参构造器约束,就是必须保障参数类型可以调用无参构造器: 值类型/引用类型约束

    922100

    C#入门类、集合、方法、约束委托

    第一次接触那还是大二上学期时候,那会是学c#面向对象时候接触过集合,但尴尬是那会还没有“”这个概念,仅仅只停留在集合使用。...官方解释: 是程序设计语言一种特性。允许程序员类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对支持均不一样。...所以.net 2.0程序时应该放弃使用ArrayList,推荐使用使用List《T》 集合。这也是我们为什么使用原因之一。...###类型参数约束### 为什么使用类型参数约束呢,简单点说就是筛选类型参数,使用代码中如果违反了某个约束不允许类型来实例化则会产生编译错误,类型参数约束使用关键字where。...当与其他约束一起使用时,new() 约束必须最后指定。 where T: 类型参数必须是指定基类或派生自指定基类。

    2.5K30

    带你了解C#每个版本新特性

    C#2中有了,所以我们可以使用List、Dictionary。能够带来很好编译时类型检查,也不会有装箱拆箱操作,因为类型使用时候就已经指定了。...定义类型或时可以通过定义约束来对参数进行限制,更好使用编译时检查。...约束是通过关键字where来实现,C#2中约束有4种: 引用类型约束:确保类型实参是引用类型使用where T:class来表示; 值类型约束:确保类型实参是值类型使用where T:truct...C#2中可空类型主要是使用System.Nullable类型类型参数T有值类型约束。...静态类型中当我们要使用程序集中类,要调用类中方法,编译器必须知道程序集中有这个类,类里有这个方法,如果不能事先知道,编译时会报错,C#4以前可以通过反射来解决这个问题。

    3.5K20

    C Sharp(十二)

    我们可以使用类型占位符书写代码,创建实例时指明实际类型即可。 C# 提供了 5 种可用在地方: 类、结构、接口、委托、方法。前四种是类型,最后一种是成员。...创建使用类有两步: 声明类和创建类实例。 但是类不是实际类,而是类模板,所以我们必须先从模板构建出实际类型,然后创建这个构建后类型实例。...声明步骤: 类名后放置一对尖括号 尖括号中用逗号分隔占位字符串来表示希望提供类型,这叫做类型参数(type parameters) 主体使用类型参数代替实际类型 class SomeClass...short, int> mySc1 = new SomeClass(); 类型参数约束 为了让变得更有用,我们需要提供额外信息让编译器知道 type parameter 可以接受哪些类型...方法有两个参数列表: 封闭圆括号内方法参数列表 封闭尖括号内类型参数列表 要声明方法: 方法名之后,方法参数之前放置类型参数列表 方法参数之后放置可选约束子句 public void

    84020
    领券