0

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

Random random = new Random();

void DisplayRandomNumber(int myRandNum) {
   myRandNum = random.Next(10);
   Console.WriteLine(myRandNum);
}

public static void Main() {
   int randNum = 0;
   DisplayRandomNumber(randNum);
}

编辑:昨天有人这样教我,我仍然记忆犹新。我认为他无意修改randNumin的值public static void Main() { // ... }。不幸的是,我没有问为什么,因为我认为这是一种新的编码风格。

4

3 回答 3

1

在 C# 中,方法签名可以指定参数的默认值:

public void MyMethod(int myParameter = 5){ }

但是,参数的默认值必须是编译时常量。当参数的默认值比编译时常量更复杂时,通常会看到如下代码:

public void MyMethod(int? myParameter = null)
{
     myParameter = myParameter ?? myRandom.Next(10);
}

我们使用null来表示“没有指定参数”,然后使用空合并重新分配参数。

更多关于命名和可选参数的信息

于 2013-05-17T03:55:54.707 回答
1

您正在做的是完全有效的代码,但问题是您为什么要这样做?这也绝对不是常见的做法。在您的示例中,您仅在方法 DisplayRandomNumber 中使用 myRandNum。没有理由在该方法之外使用变量。您所拥有的内容会让其他阅读您的代码的人感到非常困惑,并且最初会创建永远不需要使用的额外变量。

于 2013-05-17T01:00:47.850 回答
0

此代码是有效的,因为参数类型是一个结构,在 .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)针对泛型类型的。

于 2013-05-17T03:27:45.843 回答