(一)命名参数
有了命名实参,你将不再需要将实参的顺序与所调用方法的形参列表中的形参顺序相匹配。 每个形参的实参都可按形参名称进行指定。
例如,对于如下函数定义:
public void Test(int i, float f, bool b) { }
可以通过以函数定义的顺序按位置发送实参:
Test(1, 1.2f, true);
Test(f: 3.3f, i: 5, b: false); // 指定命名参数
Test(b: false, f: 3.4f, i: 3); // 任意顺序传参
(二)可选参数
方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。
每个可选形参都有一个默认值作为其定义的一部分。如果没有为该形参发送实参,则使用默认值。 默认值必须是以下类型的表达式之一:
常量表达式;
new ValType()
形式的表达式,其中 ValType
是值类型,例如 enum 或 struct;
default(ValType)
形式的表达式,其中 ValType
是值类型。
public void Test2(int i , bool b = true, string s = "123") { }
可选参数定义于参数列表的末尾和必需参数之后。 如果调用方为一系列可选形参中的任意一个形参提供了实参,则它必须为前面的所有可选形参提供实参。 实参列表中不支持使用逗号分隔的间隔。例如,在以下代码中,使用一个必选形参和两个可选形参定义实例方法。
Test2(1); // 正确,等价于 Test2(1, true, "123");
Test2(1, , "234"); // 错误
Test2(1, true, "234"); // 正确
(三)结合使用
如果知道第三个形参的名称,则可以使用命名实参来完成此任务:
Test2(1, s: "234");
(四)代码示例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// 有了命名参数,我们将不用匹配参数在所调用方法中的顺序
// 每个参数可以按照参数名字进行指定
Test(1, 1.2f, true);
Test(f: 3.3f, i: 5, b: false);
Test(b: false, f: 3.4f, i: 3);
// 命名参数可以配合可选参数使用,让我们做到跳过其中的默认参数直接赋值后面的默认参数
Test2(1, true, "234");
Test2(1, s: "234");
}
public void Test(int i, float f, bool b) { }
public void Test2(int i , bool b = true, string s = "123") { }
}
注意:
代码示例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test1
{
public void TestTest() { }
}
public class Lesson3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
dynamic dyn = 1;
object obj = 2;
dyn += 2;
print(obj.GetType()); // System.Int32
print(dyn.GetType()); // System.Int32
print(dyn); // 3
object t = new Test1();
dynamic tmp = t; // 直接赋值
tmp.TestTest(); // 只要能够确定对象内容,直接调用其方法即可
}
}