初始化/ as参数中的变量
本文关键字:变量 参数 as 初始化 | 更新日期: 2023-09-27 18:13:55
在/中初始化局部变量作为参数是常见的做法吗?例如:
Random random = new Random();
void DisplayRandomNumber(int myRandNum) {
myRandNum = random.Next(10);
Console.WriteLine(myRandNum);
}
public static void Main() {
int randNum = 0;
DisplayRandomNumber(randNum);
}
编辑:昨天有人这样教我的,至今记忆犹新。我不认为他有意修改public static void Main() { // ... }
中randNum
的值。不幸的是,我没有问为什么,因为我认为这是一种新的编码风格。
你所做的是完全有效的代码,但问题是你为什么要这样做?这也绝对不是常见的做法。在你的例子中,你只在DisplayRandomNumber方法中使用myRandNum。没有理由将变量置于该方法之外。你所拥有的将会让其他阅读你的代码的人感到非常困惑,并且最初会创建一些永远不需要使用的额外变量。
在c#中,方法签名可以指定参数的默认值:
public void MyMethod(int myParameter = 5){ }
但是,形参的默认值必须是编译时常量。当参数的默认值比编译时常数更复杂时,通常会看到这样的代码:
public void MyMethod(int? myParameter = null)
{
myParameter = myParameter ?? myRandom.Next(10);
}
我们用null
表示"no parameter specified",然后用null coalescing重新赋值参数。
这段代码是有效的,因为参数类型是一个结构体,在。net术语中称为值类型(即int
)。如果它是一个类或引用类型,它将不会返回到Main。
另一个问题是它不是很清楚。c#有一个ref
形参,它清楚地表明你正在处理一个引用参数
:
Random random = new Random();
void GetNextRandomNumber(ref int random_number)
{
random_number = random.Next(10);
}
public static void Main() {
int randNum = 0;
GetNextRandomNumber(ref randNum);
Console.WriteLine(randNum);
}
无论实参是结构体还是类,这都有效。还有一个out
关键字,用于各种DateTime.TryParse(string s, out DateTime date)
和Dictionary<K, V>.TryGetValue(K key, out V value);
。ref
和out
之间的最大区别是编译器强制在方法中设置out
参数,即使它是泛型类型的default(T)
。