NET问答:什么场景下应该选择 struct 而不是 class ?

咨询区

  • Esteban Araya

MSDN 上说当你需要一个轻量级对象时应该选择 struct,说的含含糊糊,真的不知道有哪些场景下优先选择 struct 而不是 class。

可能有些人已经忘了。

  • struct 可以有方法。

  • struct 不能被继承。

我非常明白 struct 和 class 在技术上的不同,就是把不准什么场景下该使用它????????????...

回答区

  • Yashwanth Chowdary Kata

使用 class 的情况

  • 如果同一性非常重要,毕竟 struct 传递时是完整copy的。

  • 如果需要占用很大内存。

  • 如果你有继承/多态的需求。

使用 struct 的情况

  • 如果你想使用基元类型 (int,long,byte ...)

  • 如果你想精细的优化内存

  • 如果 P/Invoke 必须传值类型。

  • 如果你想减少 GC 的负载

  • 如果没有 继承/多态 的需求。


  • Andrei Rînea

申明一下,我没看过其他人的答案,我觉得最重要的方面是:当我需要一个无需 唯一标识 的类型时用 struct,比如说:3D 点。


public struct ThreeDimensionalPoint
{public readonly int X, Y, Z;public ThreeDimensionalPoint(int x, int y, int z){this.X = x;this.Y = y;this.Z = z;}public override string ToString(){return "(X=" + this.X + ", Y=" + this.Y + ", Z=" + this.Z + ")";}public override int GetHashCode(){return (this.X + 2) ^ (this.Y + 2) ^ (this.Z + 2);}public override bool Equals(object obj){if (!(obj is ThreeDimensionalPoint))return false;ThreeDimensionalPoint other = (ThreeDimensionalPoint)obj;return this == other;}public static bool operator ==(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2){return p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z;}public static bool operator !=(ThreeDimensionalPoint p1, ThreeDimensionalPoint p2){return !(p1 == p2);}
}

值得注意的是,当用值类型替代引用类型后,当心 按值copy 的问题。


  • Eduardas Šlutas

这是一个老话题了,我就提供一下 class 和 struct 的 benchmark 吧,有如下两个 .cs 文件。


public class TestClass
{public long ID { get; set; }public string FirstName { get; set; }public string LastName { get; set; }
}public struct TestStruct
{public long ID { get; set; }public string FirstName { get; set; }public string LastName { get; set; }
}

运行 benchmark:

  • Create 1 TestClass

  • Create 1 TestStruct

  • Create 100 TestClass

  • Create 100 TestStruct

  • Create 10000 TestClass

  • Create 10000 TestStruct

输出结果:


BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18362
Intel Core i5-8250U CPU 1.60GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.101
[Host]     : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT  [AttachedDebugger]
DefaultJob : .NET Core 3.1.1 (CoreCLR 4.700.19.60701, CoreFX 4.700.19.60801), X64 RyuJIT|         Method |           Mean |         Error |        StdDev |     Ratio | RatioSD | Rank |    Gen 0 | Gen 1 | Gen 2 | Allocated |
|--------------- |---------------:|--------------:|--------------:|----------:|--------:|-----:|---------:|------:|------:|----------:||      UseStruct |      0.0000 ns |     0.0000 ns |     0.0000 ns |     0.000 |    0.00 |    1 |        - |     - |     - |         - |
|       UseClass |      8.1425 ns |     0.1873 ns |     0.1839 ns |     1.000 |    0.00 |    2 |   0.0127 |     - |     - |      40 B |
|   Use100Struct |     36.9359 ns |     0.4026 ns |     0.3569 ns |     4.548 |    0.12 |    3 |        - |     - |     - |         - |
|    Use100Class |    759.3495 ns |    14.8029 ns |    17.0471 ns |    93.144 |    3.24 |    4 |   1.2751 |     - |     - |    4000 B |
| Use10000Struct |  3,002.1976 ns |    25.4853 ns |    22.5920 ns |   369.664 |    8.91 |    5 |        - |     - |     - |         - |
|  Use10000Class | 76,529.2751 ns | 1,570.9425 ns | 2,667.5795 ns | 9,440.182 |  346.76 |    6 | 127.4414 |     - |     - |  400000 B |

点评区

确实这是一个老话题了,我一般在讲究内存优化的场景下,优先考虑 struct,毕竟 struct 没有 object 的 同步块索引 + 方法表指针,在 64bit 机器上,光这块开销就是 16byte,如果再放大千万倍那可不得了????????????,其他的场景怎么搞都行。

原文链接:https://stackoverflow.com/questions/85553/when-should-i-use-a-struct-instead-of-a-class

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php类的的属性值,PHP面向对象之旅:类的属性

在PHP5中,在属性定义可以不设置初值,或者赋予以下红色类型的初值。PHP中简单类型有8种,分别是:数值类型boolean 布尔类型integer 整型float 浮点型,也称为 double 双精度浮点型string 字符串复合类型array 数组object …

淘宝快捷通道——百汇家园

百汇家园 是一个便捷的通道,喜欢网购的同学,都可以在百汇家园了解到所需要的相关 产品的信息。我们的商品分为15个大类,包含了淘宝所有的商品,满足你的购物 需求。 百汇家园通过与淘宝的网店合作,将淘宝优质商品&#…

家里在一二线城市有很多套房是什么体验?答案太颠覆!

作者:匿名来源:知乎(图片:网络)“家里在一二线城市有很多套房是怎么的一种体验?”这是知乎上一个浏览超600万的话题。其中一个答案非常颠覆,获得高赞。作者的观点是否正确见仁见智,但…

希尔排序听起来有点难,其实很简单

