转载 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。