"对象分配:LINQ 方法调用" 的含义

3
我使用JetBrains Rider编写C#代码。常常,Rider会在我的代码中划线一些操作,例如以下的list.Where LINQ方法调用:

enter image description here

当我将鼠标光标放在Where关键字上时,它会显示以下消息:

enter image description here

虽然编译不会生成任何警告,Rider本身也不会显示任何警告,但是它的含义是什么?


2
您已安装了一个插件,可能是“堆分配查看器”,它会突出显示分配对象的代码。这不是警告,也不是错误,编译器不关心这些。如果您正在编写游戏等需要尽量避免垃圾回收的应用程序,您可能希望使用此类插件。 - Lasse V. Karlsen
1
@LasseV.Karlsen 非常感谢!我刚刚停用了“堆分配查看器”,这个高亮就消失了。我一直想知道它是什么!你能把这个作为答案,我会点赞并关闭它 :) - Alexandre A.
2个回答

8
插件“Heap Allocations Viewer”是亮点所在。该亮点的作用是告知您有关执行分配、装箱、拆箱等操作的代码信息。
这些操作可能对您有意义,但通常只有在处理非常受限制的执行环境或受限制的执行配置时才会出现,例如低内存嵌入式系统或游戏编程,其中内存分配或垃圾回收是您希望尽可能避免的东西。
如果您不太关心此插件所提供的信息,则可以在Rider中安全地禁用或删除它,方法是前往“文件->设置->插件”并搜索。
编译器之所以既不发出警告也不产生错误,是因为该代码实际上是完全无害且不会出现问题的,但它具有一些副作用,您可能希望避免上述情况。

0

因为你正在实例化集合(即 .ToList()),它只是告诉你当你不需要时(即通过删除 ToList() 将其保留为 IEnumerable),将分配内存来存储新集合。


2
它说.Where正在分配一个对象,这是正确的。为什么它没有同时突出显示ToList我不知道。 - Lasse V. Karlsen
1
实际上,如果我删除.ToList(),它不会改变任何东西。它仍然会突出显示Where方法。 - Alexandre A.
不,这不是关于使用ToList将集合实现的问题。这是关于在Where(...)内部创建迭代器对象的问题。迭代器是引用类型,因此实例将分配在堆上。这正是这个高亮显示所要表达的。 - Sam Sch
1
ToList()没有被突出显示,因为它非常明确,内存将被分配。就像使用new关键字创建新列表一样。但是这个插件会突出显示IMplicit分配。 - Sam Sch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接