2010-10-11 83 views
1

我只是想知道,我想我不能有同名變量:問題在C#局部變量的作用域

int Test; 
public void A(int Test) 
{ 

} 

爲什麼這樣做編譯?我知道我可以使用這個關鍵字,但在我看來很奇怪,因爲該方法在類的範圍內,它允許我用相同的名稱聲明變量。

+1

請參閱「範圍vs聲明空間與使用期限」:http://blogs.msdn.com/b/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope- vs-declaration-space-vs-lifetime.aspx – LukeH 2010-10-11 15:09:39

回答

11

int Test;不是變量,而是字段。局部變量可以與字段具有相同的名稱。如果您引用名稱,則局部變量具有首選項。如果你想引用字段,那麼使用this.

+0

就是這樣,謝謝。我不知道字段可以與局部變量具有相同的名稱。 – Ptr 2010-10-11 15:03:19

1

你可以和它會影子你的班級中的測試領域。 基本上,只有在當前範圍內已經對相同名稱的變量進行了decalared時,纔會重新聲明變量。但在你的情況下,它有類範圍和其他方法範圍。

1

它會允許你這樣做,因爲你沒有訪問過這個代碼示例中的Test變量。您必須在A方法中引用類變量Test as this.Test來消除歧義。一般來說,你不應該這樣做,這是不好的風格。推薦的編碼風格是成員變量應該用_來開頭,那麼現在你的代碼將改爲:

int _Test; 
public void A(int Test) 
{ 
} 
+0

微軟自己的源代碼經常使用這種風格。 – Jeff 2010-10-11 15:02:36

4

從C#語言規範,3.7節 - 斯科普斯

範圍名稱是 的程序文本的區域,其中 可能指的是實體 所聲明的名稱,而不包含 的名稱限定。作用域可以 嵌套,並且內部範圍可以從 重新聲明外部範圍的名稱的含義(這並不, 但是,除去由第3.3節所施加的限制 該嵌套 塊中它不可能聲明一個 本地變量,其名稱與 局部變量在封閉塊中相同)。 從外部範圍的名稱然後 據說被隱藏在內部 作用域覆蓋的 程序文本的區域,並且只有通過限定名稱才能訪問外部名稱是 。

1

你可以。成員變量(方法外部)必須被稱爲this.Test在方法本身的範圍內。在該方法內部,Test將引用該參數。

1

您可以在很多情況下隱藏更廣泛的範圍(但不像您在其他一些C風格語言中那樣寬鬆),並且肯定可以具有相同名稱的字段和參數(或字段和本地)。首先,如果我們不允許範圍隱藏更廣的範圍,那麼通常使用的詞很快就會被更廣泛的範圍所禁止。另一方面,我們可以在更廣泛的範圍內引入某些東西,甚至可以從另一個程序集中引入一些東西。假設你沒有int Test;以上。現在想象一下,這是一個派生自另一個階級的階級,並且有人增加了public int Test;。要處理這件事意味着什麼。

避免這種名稱衝突肯定是一個好主意,並且約定可以有所幫助(本地人的小寫啓動,非私人成員的大寫啓動,私人的下劃線啓動具有抱怨非如果你暫時讓私人成員公開進行實驗並忘記將其設置回去,那麼將遵循-CLR的下劃線),但是徹底禁止它是行不通的。

8

這些變量有不同的名字!

第一個變量的名字真MyType.Test,而第二個變量(函數放慢參數)只是Test

+0

在C#中,只有靜態變量按類型命名。 (與C++不同,實例變量可能需要用基類名限定,但C#使用'base'關鍵字而不是實際的類型名) – 2010-10-11 15:21:26

1

scope, declaration space, and lifetime之間的C#開發人員經常會出現混淆。

C#語言特別允許您描述的情況下使方法主體與方法主體有不同的聲明空間。這允許的情況下,例如:

class Foo 
{ 
    private string name; 
    public Foo(string name) 
    { 
     this.name = name; 
    } 
} 

其中用於參數name選擇一個更好的名字會要求開發商聘請命名約定(其中一些做反正)。術語scope,是指程序文本的區域,您可以通過它的非限定名稱引用構造。 重要的是要認識到範圍可能重疊 - 這裏就是這種情況。