在/作为参数初始化变量

时间:2013-05-17 00:54:59

标签: c# coding-style initialization

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

Random random = new Random();

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

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

编辑:昨天有人像这样教我,在我脑海里还是很新鲜。我认为他无意修改randNumpublic static void Main() { // ... }的值。不幸的是,我没有问为什么,因为我认为这是一种新的编码方式。

3 个答案:

答案 0 :(得分:1)

您所做的是完全有效的代码,但问题是您为什么要这样做?这绝对不是常见的做法。在您的示例中,您只在DisplayRandomNumber方法中使用myRandNum。没有理由将变量置于该方法之外。你所拥有的将会非常混淆阅读代码的其他人,并且最初会创建永远不需要使用的额外变量。

答案 1 :(得分:1)

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

public void MyMethod(int myParameter = 5){ }

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

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

我们使用null来表示“未指定参数”,然后使用null coalescing重新分配参数。

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

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