初始化/ as参数中的变量



在/中初始化局部变量作为参数是常见的做法吗?例如:

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);refout之间的最大区别是编译器强制在方法中设置out参数,即使它是泛型类型的default(T)

最新更新