C#7:什么是丢弃物以及如何使用它们

转载 http://www.devsanon.com/c/using-discards-feature-of-c-7

假设您希望调用一个具有返回值并且也接受out变量的方法,但是您不希望使用将要返回的out变量的内容。
到目前为止,我们正在创建一个虚拟变量,以后将不会使用它或将其丢弃
使用C#7,您现在可以使用“ 丢弃”

 

丢弃是局部变量,可以为它们分配一个值,并且该值无法读取(丢弃)。本质上,它们是“只写”变量。

这些丢弃没有名称,而是用_(下划线)表示。

因此,让我们来看下面的示例。
假设我们有一个整数的ConcurrentQueue,我们希望从中出队某些东西,而实际上没有使用它。

int outDummy;
if(m_myQueue.TryDequeue(out outDummy))
{
   //do something here
}
else
{
   //do something else here
}

现在,使用C#7,我们可以利用丢弃。

if(m_myQueue.TryDequeue(out _))
{
   //do something here
}
else
{
   //do something else here
}

并且已出列的值将不会也无法使用。

例如下面的代码

int x = 0;
if(m_myQueue.TryDequeue(out _))
{
   x = _;
}

将不会编译,也不会出现在IntelliSense中。

但是请记住,由于_是上下文关键字,因此如果您使用名称_声明变量,则将使用该变量。

int x = 0;
int _;
if(m_myQueue.TryDequeue(out _))
{
   x = _;
}

在上面的代码中,将从队列中删除的值将分配给变量x,因为在上述情况下,下划线用作变量而不是丢弃。

结论

C#中的丢弃功能提供了一种忽略某些局部变量的方法,这是设计时的功能。
在运行时,可能需要一个变量,并且编译器可能会为其生成一个名称。
由于_关键字是上下文关键字,因此您需要设置代码策略,以避免使用名称_声明局部变量,以减少混淆。
此功能与.NET平台的早期版本兼容,因为它不需要更改CLR。

posted on 2019-12-20 15:49  aeiiilowx  阅读(1805)  评论(0编辑  收藏  举报