在 C# 函数中传递命名参数
介绍
命名参数是在 C# 4 中引入的,由于它们比位置参数提供的优势和可用性而变得非常流行。
在本指南中,我们将学习以下内容:
- 命名参数及其主要特征
- 使用命名参数和可选参数
为了说明这一点,我们将创建一个程序来调用一个函数,该函数使用命名参数计算常见 3D 形状(例如立方体、球体、圆柱体、金字塔和圆锥体)的体积。
向函数传递参数
首先,让我们回顾几个位置参数的例子,并分析为什么函数参数的位置很重要。
示例 1
考虑下面的代码,当提供边(边)的长度时,它计算立方体的体积。
double CalculateVolumeCube(double edge) {
return Math.Pow(edge,3);
}
double Volume = calculateVolumeCube(5);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 125.00
示例 2
让我们再举一个计算体积的例子,但是这次我们计算的是圆柱体的体积。
double CalculateVolumeCylinder(double radius, double height) {
return Math.PI*Math.Pow(radius,2)*height;
}
double Volume = calculateVolumeCylinder(2,4);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 50.27
上述函数以半径和高度为参数,返回圆柱体的体积。当我们将半径设为 2、高度设为 4 时,得到的体积为 50.27(四舍五入到小数点后两位)。这些被称为位置参数,因为参数的提供顺序很重要。
为了进一步了解,请查看以下代码:
double CalculateVolumeCylinder(double height, double radius) {
return Math.PI*Math.Pow(radius,2)*height;
}
double Volume = calculateVolumeCylinder(2,4);
Console.WriteLine($"Volume: {Volume:N2}");
您认为答案是什么?它会和成交量 50.27 一样吗?
// Answer is Volume: 100.53
您可能没有想到这个答案,但通过仔细查看函数定义,我们可以看到第一个参数是高度而不是半径。
通常,程序员会浪费大量时间来调试此类代码,因为它不会提供运行时或编译时异常。上面的函数仅包含两个参数,但想象一下我们有一个包含四个、五个或更多参数的函数的情况。在这种情况下,您必须确保每次传递参数时都仔细检查函数定义。
将命名参数传递给函数
现在我们将对上面的代码进行修改,并使用命名参数调用相同的函数。
double CalculateVolumeCylinder(double height, double radius) {
return Math.PI*Math.Pow(radius,2)*height;
}
double Volume = calculateVolumeCylinder(radius:2, height:4);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 50.27
上述函数调用给了我们正确的输出,有两件重要的事情需要考虑:
- 我们没有对函数定义做任何改变。
- 我们在调用函数时没有遵循参数的顺序。我们先提供半径,然后提供高度。
什么是命名参数?
简而言之,命名参数为您提供了将通过函数传递的参数与参数名称而不是其在参数列表中的位置相关联的选项。
// Function definition
void function(int param1, string param2, int param3) {}
// Valid function calls
function(12,param2:"Hello", 3);
function(param3:45, param1:34, param2:"Hello");
// Invalid function call
function(param3:45, param1:34, "Hello");
规则:命名参数可以和位置参数一起使用,但它们必须按顺序排列。无序命名参数只有在其后没有位置参数时才有效。
示例:计算 3D 形状的体积
让我们创建一个计算常见 3D 形状体积的函数并使用命名参数调用它。
- 我们将为形状创建一个枚举。
enum Shape {
Cone,
Cube,
Cylinder,
Pyramid,
Sphere
}
- 接下来我们创建一个函数,它采用所有参数以及我们想要的体积形状。
double CalculateVolume(double length, double width, double height, double radius, double edge, Shape shapeType)
{
double volumeResult=0.0;
switch(shapeType) {
case Shape.Cone:
volumeResult = Math.PI*Math.Pow(radius,2)*(height/3);
break;
case Shape.Cube:
volumeResult = Math.Pow(edge,3);
break;
case Shape.Cylinder:
volumeResult = Math.PI*Math.Pow(radius,2)*height;
break;
case Shape.Pyramid:
volumeResult = length*width*(height/3);
break;
case Shape.Sphere:
volumeResult = 4*Math.PI*(Math.Pow(radius,3)/3);
break;
}
return volumeResult;
}
- 然后我们将调用具有所需形状的函数并提供相关值。
// Calling the function by providing values through positional parameters.
Volume = CalculateVolume(0, 0, 0, 0, 5, Shape.Cube);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 125.00
// Below examples use named parameters
// Volume of Cube
Volume = CalculateVolume(edge:5, length:0, width:0, height:0, radius:0, shapeType:Shape.Cube);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 125.00
// Volume of Cylinder
Volume = CalculateVolume(radius:2, height:4, length:0, width:0, edge:0, shapeType:Shape.Cylinder);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 50.27
// Volume of Pyramid
Volume = CalculateVolume(length:2, width:3, height:4, radius:0, edge:0, shapeType: Shape.Pyramid);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 8.00
另一个好处是我们只需要调用一个函数来计算体积,而不必为不同的形状创建单独的函数。
与上述所有示例一样,您可以仅为所需的参数提供值,并且只要不使用位置参数,参数的顺序就无关紧要。
使用命名参数和可选参数
使用命名参数确实简化了事情,因为我们不必担心参数的顺序,而且我们可以只为想要的参数指定值。当命名参数与可选参数一起使用时,可用性和函数调用变得容易,并且得到了很大的增强。可选参数是一种说法,如果您不想为参数提供值,那么我们将采用默认值,您可以在函数调用期间跳过提供该参数的值。
此过程分为两个步骤:
- 我们必须更改函数定义以包含可选参数。下面的函数将 edge 定义为 1 ,shape 定义为 cube ,其他所有都定义为 0 。
public double CalculateVolume(double length=0, double width=0, double height=0, double radius=0, double edge=1, Shape shapeType=Shape.Cube)
- 然后,我们将调用具有所需形状的函数,并仅提供计算该形状体积的基本值。
// Taking all the defaults
Volume = CalculateVolume();
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 1.00
// Volume of Cube
Volume = CalculateVolume(edge:5, shapeType:Shape.Cube);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 125.00
// Volume of Cylinder
Volume = CalculateVolume(radius:2, height:4, shapeType:Shape.Cylinder);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 50.27
// Volume of Pyramid
Volume = CalculateVolume(length:2, width:3, height:4, shapeType: Shape.Pyramid);
Console.WriteLine($"Volume: {Volume:N2}");
// Answer is Volume: 8.00
规则:可选参数只能在列表末尾定义,位于所有必需参数或命名参数(如果有)之后。
结论
我们现在知道了命名参数是什么以及它们在函数中的用法。请记住,它们可能不适合某些场景,但大多数情况下都适合您所遵循的设计模式。总而言之,命名参数因多种原因而有用:
- 它们使您无需记住参数的顺序。
- 它们提高了代码的可读性。
- 它们与可选参数配合得很好。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~