C# 中的输出参数和丢弃
介绍
在本指南中,我们将仔细研究 C# 7.0 中引入的两个功能。这些功能从根本上改变了开发人员的工作方式和应用程序的开发方式。当方法需要返回多个值时,out参数会派上用场。此参数通过引用传递,基本上将形式参数转换为必须是变量的参数的别名。这与ref关键字非常相似,但主要区别在于后者需要事先初始化。丢弃基本上是应用程序代码中未使用的临时变量或虚拟变量。丢弃的主要目的是提供可重用的变量,从而减少内存分配并提高可读性和可维护性。
输出参数
在 C# 7.0 之前,有一个旧版本的out关键字。我们将重点介绍新版本中引入的改进版本。
规则:
- out参数无需声明和初始化即可传递。
- out参数可以在方法参数列表中使用var类型。
- 在函数定义和调用中,输出参数不必使用相同的名称。
我们将重点介绍一款小型应用,该应用可计算我们是否满足特定客户的 SLA。我们将采用两个参数。一个称为totalHours,另一个称为availableHours。
没有输出参数的版本看起来像这样。
using System;
namespace Pluralsight
{
public class OuterDiscards
{
public static void Main()
{
Console.WriteLine("Please enter the totalHours: ");
double totalHours = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Please enter the availableHours: ");
double availableHours = Convert.ToDouble(Console.ReadLine());
Console.WriteLine(SLA(totalHours, availableHours));
Console.ReadKey();
}
public static string SLA(double a, double b) {
double result = Math.Round(((b / a) * 100), 2);
string sla = $"Total hours: {a}, Available hours: {b} => SLA:{result} %";
return sla;
}
}
}
执行代码时会产生以下输出。
Please enter the totalHours:
1000
Please enter the availableHours:
999
Total hours: 1000, Available hours: 999 => SLA:99.9 %
利用我们的变量无需声明或初始化即可传递的事实,我们可以修改代码如下。
using System;
namespace Pluralsight
{
public class OuterDiscards
{
public static void Main()
{
Console.WriteLine("Please enter the totalHours: ");
double totalHours = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Please enter the availableHours: ");
double availableHours = Convert.ToDouble(Console.ReadLine());
Console.WriteLine(SLA(totalHours, availableHours, out double result, out string sla));
Console.ReadKey();
}
public static string SLA(double a, double b, out double result, out string sla) {
result = Math.Round(((b / a) * 100), 2);
sla = $"Total hours: {a}, Available hours: {b} => SLA:{result} %";
return sla;
}
}
}
注意函数调用和定义是如何通过out double 结果 out string sla进行扩展的。此技术称为out参数的内联声明。该方法需要在返回之前为out参数赋值。它们也可以基于out参数进行重载。Async和Iterator方法没有out参数。
如果需要,我们可以对out变量和var类型使用隐式类型声明,该类型在本地方法体中的作用域与out参数相同。因此,我们可以这样修改函数调用和声明:out double result, out string sla。var的类型在赋值时动态识别。
丢弃
丢弃变量使用下划线符号:_。
可以想象到的最简单的丢弃示例如下所示。它被称为解构。
using System;
namespace Pluralsight
{
public class OuterDiscards
{
public static void Main()
{
var tuple = (1,2,3,4,5,6,7,8);
(_, var first, _, var second, _,_,_,_ ) = tuple;
Console.WriteLine($"first: {first}, second: {second}");
Console.ReadKey();
}
}
}
我们的任务是根据元组的第一个和第三个索引创建一个名为first的变量和另一个名为second 的变量。
执行脚本将得到以下输出。
first: 2, second: 4
弃牌的真正威力在于外部变量的组合。
using System;
namespace Pluralsight
{
public class OuterDiscards
{
public static void prs(string dtstr)
{
if (DateTime.TryParse(dtstr, out _))
{
Console.WriteLine("Date is valid");
}
else
{
Console.WriteLine("Date is not valid");
}
}
public static void Main()
{
prs("02/29/2019");
Console.ReadKey();
}
}
}
在此示例中,我们创建了一个函数,该函数以字符串为参数并尝试根据DateTime对象对其进行解析。我们使用out _作为第二个参数的原因是我们不想记录输出,我们只关心指定的字符串是否可以解析为DateTime对象。
结论
在本指南中,我们探讨了 C# 7.0 版中添加的两个新功能。这些小应用程序演示了如何使用它们并使您的代码更易于维护和更灵活。我希望本指南对您有所帮助,并感谢您阅读它。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~