草庐IT

c# - Microsoft 集合指南 : Confused about several parts

coder 2024-06-03 原文

我正在查看 Microsoft 的 Guidelines for Collections我发现有几个部分很难理解:

X 不要使用 ArrayListList<T>在公共(public) API 中。这是否意味着我应该避免返回 List<T>完全一样,或者我可以将其作为 IEnumerable 返回/IList , 但没有明确表示为 List<T>

✓ 请尽可能使用最不专业的类型作为参数类型。大多数以集合为参数的成员使用 IEnumerable<T>接口(interface)。在看到 ReSharper 提示“可能对 IEnumerable 进行多重枚举”之后,我认为采用(并返回)ICollection<T> 是一个更好的主意。当我期待一个预先计算的、有限的对象集合(即不是惰性流)时。不是这样吗?

✓ 请使用 Collection<T>Collection<T> 的子类对于表示读/写集合的属性或返回值。为什么不使用 ICollection<T> ?我认为接口(interface)优于具体类。

最佳答案

这些准则的存在是为了促进设计方法,这些方法在接受什么作为参数和返回什么作为返回类型方面具有灵 active 。

如果您返回 List<T>从一个方法中,该方法永远不会返回任何不是 List<T> 的东西.这在某些情况下可能没问题,但在其他情况下则不然。例如,考虑一个返回在特定时间段内登录的用户集合的方法。如果此方法仅返回 List<T> ,它必须一次获取并返回所有用户,因为这些是 List 的语义:方法返回后,您将获得所有项目的总计数。这可能是一个问题,如果用户数量是几万 - 获取所有记录可能需要很长时间,并且它们可能会占用大量内存。

如果此方法返回 IEnumerable<T> ,没有计数或一次获取所有项目的 promise - 调用者可以遍历项目集合但不能一次性获取所有项目。这允许被调用的方法返回一个对象(实现 IEnumerable<T> ),该对象以多个小批量收集数据并按要求逐个返回。

此外,许多不同的集合类型实现了 IEnumerable<T> ,所以这个方法的另一个实现可能实际上决定返回一个列表实例,转换为 IEnumerable<T> .调用方法不会知道或关心,因为它所期望的只是一个 IEnumerable<T>。 .这不是硬编码列表类型的情况 - 它不能交换为其他任何东西,因为它已经尽可能具体。

一般来说,通用集合接口(interface)将是任何方法最灵活的输入参数/返回类型——一个接口(interface)将允许您以多种方式实现它、模拟它等,因此您有很多灵活地控制传递或返回的内容。界面也没有(必然)有可能随着产品的发展而变得不便的语义限制。

至于第一个建议,ArrayList是一种可怕的类型,在 .NET 2.0 之后永远不应该使用它,因为泛型类型在所有可能的方面都要好得多。

关于c# - Microsoft 集合指南 : Confused about several parts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882084/

有关c# - Microsoft 集合指南 : Confused about several parts的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  5. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  6. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  7. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  8. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  9. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  10. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

随机推荐