2011-10-05 99 views
1

我經常遇到需要使用相同變量但轉換爲其他類型的情況。如何命名相同的變量但不同類型

例如:

string port; 
... 
ValidatePort(int port); 

在這裏,在ValidatePort我需要使用相同的變量port但它的類型應該是整數。爲了做到這一點,我需要先原轉換portint和使用像iPort或類似的東西臨時變量,然後把它傳遞給ValidatePort

這不是命名衝突的唯一案例,並在我使用的所有其他情況不同的方法(如果我需要一個字符串,我稱之爲variableName + String或其他一些結尾)

在C#中是否存在一個命名約定,或者命名約定類似但類型不同的變量?

回答

2

我會說明智的是通過看它來明確變量是什麼。

var time; 

你不知道代表什麼。它可以是任何一種:

int time; // number of seconds 
DateTime time; 
TimeSpan time; 

我想說

int port = 7; 
string portAsString = port.toString(); 

但你上面的代碼中,有隻調用它端口作爲這個代碼是沒有問題的完全有效的:

string port = "7"; 

int portAsInteger = int.parse(port); // If you need a temporary variable 

myMethod(int.parse(port)); // You can use variable 'port' twice as scope is different 
myMethod(portAsInteger); 

public void myMethod(int port) { .... } 
+0

謝謝。至於代碼 - 它只是許多案例的一個例子。在其中一些轉換可能需要多個行 – username

+0

絕對,即使上面的例子你想要一些錯誤檢查,以確保字符串版本的端口是一個有效的數字或int.parse將引發異常。 – NibblyPig

0

有很多符號,你可以使用:

strSomething 
somethingStr 
szSomething // Microsoft uses this in their C stuff 

它喜好的問題。最佳實踐是具有描述性變量,並以特定情況下最好的方式處理碰撞。只是不要隨處切換樣式,所以最終會變得非常混亂。

0

您可以使用前綴類廣泛的領域:

string _port; 
object _anyObject; 
bool _anyBool; 
public bool AnyBool {get{return _anyBool;}} 
void Validate(int port) 
{ 
    /.. 
} 
+0

問題不在字段與局部變量名稱中,而是在相同變量的名稱中轉換爲不同類型 – username

+0

我明白了你的觀點,但我沒有看到任何問題。如果一個字符串包含端口號的字符串表示形式,則它也可以被稱爲端口,因爲它包含相同的信息。無論如何,這是一個非常主觀的問題。 – PVitt

+0

是的,我甚至想問一下progammers :-)。如果你都是局部變量,你會如何調用變量的字符串表示?或者如果你有一個字符串,你需要以後用int來使用它? – username

2

我實在不明白的問題 - 爲什麼你就不能這樣稱呼它:

ValidatePort(int.Parse(port)); 

也就是說,我不喜歡這樣的代碼 - 它基本上使用「stringly typing」,這是一件壞事。事實上,你需要求助於鍵入前綴來消除你的名字歧義,這是一個明確的信號,表明你做錯了什麼。

也就是說:如果Port變量真的是數字,那麼該變量首先不應該是String類型的變量。儘可能使用正確的類型。

舉例來說,如果你通過一個TextBox獲取用戶的端口號,永遠不要存儲內容爲一個字符串,使用正確的類型馬上:

int port; 
if (! int.TryParse(portInput.Text, out port)) { 
    // Handle wrong user input. 
} 

(注意錯誤這對於所有的用戶輸入來說都是必不可少的。)

+0

好吧,我想我做了一個壞例子,但是如果你有一個正確類型的變量然後想用它作爲一個字符串或轉換爲其他類型?無論如何,好點+1 – username

+2

我認爲爲validateport創建一個重載會更好,以便您可以讓驗證方法驗證端口...爲什麼要調用ValidatePort,如果您要首先驗證它自己?如果驗證是由目標對象而不是源完成的,那麼它更好(特別是對於TDD)。 – NibblyPig

+0

@SLC這是另一點,儘管它在某種程度上取決於方法的確切目的。例如,一個'ValidateIP'方法可以設想接受一個'IP'對象(即格式已經保證正確)並且驗證包括確定IP是否響應ping。對於一個港口來說類似的東西。但在這兩種情況下,「驗證...」都是一個過於寬泛的名稱。 –

0

當前版本的C#不支持這個功能(另外,我不認爲未來的版本會支持這個功能)。您可以在項目中定義自己的標準以避免命名衝突。只是一個瘋狂的猜測 - 當你想要相同的名稱,但不同的類型,是否意味着兩者的價值來源是不同的。例如,從文本框讀取時,該值可能是一個字符串,並且您使用的是string port,但對於實際操作,它需要它爲integerint port)。如果是這種情況,那麼你可以使用一些前綴來指示這個值屬於哪裏。

相關問題