iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NET避免装箱的方法
  • 315
分享到

.NET避免装箱的方法

2024-04-02 19:04:59 315人浏览 独家记忆
摘要

.net提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举

.net提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举一个真实的例子:假设我们要将一对int作为字典的键,用于映射到某些数据,那么你会怎么做?当然我们可以直接使用Tuple<int, int>,但这样就可能产生大量的对象。于是我们打算使用自定义的值类型:

private struct MyKey {
    private readonly int _a;
    private readonly int _b;

    public MyKey(int a, int b) {
        _a = a;
        _b = b;
    }
}

这么做正确吗?假如你做一下测试,会发现它已经可以“正确使用”了,但实际上还是错误的。我们用它来做字典的键,会依赖GetHashCodeEquals两个方法,由于MyKey没有提供这两个方法,就会自动使用System.ValueType里的实现,这便引起了装箱。

好吧,那么我们就来实现一下:

private struct MyKey {
    // ...

    public override int GetHashCode() {
        // ...
    }

    public override bool Equals(object that) {
        // ...
    }
}

那么现在呢?可能现在您就会比较容易意识到,即便GetHashCode已经没有问题了,但是Equals方法还是会引起装箱,因为that参数依然是object类型。

怎么破?当然有办法,因为像HashSet<T>或是Dictionary<TKEy, TValue>集合其实都不会直接调用GetHashCodeEquals方法,都是通过一个IEqualityComparer<T>对象来委托调用的:

public interface IEqualityComparer<in T> {
    bool Equals(T x, T y);
    int GetHashCode(T obj);
}

假如在创建集合的时候没有提供比较器,则会使用默认的EqualityComparer<T>.Default对象,它的构造方法是这样的:

private static EqualityComparer<T> CreateComparer<T>() {
    Contract.Ensures(Contract.Result<EqualityComparer<T>>() != null);

    RuntimeType t = (RuntimeType)typeof(T);
    // Specialize type byte for perfORMance reasons 
    if (t == typeof(byte)) {
        return (EqualityComparer<T>)(object)(new ByteEqualityComparer());
    }

    // If T implements IEquatable<T> return a GenericEqualityComparer<T>
    if (typeof(IEquatable<T>).IsAssignableFrom(t)) {
        return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter(
                (RuntimeType)typeof(GenericEqualityComparer<int>), t);
    }

    // If T is a Nullable<U> where U implements IEquatable<U> return a NullableEqualityComparer<U>
    if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
        RuntimeType u = (RuntimeType)t.GetGenericArguments()[0];
        if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) {
            return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter(
                    (RuntimeType)typeof(NullableEqualityComparer<int>), u);
        }
    }

    // If T is an int-based Enum, return an EnumEqualityComparer<T>
    // See the METHOD__JIT_HELPERS__UNSAFE_ENUM_CAST and METHOD__JIT_HELPERS__UNSAFE_ENUM_CAST_LONG cases in getILIntrinsicImplementation 
    if (t.IsEnum && Enum.GetUnderlyingType(t) == typeof(int)) {
        return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter(
                (RuntimeType)typeof(EnumEqualityComparer<int>), t);
    }

    // Otherwise return an ObjectEqualityComparer<T> 
    return new ObjectEqualityComparer<T>();
}

可以看出,根据不同的情况它会使用各式不同的比较器。其中最适合我们的自然就是实现IEquatable<T>接口的分支了。于是我们可以这么做:

struct MyKey : IEquatable<MyKey> {
    // ...

    public bool Equals(MyKey that) {
        // ...
    }
}

这才是最终符合我们要求的做法。

以上所述是小编给大家介绍的.NET避免装箱的方法,希望对大家有所帮助。在此也非常感谢大家对编程网网站的支持!

--结束END--

本文标题: .NET避免装箱的方法

