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

dotnet C# 使用 EqualityComparer 提升泛型值类型相等判断性能

本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,通过 EqualityComparer 静态类的相等方法来优化值类型相等判断性能...在一些泛型类型里面,需要进行值相等判断,此时默认就是使用 Equals 方法,如下面代码 public override bool Contains(T value) { return _loneEntry.Equals...(value); } 还请忽略上面代码的 _loneEntry 字段,但是以上的代码调用的 Equals 方法的参数是 object 类型,也就是调用 Equals 方法将会装箱。...根据 C# 基础知识,如果有装箱那就有对象分配 也就是每调用一次如上的方法,将会有一次内存对象的分配 可以通过 EqualityComparer 方法来优化性能,使用 EqualityComparer...可以继续使用泛型判断,可以减少内存分配 public override bool Contains(T value) { return EqualityComparer.Default.Equals

79420

C#相等性 - “==”

今天写一下C#里的“==”这个操作符。 原始类型 假象 在刚学C#的时候,我以为C#里的==和.NET里的object.Equals()方法是一样的,就是一个语法糖而已。...所以这应该也是使用CPU的硬件来进行判断相等性的,那么像这种引用类型是怎么通过CPU硬件来比较的呢?...通常情况下,尽量使用==操作符,但是有时候==不行,需要使用object.Equals()方法,例如涉及到继承或者泛型的时候。 继承 直接看例子: ?...之所以返回了False,是因为泛型方法里的==操作符比较的是引用,而这又是因为尽管编译器知道可以把==操作符应用于类型T,但是它仍然不知道具体是哪个类型T会重载该操作符,所以它会假设T不会重载==操作符...所以泛型方法不会选择任何的操作符重载,它对待泛型类就像对待object类型一样。 综上,针对泛型方法,应该使用Equals()方法,而不是==操作符。 ?

