通常的做法是在/作为参数初始化局部变量吗? 例如:
Random random = new Random();
void DisplayRandomNumber(int myRandNum) {
myRandNum = random.Next(10);
Console.WriteLine(myRandNum);
}
public static void Main() {
int randNum = 0;
DisplayRandomNumber(randNum);
}
编辑:昨天有人像这样教我,在我脑海里还是很新鲜。我认为他无意修改randNum
中public static void Main() { // ... }
的值。不幸的是,我没有问为什么,因为我认为这是一种新的编码方式。
答案 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);
。 ref
和out
之间的最大区别在于编译器强制在方法中设置out
参数,即使它是default(T)
的泛型类型