放弃C#7.0中的功能重要性?

放弃C#7.0中的功能重要性?,c#,c#-7.0,C#,C# 7.0,在浏览新的C#7.0特性时,我坚持使用discard特性。它说: 丢弃是本地变量,您可以分配但无法读取 从…起i、 它们是“只写”局部变量 然后,一个例子如下: if (bool.TryParse("TRUE", out bool _)) 当这将是有益的时候,什么是真正的用例?我的意思是,如果我用正常的方式来定义它,比如: if (bool.TryParse("TRUE", out bool isOK)) 丢弃基本上是故意忽略与生成代码目的无关的局部变

在浏览新的C#7.0特性时,我坚持使用discard特性。它说:

丢弃是本地变量,您可以分配但无法读取 从…起i、 它们是“只写”局部变量

然后,一个例子如下:

if (bool.TryParse("TRUE", out bool _))
当这将是有益的时候,什么是真正的用例?我的意思是,如果我用正常的方式来定义它,比如:

if (bool.TryParse("TRUE", out bool isOK))

丢弃
基本上是故意忽略与生成代码目的无关的局部变量的一种方式。这就像调用一个返回值的方法,但由于您只对它执行的底层操作感兴趣,因此不会将其输出分配给调用方方法中定义的局部变量,例如:

public static void Main(string[] args)
{
    // I want to modify the records but I'm not interested
    // in knowing how many of them have been modified.
    ModifyRecords();
}

public static Int32 ModifyRecords()
{
    Int32 affectedRecords = 0;

    for (Int32 i = 0; i < s_Records.Count; ++i)
    {
        Record r = s_Records[i];

        if (String.IsNullOrWhiteSpace(r.Name))
        {
            r.Name = "Default Name";
            ++affectedRecords;
        }
    }

    return affectedRecords;
}
从阅读上述代码中我可以看到,
discards
与最新版本的
C#
中引入的其他范例相比,似乎具有更高的威力


对于
Matlab
程序员来说,
discards
远远不是一个新概念,因为编程语言在很长、很长、很长的时间(可能是从一开始,但我不能确定)就实现了它们。官方文件将其描述如下(链接):

从以下方面请求所有三种可能的输出:

当前工作区现在包含来自fileparts的三个变量:helpPath、name和ext。在本例中,变量很小。但是,有些函数返回的结果占用了更多内存。如果您不需要这些变量,它们会浪费系统上的空间

使用波浪号(~)忽略第一个输出:


唯一的区别是,在
Matlab
中,丢弃输出的内部计算通常被跳过,因为输出参数是灵活的,您可以知道调用者请求了多少以及其中哪一个。

丢弃基本上是故意忽略局部变量的一种方式,这些变量与生成代码的目的无关。这就像调用一个返回值的方法,但由于您只对它执行的底层操作感兴趣,因此不会将其输出分配给调用方方法中定义的局部变量,例如:

public static void Main(string[] args)
{
    // I want to modify the records but I'm not interested
    // in knowing how many of them have been modified.
    ModifyRecords();
}

public static Int32 ModifyRecords()
{
    Int32 affectedRecords = 0;

    for (Int32 i = 0; i < s_Records.Count; ++i)
    {
        Record r = s_Records[i];

        if (String.IsNullOrWhiteSpace(r.Name))
        {
            r.Name = "Default Name";
            ++affectedRecords;
        }
    }

    return affectedRecords;
}
从阅读上述代码中我可以看到,
discards
与最新版本的
C#
中引入的其他范例相比,似乎具有更高的威力


对于
Matlab
程序员来说,
discards
远远不是一个新概念,因为编程语言在很长、很长、很长的时间(可能是从一开始,但我不能确定)就实现了它们。官方文件将其描述如下(链接):

从以下方面请求所有三种可能的输出:

当前工作区现在包含来自fileparts的三个变量:helpPath、name和ext。在本例中,变量很小。但是,有些函数返回的结果占用了更多内存。如果您不需要这些变量,它们会浪费系统上的空间

使用波浪号(~)忽略第一个输出:


唯一的区别是,在
Matlab
中,丢弃输出的内部计算通常会被跳过,因为输出参数是灵活的,您可以知道调用者请求了多少和哪一个参数。

我多次按照以下思路编写代码:

TextBox.BackColor=int32.TryParse(TextBox.Text,out int32)?颜色。浅绿色:颜色。粉红色;
请注意,这将是更大数据集合的一部分,而不是一个独立的东西。这样做的目的是对他们输入的数据的每个字段的有效性提供即时反馈

我使用浅绿色和粉红色,而不是绿色和红色,后者的颜色足够深,文本变得有点难以阅读,而浅色版本的含义仍然非常明显


(在某些情况下,我还有一个.Yellow颜色来标记无效但也不是完全无效的内容。假设解析器将接受分数,并且字段当前包含“2 1”。这可能是“2 1/2”的一部分,因此它不是垃圾,但也不是有效的。)

很多次我都是按照以下思路编写代码的:

TextBox.BackColor=int32.TryParse(TextBox.Text,out int32)?颜色。浅绿色:颜色。粉红色;
请注意,这将是更大数据集合的一部分,而不是一个独立的东西。这样做的目的是对他们输入的数据的每个字段的有效性提供即时反馈

我使用浅绿色和粉红色,而不是绿色和红色,后者的颜色足够深,文本变得有点难以阅读,而浅色版本的含义仍然非常明显


(在某些情况下,我还有一个颜色.Yellow来标记无效但也不是完全无效的内容。假设解析器将接受分数,并且字段当前包含“2 1”。这可能是“2 1/2”的一部分,因此它不是垃圾,但也不是有效的。)

我看到丢弃主要用于返回
Task
但您不想等待
输出的方法

因此,在下面的示例中,我们不想等待
SomeOtherMethod()
的输出,因此我们可以这样做:

//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
Example();
//myClass.cs
public async Task Example()=>wait SomeOtherMethod()
//example.cs
示例();
除此之外,这将生成以下警告:

CS4014由于未等待此调用,因此 当前方法在调用完成之前继续。考虑 将“等待”运算符应用于呼叫结果

为了减轻此警告并确保编译器知道我们正在做什么,您可以使用discard:

//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
_ = Example();
//myClass.cs
public async Task Example()=>wait SomeOtherMethod()
//example.cs
_ =
//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
Example();
//myClass.cs
public async Task<bool> Example() => await SomeOtherMethod()

// example.cs
_ = Example();
string result = shape switch
{
     Rectangule r => $"Rectangule",
     Circle c => $"Circle",
     _ => "Unknown Shape"
};