本文链接: https://www.lsjlt.com/news/139819.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NET避免装箱的方法
    .NET提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举...
    99+
    2024-04-02
  • react避免重复点击的方法
    这篇文章主要介绍了react避免重复点击的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。防止重复点击的思路:在请求数据一旦开始,直到本次请求结束之前,不能进行下一次点击,...
    99+
    2023-06-07
  • 避免 Golang 精度丢失的方法
    如何避免在 Golang 中发生精度丢失 在 Golang 中,由于浮点数计算的特性,有时会出现精度丢失的问题。本文将分享一些避免在Golang 中发生精度丢失的方法,并提供具体的代码...
    99+
    2024-02-25
    golang 避免 精度
  • mysql避免全屏扫描的方法
    这篇文章将为大家详细讲解有关mysql避免全屏扫描的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MYSQL避免全表扫描的方法:1、where及order ...
    99+
    2024-04-02
  • 避免WordPress安全漏洞的方法!
    标题:避免WordPress安全漏洞的方法! 随着互联网的不断发展,WordPress已经成为许多网站和博客的首选内容管理系统。然而,由于其开放性和普及程度,WordPress也成为许...
    99+
    2024-02-29
    安全设置 更新插件 备份站点 防止sql注入
  • javascript拆箱装箱和类型转换的方法
    这篇“javascript拆箱装箱和类型转换的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • Oracle表锁定的影响及避免方法
    标题:Oracle表锁定的影响及避免方法 在Oracle数据库中,表锁定是一个常见的问题,当多个用户同时访问同一个表时,可能会发生表锁定,导致其他用户无法正常访问该表,从而影响系统性能...
    99+
    2024-03-02
    oracle 表锁 影响及避免 并发访问
  • python中dict避免key不存在的方法
    这篇文章主要介绍python中dict避免key不存在的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、通过in判断key是否存在  >>> 'Thoma...
    99+
    2023-06-15
  • 避免Golang同名方法引起的歧义
    标题:如何避免Golang同名方法带来的混淆 在使用Golang编程时,我们经常会遇到同名方法的情况,特别是在不同的包中导入多个库时。同名方法可能会导致调用时的混淆和错误,为了避免这种...
    99+
    2024-02-24
    方法 golang 混淆
  • PyTorch中apex安装方式和避免踩坑
    目录1、apex2、安装步骤3、虽然就简单三行命令,但是仍有很多“坑”存在背景:这个库的安装不是像其他的一样的直接使用 pip install XXX的形式,...
    99+
    2024-04-02
  • java中ThreadLocal避免线程不安全的方法
    这篇文章主要介绍java中ThreadLocal避免线程不安全的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、说明ThreadLocal 翻译是线程本地变量的意思, ThreadLocal 就是用来创建线程的...
    99+
    2023-06-15
  • sql避免重复数据的方法有哪些
    在SQL中,避免重复数据的方法包括: 主键约束:可以在表的定义中指定一个或多个列作为主键。主键列的值必须唯一且非空,这样可以确保...
    99+
    2023-10-22
    sql
  • 避免JavaScript内存泄露的方法有哪些
    本篇内容主要讲解“避免JavaScript内存泄露的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“避免JavaScript内存泄露的方法有哪些”吧!简...
    99+
    2024-04-02
  • 如何避免go的map竞态问题的方法
    目录背景为什么会出现竞态问题如何解决竞态问题1、使用go的一些并发原语2、加读写锁(RWMutex map)3、分片加锁4、go的原生可并发map性能对比最终结论背景 在使用go语言...
    99+
    2023-02-09
    go map竞态 go 竞态
  • JavaScript RegExp 方法的陷阱:避免常见的错误
    JavaScript 的 RegExp 方法是一种强大的工具,用于处理文本数据和执行复杂的文字匹配。然而,在使用 RegExp 时,必须意识到潜在的陷阱,以避免常见的错误并编写稳健的正则表达式。 一、转义特殊字符 一个常见的错误是不转义...
    99+
    2024-03-09
    JavaScript、RegExp、正则表达式、陷阱、错误
  • Java中避免出现死锁的方法有哪些
    今天就跟大家聊聊有关Java中避免出现死锁的方法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。避免死锁的技术:加锁顺序加锁时限死锁检测加锁顺序当多个线程需要相同的一些锁,但是按...
    99+
    2023-05-31
    java 死锁 ava
  • Mysql:避免重复的插入数据方法汇总
    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我介绍4种方法: insert ignore intoon duplicate ...
    99+
    2023-09-10
    mysql sql 数据库
  • 探讨PHP float不准的原因和避免方法
    PHP(Hypertext Preprocessor)是流行的开源服务器端编程语言,常用于动态网页开发。在PHP中,float是一种数据类型,用于表示有小数部分的数字,例如3.14。然而,一些PHP开发者发现在使用float时,会出现一些不...
    99+
    2023-05-14
    float php
  • MySQL的死锁机制以及避免死锁的方法
    本篇内容主要讲解“MySQL的死锁机制以及避免死锁的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的死锁机制以及避免死锁的方法”吧! ...
    99+
    2024-04-02
  • Xp安装NET Framework失败的解决方法
    这篇文章主要讲解了“Xp安装NET Framework失败的解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Xp安装NET Framework失败的解决方法”吧!不能安装NET Fra...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作