首页 > 解决方案 > c#中的discards有什么好处

问题描述

我刚刚在 c# 中遇到了丢弃,我想知道一些我觉得Microsoft Docs on Discards没有很好地解释的事情。

  1. 使用独立的丢弃是否只是为了可读性?如果我有一个返回结果的函数(不一定需要),比如说 a boolor int,但也做了一些其他逻辑,那么当你可以简单地在赋值之外调用函数时,为什么要使用丢弃?

例如:

TcpClient client = new TcpClient();
NetworkStream nc = tcpClient.GetStream();
// what's the difference between
nc.Read(someBuffer, 0, someSize);
// and the discard
_ = nc.Read(someBuffer, 0, someSize);

他们不都只是丢弃结果吗?这看起来对我来说纯粹是一种偏好。

  1. 在微软关于丢弃的文档中,它不会减少内存分配是因为它们等同于未分配的变量吗?
  2. 如果有的话,丢弃的性能优势是什么,它只是一种旨在提高可读性的风格吗?

编辑:

更清楚地说:我只是好奇使用丢弃是否有任何潜在的性能优势。我提供的 Microsoft doc 链接指出“只有一个丢弃变量,并且该变量甚至可能不会被分配存储,丢弃可以减少内存分配”,在这种用例中(模式匹配,调用没有 out 的方法,元组解构和/或独立)是否减少了内存分配?

标签: c#

解决方案


一般来说,在这句话中使用discard是没有意义的:

_ = nc.Read(someBuffer, 0, someSize);

因为您可以忽略返回值。我从来没有人使用过独立的丢弃,但是文档涵盖了一些有用的特定情况。

当您必须提供变量但不需要它时使用丢弃。
正如所提供的文档页面中已经介绍的那样,丢弃对于以下内容非常有用:

模式匹配

switch (stream)
{
    case MemoryStream _:
    case FileStream _:
        ProcessStream(stream);
        break;
}

没有参数的方法

如果要检查是否可以将字符串解析为整数,但不关心结果:

if (int.TryParse(str, out _))
{
    // do something
}

否则,您将不得不声明一个您不会使用并且会消耗一些内存的 out 变量。

解构

(_, _, area) = city.GetCityInformation(cityName);

如果没有丢弃,您会将结果解构为 3 个不同的变量,并且只使用其中一个。使用丢弃,代码具有更清晰的意图,并且在内存管理方面更无效。


推荐阅读