73220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    假象

    今天写一下C#里的“==”这个操作符。 原始类型 假象 在刚学C#的时候,我以为C#里的==和.NET里的object.Equals()方法是一样的,就是一个语法糖而已。...所以这应该也是使用CPU的硬件来进行判断相等性的,那么像这种引用类型是怎么通过CPU硬件来比较的呢?...泛型 另一种不适合使用==操作符的情景是涉及泛型的时候,直接看例子: 这个泛型方法直接报错了,因为==操作符无法应用于这两个操作数T,T可以是任何类型,例如T是非原始类型的struct,那么==就不可用...而实际结果是: 之所以返回了False,是因为泛型方法里的==操作符比较的是引用,而这又是因为尽管编译器知道可以把==操作符应用于类型T,但是它仍然不知道具体是哪个类型T会重载该操作符,所以它会假设T...所以泛型方法不会选择任何的操作符重载,它对待泛型类就像对待object类型一样。 综上,针对泛型方法,应该使用Equals()方法,而不是==操作符。

    28410

    TypeScript手记(五)

    在像 C# 和 Java 这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。...使用泛型变量 使用泛型创建像 identity 这样的泛型函数时,编译器要求你在函数体必须正确的使用这个通用的类型。换句话说,你必须把这些参数当做是任意或所有类型。...记住,这些类型变量代表的是任意类型,所以使用这个函数的人可能传入的是个数字,而数字是没有 .length 属性的。 现在假设我们想操作 T 类型的数组而不直接是 T。...泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样: function identity(arg: T): T { return arg } let myIdentity...y) { return x + y } console.log(stringNumeric.add(stringNumeric.zeroValue, 'test')) 与接口一样,直接把泛型类型放在类后面

    93710

    C#泛型详解

    使用泛型 下面是用泛型来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。...在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类,所以不同的封闭类的本地代码是不一样的。...();     }    //至此,s的值为64321 泛型中的静态成员变量 在C#1.x中,我们知道类的静态成员变量在不同的类实例间是共享的,并且他是通过类名访问的。...泛型类的方法重写 方法重写(override)的主要问题是方法签名的识别规则,在这一点上他与方法重载一样,请参考泛型类的方法重载。...泛型的使用范围 本文主要是在类中讲述泛型,实际上,泛型还可以用在类方法、接口、结构(struct)、委托等上面使用,使用方法大致相同,就不再讲述。 小结 C# 泛型是开发工具库中的一个无价之宝。

    1.2K60

    C# 发展历史及版本新功能介绍

    类名和泛型类型参数在所有的分部类型定义中都必须匹配。 泛型类型可以是分部的。 每个分部声明都必须以相同的顺序使用相同的参数名。...abstract sealed 基类 new 修饰符(嵌套部分) 泛型约束 匿名方法 在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。...在使用扩展方法时,可以像调用实例方法那样调用静态方法。扩展方法”是C#独有的一种方法,在扩展方法中会使用ExtensionAttribute这个attribute。...泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性。 在引用类型系统时,协变、逆变和不变性具有如下定义。...泛型协变和逆变提供了更强的功能来使用泛型,但风格比较偏学术,应该最受框架和库创建者的喜爱。 命名参数和可选参数帮助消除了很多方法重载,让使用更方便。 但是这些功能都没有完全改变模式。

    4.2K20

    C#泛型详解

    使用泛型 下面是用泛型来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。...在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类,所以不同的封闭类的本地代码是不一样的。...();     }    //至此,s的值为64321 泛型中的静态成员变量 在C#1.x中,我们知道类的静态成员变量在不同的类实例间是共享的,并且他是通过类名访问的。...泛型类的方法重写 方法重写(override)的主要问题是方法签名的识别规则,在这一点上他与方法重载一样,请参考泛型类的方法重载。...泛型的使用范围 本文主要是在类中讲述泛型,实际上,泛型还可以用在类方法、接口、结构(struct)、委托等上面使用,使用方法大致相同,就不再讲述。 小结 C# 泛型是开发工具库中的一个无价之宝。

    97321

    TypeScript系列教程六《泛型》

    在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。...---- 泛型函数的类型与非泛型函数的类型没什么不同,只是有一个类型参数在最前面,像函数声明一样: function identity(arg: T): T { return arg;...这样我们就能清楚的知道使用的具体是哪个泛型类型(比如: Dictionary而不只是Dictionary)。 这样接口里的其它成员也能知道这个参数的类型了。...y) { return x + y; }; console.log(stringNumeric.add(stringNumeric.zeroValue, "test")); 与接口一样,直接把泛型类型放在类后面...在泛型约束里使用类类型 在TypeScript使用泛型创建工厂函数时,需要引用构造函数的类类型。

    93310

    C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性

    同时感觉再来读第二遍也有不一样的收获. 今天很嗨的是武汉下雪了,明天周六,一切都是这么美好.哈哈哈....这里的解决方案就是仍然使用同一个Check方法,但是给这个Check方法新添加一个可选参数来判断到底是执行的哪个操作, 然后根据不同的操作去做相应的修改....哈哈, 确实是这样. 2,泛型的可变性 在C#2.0 中, 泛型并不具备可变性, 这种是指斜变性和逆变性....大家可以这样记忆: 协变性即和谐(与"协"同音)的变化, 从派生类转换为基类, 就如同所子女长的像父母一样, 听起来非常和谐. 这样就很容易记住协变了....要让编译器通过, 我们必须使用强制类型转换, 把object转换为int. 即obj = (int)obj + 10; 但是动态类型的引入到底有什么好处呢? 1,可以减少强制类型转换的使用.

    1.4K80

    尝试Java,从入门到Kotlin(上)

    // 这个编译器会报错 list.stream().map(x -> JsonUtil.parse(x)).collect(Collectors.toList()); 解决方案一种是在函数体中使用try...泛型 Java的泛型原理和C#不同。C#是运行时泛型,在程序运行的时候仍然能获取泛型的类型信息。而Java的泛型是类型擦除(Type Erasure)式泛型。...名称听起来很高大上,意思是Java的泛型仅仅用于编译时类型检查,类型检查完成后,类型信息就被编译器擦除。在最后生成的字节码中中,泛型类型都被改为Object类型。...像下面两句: x instanceof T new T() 在Java中都会编译出错。而这在C#中都是很常见的代码。...但是这样做的坏处在于未来功能扩展时,这个字段的含义、存储方式可能发生变化,导致每个使用了这个字段的代码都需要修改。

    16730

    泛型

    在声明泛型类或者泛型方法时,需要把类型形参写在类名或者方法名称之后,并用尖括号包围。之后在声明体中,就可以像普通类型一样使用该类型形参了(只不过此时还不知道具体类型)。...另外,在一个方法声明中,多个类型形参不能采用相同的名字,这条规则和普通参数不能同名是一样的。...直接调用构造器的实现代码比较烦琐:new Tuple(10, "x", 20) 但是使用静态方法配合类型推断,代码就简单多了4:4前面说过构造器不能为泛型,构造器中的泛型参数实际上是来自它所在类的类型形参...这个问题还可以进一步复杂化:将泛型类型嵌套。像下面这个类定义这样,类型实参的不同组合将得到不同的类型。...泛型是C# 2截至目前最庞大的一个特性了,也是对C# 1的一项重大改进。下面介绍可空值类型,此项特性正是基于泛型建立的。

    1.6K10

    PHP即将引入泛型和集合两大重要特性

    泛型 泛型(Generics) 是一种重要的编程范式,它允许程序员在编写代码时使用类型参数,这些类型参数在编译时或运行时可以被具体的类型所替代。泛型的使用能够增加代码的复用性、灵活性和可维护性。...PHP中的泛型 在PHP官方文档中,并没有直接提及泛型这个概念。这并不意味着PHP不支持泛型,而是说PHP没有像Java或C#那样显式地提供泛型的语法支持。...通过定义一个接口作为类型参数,我们可以实现类似泛型的类型检查和类型约束。虽然这种方法与Java或C#中的泛型有所不同,但它确实提供了一种在PHP中实现泛型功能的方式。 一个简单的例子 泛型? 这可能与PHP的设计理念和历史背景有关。PHP是一种弱类型语言,它允许变量在运行时动态地改变类型。这种灵活性使得PHP在Web开发等领域具有广泛的应用。...集合 泛型的一个主要用例是需要类型化数组。在PHP中,瑞士军刀数组类型的使用(和滥用)有很多原因。但是你目前不能强制将类型用作键或值。

    13510

    java泛型(一)、泛型的基本介绍和使用

    泛型技术在C#和Java之中的使用方式看似相同,但实现上却有着根本性的分歧,C#里面泛型无论在程序源码中、编译后的IL中(Intermediate Language,中间语言,这时候泛型是一个占位符)或是运行期的...(类型擦除在后面在学习)   使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类来说尤其有用。  ...下面看看具体是如何定义的。 1、泛型类的定义和使用 一个泛型类(generic class)就是具有一个或多个类型变量的类。...我们都是直接使用这样的形式来完成泛型类型的声明。 有的时候,类、接口或方法需要对类型变量加以约束。...那么究竟是什么原因,导致了,一个泛型类(含有模板参数的类),没有像C#中 GetGenericArguments()类似的getGenericClass()函数呢??

    1.5K10

    精:C#这些年来受欢迎的特性

    匿名方法 协变和逆变 泛型 迭代器 可空类型 部分类型 我最在最喜欢 泛型 还是 迭代器 之间的摇摆,对我来说这是一个非常困难的选择,最终还是更喜欢泛型,顺便说说其中缘由。...因为相比于写迭代器,我更频繁地使用泛型。在 C# 中很多 SOLID 编程原则 都是使用泛型来强化的,同样它也有助于保持代码的 干爽 。...编者注:学习如何 在 C# 中 使用泛型来提高应用程序的可维护性 泛型向.NET Framework引入了类型参数的概念,这使得可以设计类和方法来推迟一个或多个类型的规范,直到类或方法被客户端代码声明和实例化为止...更具体地说,它要求类型 'DateTime' 必须是一个引用类型,以便将其作为 'T' 参数用于泛型类型或 'Program.DataBag' 方法中。...但是对于我来说,更倾向于命名可选参数,而不是泛型中的协变和逆变。这两者的取舍,取决于哪个是我最常用的,以及近年来最令 C# 开发人员受益的那个特性。

    17230

    C# 这些年来受欢迎的特性

    匿名方法 协变和逆变 泛型 迭代器 可空类型 部分类型 我最在最喜欢 泛型 还是 迭代器 之间的摇摆,对我来说这是一个非常困难的选择,最终还是更喜欢泛型,顺便说说其中缘由。...因为相比于写迭代器,我更频繁地使用泛型。在 C# 中很多 SOLID 编程原则 都是使用泛型来强化的,同样它也有助于保持代码的 干爽 。...编者注:学习如何 在 C# 中 使用泛型来提高应用程序的可维护性 泛型向.NET Framework引入了类型参数的概念,这使得可以设计类和方法来推迟一个或多个类型的规范,直到类或方法被客户端代码声明和实例化为止...更具体地说,它要求类型 'DateTime' 必须是一个引用类型,以便将其作为 'T' 参数用于泛型类型或 'Program.DataBag' 方法中。...但是对于我来说,更倾向于命名可选参数,而不是泛型中的协变和逆变。这两者的取舍,取决于哪个是我最常用的,以及近年来最令 C# 开发人员受益的那个特性。

    20520

    C#语言和JAVA、C++的对比学习

    下面我们就来看看C#有哪些好玩的特性: 首先我发现C#的命名规范比较特别,他使用的是Camel形式的单词拼写,但是又没有Java的首字母小写规则。这点其实更加像Google建议的C++编码规范。...关于变量的存储类型,C++是很丰富的,有值类型、引用、指针。而JAVA则很简单,基本类型都是值类型,对象基本都类似指针类型。...除了用来构造对象,还可以用来隐藏基类被继承的成员,同时也可以用来在泛型使用中约束模板中的参数必须带有公共的无参数构造器——这点在JAVA里面也是靠所谓JavaBean规范来约定,而C#则直接提供了语言支持...C++的模板没有泛型约束的语法,这样导致写模板函数的时候有点像碰运气,靠编译检查来约束,而且还不能确定其真正的语意。...但是JAVA和C#都有泛型约束语句,Where关键字还是很有必要的,特别是我们在做一些业务逻辑的时候,需要写泛型模板代码的时候。

    1.8K40

    C#泛型的用处

    使用泛型 下面是用泛型来重写上面的栈,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替。...他是类型安全的。实例化了int类型的栈,就不能处理string类型的数据,其他数据类型也一样。 2. 无需装箱和折箱。...泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。 C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。...C#泛型的几个特点 如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。...在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类,所以不同的封闭类的本地代码是不一样的。

    1.3K10

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

    第一次接触泛型那还是在大二上学期的时候,那会是学c#面向对象的时候接触过泛型集合,但尴尬的是那会还没有“泛型”这个概念,仅仅只停留在泛型集合的使用。...官方解释: 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。...类型参数命名指南,参见官方文档 ###泛型类和泛型方法### 我们先来看看泛型方法,这个方法的用途是来交换两个变量的 static void Main(string[] args...###泛型类型参数约束### 为什么要使用类型参数的约束呢,简单点说就是筛选类型参数,在使用泛型的代码中如果违反了某个约束不允许的类型来实例化则会产生编译错误,类型参数的约束是使用关键字where。...,声明的时候还是和泛型类、泛型方法一样加个 站个坑,其实泛型委托使用的时候不是很多,要慎用。

    2.6K30

    C# 7.3新特性一览

    泛型约束:枚举、委托和非托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。...非托管类型约束提案使用了unmanaged关键字,用于说明泛型类型必须是“非引用类型,并且在任意嵌套层次上都不包含引用类型字段。”...可重新赋值的Ref局部变量 Ref局部变量现在可以和普通局部变量一样重新赋值了。 要了解其他C# 7.3提案,请查阅C#语言的GitHub站点。...泛型约束:枚举、委托和非托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。...非托管类型约束提案使用了unmanaged关键字,用于说明泛型类型必须是“非引用类型,并且在任意嵌套层次上都不包含引用类型字段。”

    1.2K30
    领券