C# 7.0 引入了一个新的特性叫弃元(Discards),弃元本质上是一个变量占位符,用于忽略开发者不感兴趣的值,相等于未赋值的变量,今天小编就来聊一聊关于c语言币值最大化问题?接下来我们就一起去研究一下吧!
c语言币值最大化问题
C# 7.0 引入了一个新的特性叫弃元(Discards),弃元本质上是一个变量占位符,用于忽略开发者不感兴趣的值,相等于未赋值的变量。
方法调用时使用启元有些方法有 out 参数,但若我们实际无需使用 out 值,就可以使用弃元模式忽略该变量。
if (DateTime.TryParse("02/29/2019", out DateTime result))
{
Console.WriteLine("正确的日期格式");
}
else
{
Console.WriteLine("不正确的日期格式");
}
上面的代码中,result 实际上没有任何作用,这时候就可以用弃元模式,忽略 result 的值。
if (DateTime.TryParse("02/29/2019", out DateTime _))
{
Console.WriteLine("正确的日期格式");
}
else
{
Console.WriteLine("不正确的日期格式");
}
_ 的类型可以由编译器推断出来,可以省略。
if (DateTime.TryParse("02/29/2019", out _))
{
Console.WriteLine("正确的日期格式");
}
else
{
Console.WriteLine("不正确的日期格式");
}
如果只使用元组元素中的一部分,可以使用弃元模式。
public static (string Name, int Age, int Score) GetStudent()
{
var name = "小红";
var age = 13;
var score = 90;
return (name, age, score);
}
// 只对名称和年龄感兴趣
var (name, age, _) = student;
// 只对名称和分数感兴趣
var (name, _, score) = student;
// 只对名称感兴趣
var (name, _, _) = student;
上述 GetStudent() 返回一个包含学生姓名、年龄、成绩的元组,三个赋值语句演示了解构元组时使用弃元对象忽略不需要的元素。
类和结构通过 Deconstruct() 方法可以支持结构语法,同样可以使用弃元符号。
public class Student
{
public string Name { get; set; } = default!;
public int Age { get; set; }
public int Score { get; set; }
public void Deconstruct(out string name, out int age, out int score)
{
name = Name;
age = Age;
score = Score;
}
}
var student = new Student() { Name = "小红", Age = 13, Score = 90 };
// 使用解构语法将对象解构到变量,score 被忽略
var (name, age, _) = student;
在模式匹配中,_ 弃元可以匹配所有类型,包括 null,实际效果就是表示所有未在列表中列出的其它匹配项。如果表达式其余各项不完备,且省略弃元项,编译器会报错,提示 switch 表达式没有覆盖所有可能的值。
public string TypeMatch(Animal? animal) => animal switch
{
Cat => "发现喵咪一只",
Dog => "发现汪汪一只",
null => "毛都没发现",
_ => $"发现不知道是啥的一个东西"
};
也可以独立使用启元符号表示忽略某一个特定变量。一个比较典型使用场景是通过空合运算符确保参数不为 null 时使用。
public static void Method(string arg)
{
_ = arg ?? throw new ArgumentNullException(nameof(arg));
// ...
}
以下代码使用启元模式忽略了异步方法返回的 Task 对象,以及由此异步过程产生的任何错误。
public static async Task ExecuteAsyncMethods()
{
Console.WriteLine("即将执行");
_ = Task.Run(() =>
{
var iterations = 0;
for (int ctr = 0; ctr < int.MaxValue; ctr )
iterations ;
Console.WriteLine("Completed looping operation...");
throw new InvalidOperationException();
});
await Task.Delay(5000);
}
如果不添加弃元符号,则编译器会报错: CS4014: Because this call is not awaited, execution of the current method continues before the call is completed.Consider applying the 'await' operator to the result of the call.
,