2012-11-15 133 views
1

看到下面的代碼:爲什麼此處不支持隱藏

public static int Main() 
{ 
    int j = 20; 
    for (int i=0; i < 10; i++) 
    { 
     int j = 30; //can't do this 
     Console.WriteLine(j + i); 
    } 
    return 0; 
} 

在C#中出現錯誤,因爲這裏沒有做變量隱藏&給出了錯誤:

名爲「局部變量j'不能在此範圍內聲明,因爲它會給「父」或「當前」範圍中已使用的「j」賦予不同的含義。

如果我們在C++中運行程序上面,它工作,在C++中它支持在這種情況下隱藏變量。

現在我的問題是,這背後的原因是什麼?
爲什麼C#開發者決定不支持隱藏在這裏。
爲什麼C++允許在這裏隱藏?

+0

爲什麼不支持?因爲在設計新語言時,這是一個不必要的要求。 –

+1

一個哲學觀點:C++總是對待程序員,就像她完全意識到自己在做什麼一樣,如果這是一種奇怪而卑鄙的行爲,它就不會妨礙你。 C#可能會採取更加仁慈 - 父母的立場,並盡力讓您擺脫危險。在C++中,編譯器是你最好的朋友,在C#中它就是語言本身。 –

回答

3

C++保留了與C兼容的東西。這在C中是允許的,所以它在C++中是允許的。

C#沒有也不需要兼容性。所以這個「隱藏」被淘汰了。

2

這樣的答案總是相同的:因爲沒有人評估,指定,設計,實施,測試,記錄,溝通,翻譯和支持該功能。在這種情況下,我會想象僅僅是因爲沒有明顯的好處(您可以使用不同的變量名稱,這樣可以避免所有模棱兩可的問題),而且由於傳統原因沒有預先存在的需要。

+0

如果它沒有任何好處,那麼爲什麼C++開發人員不升級或刪除它 –

0

其基本原理是它被認爲是可能令人困惑和不必要在同一個函數中有兩個變量。

+0

他們確實允許您在類級別隱藏高一級的變量! –

+1

@RenéWolferink:是的,這是允許的,但這些是完全不同的級別。如果你不允許這樣做,那麼在維護過程中你不能*自由地*添加新的成員屬性到類中,因爲這些屬性可能與現有的局部變量相沖突。也就是說,在設計語言時,你必須平衡成本和價值:在一個函數內部,成本是最小的,對於一個成員來說,當添加一個新的成員變量時,成本可能不得不重寫成員函數體 - 或者迫使爲新會員選擇不同的潛在*差*姓名[...] –

+0

好解釋,+1! –