2013-05-17 23 views
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); 
} 

編輯:昨天有人在我的腦海裏教我這個樣子,仍記憶猶新。我不認爲他有意修改public static void Main() { // ... }中的randNum的值。不幸的是,我沒有問爲什麼,因爲我認爲這是一種新的編碼風格。

+0

你的示例不會顯示你想問什麼 - myRandNum的值沒有被使用,因此應該是DisplayRandomNumber的局部變量,而不是它的參數... –

+2

,它不會初始化該參數。它會覆蓋它。 – cgTag

+0

你問是否習慣於讓'myRandNum'傳遞給'DisplayRandomNumber'來讓它立即被一個新值覆蓋?不,這有什麼意義?也許你正在考慮使用'ref myRandNum',以便將值傳回給您調用它的'Main'方法? –

回答

1

你在做什麼是完全有效的代碼,但問題是你爲什麼要這麼做?這絕對不是常見的做法。在你的例子中,你只在方法DisplayRandomNumber中使用myRandNum。沒有理由在該方法之外擁有該變量。你有什麼會讓別人閱讀你的代碼時感到困惑,並且最初會創建一些永遠不需要使用的額外變量。

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)也是如此。

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