前言直接插入排序当待排序数据的顺序和期望排序结果相反时,排序效率是最差的;上次聊到的折半插入排序只是减少有序列表的比较次数,而对于整体数据遍历次数还是没有得到优化;接下来要说的希尔排序就是针对整体数据进行优化&#xf…

中小企业信息化,“轻”和“快”是方向

中小企业有着自身的特殊性,在观念改变和专业服务产品到位后,中小企业轻装上阵,实现高效办公、快捷管理、快速发展的愿望并不遥远。 时间刚过早上七点,韩信吃完早餐,便坐到沙发上看起了新闻,查看手机日历也是…

php 下拉表单,PHP表单和填充下拉列表问题

我正尝试连接到MySQL并将数据填充到Dropdown。这是我的代码。某些原因下拉列表没有被填充。请建议。这是代码。$mysqli_connection new mysqli($db_host, $db_username, $db_password, $db_database);if (isset($_POST[Submit_1])) {require submit.php;require validate.php;…

等我敲完这行代码,就和你离婚!

工作是高端大气上档次,工资是低调奢华接地气!我们叫做“程序猿”,也叫“攻城狮”!但是往往城还没攻下来,我们的头发就先掉下来!我们最喜欢听的一句话就是☟段子一“等我敲完这行代码,就和你离婚…

凭什么还不自信!!

前几天挺gbx说有个11级的小同学,已经在某OJ上刷过1000多道题,倍受打击!一度感叹为什么我没有早点起步,甚至一度认为ACM是给那些初高中做过NOI的同学准备的。 今天突发神经查了查神牛HH 的简历,真的很震撼: …

yml php,使用 docker-compose.yml 快速搭建php开发环境

1、新建一个文件夹,里面创建文件 docker-compose.yml2、编辑 docker-compose.yml 文件,保存以下内容# docker volume#docker run -d --name dbdata -h dbdata -v /wwwroot:/home/vagrant/wwwroot -v /Downloads:/home/vagrant/Downloads -v /wwwroot/web…

深夜,学妹遇到了数据分析师生涯的第一个疑问

大家好,我是大鹏,目前是一名数据分析师。自从上次学妹深夜给我发微信,询问数据分析师招聘要求和需要掌握的技能,已经过去2个月了。直到昨天,我再次收到了学妹的召唤:当天深夜 学妹深夜求助,定是…

你知道WPF与WinForms的区别吗?

介绍WPF的缩写指微软的Windows Presentation Foundation,而WinForms是Windows Forms Applications的简单组合。这两个都是微软的Windows应用程序图形用户界面,开发人员可以使用它们来开发Windows桌面应用程序。本文重点介绍两种开发Windows桌面应用程序的…

一起谈.NET技术,发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)

发布NGuestBook的动机说明 大约在半年前,我在博客上发表了一个系列文章:《基于.NET平台的分层架构实战》。当时在讲解过程中用到了一个叫NGuestBook的案例,在那以后,有很多朋友留言或发E-mail希望能得到NGuestBook的完整源代…

jodconverter水印java,OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)

java OpenOffice officetopdf最近项目需要实现下载Office文档时自动转成PDF文档,以下代码支持2003及2007版的Word,PPT,Excel转换,并支持自定义添加水印、页眉、页脚实现需要事先安装OpenOffice(我这里安装的是OpenOffice 4)OpenOffice 下载: …

当Java、C++、Python等编程语言都变成妹子。。。

试想一下,当Java、C、Python、Ruby、PHP、C#、JS等编程语言变成了动漫人物会是怎样的一幅场景呢?下面就一起看看在日本作家渡辺将人的笔下,各种编程语言都是哪类“美女”的吧!Java犹如宫泽贤治的《不畏风雨》中出现的、性格木讷的…

对MySQL 进行深入学习是非常必要的

MySQL 在互联网行业非常流行,腾讯,阿里等互联网巨头都在深入使用MySQL, 我在腾讯时也使用MySQL,我在微信群里经常听到大家对MySQL 的意见也很大。在传统企业环境下使用最多的数据库产品是Oracle,SQL Server等企业级数据库&#xf…

windows下的NTP服务

近期的项目用到NTP,在使用的时候碰到一些问题,特记录如下: (1)NTP Server部分若要将内部时间服务器配置为与外部时间源同步,请按照下列步骤操作: 1. 将服务器类型更改为 NTP。为此&#xff0…

php判断是否是关联数组,php 关联数组判断是否为空

先看一个关联数组判断为空的代码,然后我们详细讲讲关于数据空的处理。$array array(0);if(empty($array)){echo "我空了 ";}else{echo "我不空啊 ";}$array[array]我是数组;print_r($array);$array[array1]我是数组1;print_r($array);unset($a…

4月 .NET 线上 Meetup,快来报名

点击蓝字关注我们.NET 6 preview 2 在3月11日已经发布,.NET 6 将是 .NET Core 3.1 之后的第一个 LTS 版本,也是微软开启全平台统一一个 .NET 计划以来的第一个 LTS 版本,意义不可谓不大,那么 .NET 5/6 又会带来哪些新特性呢&#…

机器学习资料第3版,助你继续成长!

之前分享的两份机器学习资料得到很多人的支持,因此小编决定再分享一份机器学习的资料。前两份资料传送门:【资源】机器学习资料包来袭机器学习资料升级版来了!!!现在,再来看看有什么新资料吧。How to Build…

php框架快速入门,php-laravel4.0框架 简单快速入门

前提必须已经安装好了laravel4.0版本。写入权限:  安装完 Laravel ,你还需要为web服务器设置 app/storage目录的写入权限。目录结构:  安装完框架后,你需要熟悉一下该项目的目录结构。app 文件夹包含了一些如views &#xff0…