2016-11-27 18 views
3
static int Test(out int x, int y=4) 
{ 
    x = 6; 
    return x * y; 
} 

static void Main(string[] args) 
{ 
    int a; 
    int z = Test(out a); 
    Console.WriteLine(a + z); 
} 

輸出是30,但我不明白如何。有人可以請解釋這個C#代碼的邏輯,涉及'傳遞輸出'的概念?

在Test()方法中,參數x將6的值輸出到Main()方法中,但是如果只是輸出6,它會發送24的返回值嗎?

我不知道這一切是否有意義。我想,我正在爲這個「傳遞輸出」概念而掙扎。

請嘗試以最簡單的巴尼式樣的方式來解釋這個概念。如果技術過於複雜,它可能會讓我更加困惑。下面

+1

那麼由於'x * y'的返回表達式,它將'a'設置爲6並*返回* 24。所以'a'是6,'z'是24.你不明白哪一個?這將幫助我們幫助你。 –

+0

我猜測代碼中缺少第二個參數「測試」爲「測試(out a,??)。我猜這不會有問題,因爲它被設置爲4任何方式?只是一個想法 – JohnG

+0

Jon:我想我很困惑,因爲我認爲當它說 int z = Test(out a)它只會拉扯x的值,而不是整個返回語句值所以,我在想,z = 6,而不是24. – Jess

回答

7

評論:

static void Main(string[] args) 
{ 
    int a; 
    int z = Test(out a); // returns z as 6 * 4 = 24 and sets a = 6; 
    Console.WriteLine(a + z); // 24 + 6 = 30 
} 

out允許顯影劑通過引用,通過和更新參數值,以便它反映在呼叫者方法(在你的情況相同a

從C#產品規格:

修飾符聲明的參數是輸出參數。輸出參數 不會創建新的存儲位置。相反, 輸出參數表示與作爲函數成員或委託調用中的參數給出的變量 相同的存儲位置。 因此,輸出參數的值始終與 基礎變量相同。

refout之間的不同之處在於:

•函數成員或匿名函數 的每一個輸出參數必須在函數成員或匿名 功能之前明確賦值正常返回。

相關問題