2012-05-22 66 views
1

這裏是我的方法:不使用方法的返回值是不是一個好習慣?

public static bool ValidateAddressCount(ref long o_addressCount) 
    { 
    // o_addressCount is modified here 
    //return true or false 
    } 

我已經達到時,我不在乎什麼方法返回時,我需要的只是o_adressCount 它是通過以下方式使用此方法一個很好的做法有些情況下:

long addressCount = 0; 
    ValidateAddressCount(ref addressCount); //without assigning the returned value to any variable 
    //use address count 

此外,任何人都可以解釋爲什麼這在.NET工程?

謝謝

+1

我認爲使用'out'修飾符而不是'ref'作爲實際上是「次要」返回值的參數是很好的做法,因爲'out',不像'ref',不需要參數在之前被初始化通過它。 –

+0

(我個人保留'out'或'ref'用於非常*特殊情況。) – 2012-05-22 07:48:13

回答

3

爲什麼它的工作原理很簡單:

long addressCount = 0; 
ValidateAddressCount(ref addressCount); 

是相同的形式作爲

long addressCount = 0; 
true; 

任何<expression> ;是一個有效的語句。

有一個有效的問題雖然這裏:

  • 爲什麼有這個語法沒有警告這是相當有可能是錯誤的?

因爲通常忽略返回值不是一個好習慣。

+1

Eric Lippert通常會說:因爲它沒有實現:) – Tigran

+1

我不認爲這個屬於那個類別('features') 。 –

+0

某些語言不允許表達式(從不介意函數調用「返回值」)顯示爲頂級語句。 – 2012-05-22 07:49:24

4

它取決於開發者。沒有硬性規定。

bool int.TryParse(string s, out int a){}

當我們傳遞一個值將被轉換成int值它返回一個bool值,並使用了可變發送轉換後的值。

有時我們需要檢查它是否已被轉換。這就是我們使用返回值的地方。

string str = "1"; 
int a = 0; 

if(int.TryParse(str, out a)) 
    MessageBox.Show("Converted"); 
else 
    MessageBox.Show("Not Converted"); 

的TryParse可以簡單地用作

bool b = int.TryParse(str, out a); 

比方說,布爾返回值是對我沒有用的。那麼爲什麼通過創建一個變量(b)來浪費內存,給它賦值而不使用它。所以我將它寫成

int.TryParse(str, out a); 
1

這工作,因爲你聲明的方法與return-value,這意味着你可以希望關於return-value照顧,但它不是必須的選項。

1

當調用方法需要傳入參數中調用方法的更改時使用ref/out。

否則,使用ref/out不是一個好的選擇。

如果要從被調用的方法返回多個值,則應該使用動態對象/元組。

+0

我不推薦在這裏使用'dynamic'。元組很好,但是.NET 4 BCL功能並沒有「命名」屬性作爲記錄或新類型的概念。 – 2012-05-22 07:54:34

0

您不必使用該方法的結果,您可以將其稱爲副作用。但是,如果可以的話,避免使用ref通常是個好主意。在你的情況下,你可以返回long?

0

不,你不需要指定返回值..但在我看來,方法validateSomething(object)應該有一個返回值,如果對象是有效的,它應該檢查返回值。

如果該方法對該對象做了某些事情,它不應該被稱爲validateSomething(object),而是validateAndChangeSomething(object) ......現在,它正在混淆它正在做什麼以及驗證的主要輸出是什麼:返回值或修改的對象..

0

雖然你寫的作品,我不認爲你的方法正在做什麼特別明顯。

自從我第一次開始編碼以來,事情已經發生了一些變化,但我相信現在它是一種很好的做法,可以讓您的代碼首先對人類可讀,然後如果您真的需要做一些意想不到的事情,則可以對它進行評論。

考慮到這一點,我會調整您的代碼,以提供一個屬性來獲取計數並修改方法,以便您不需要參數。

我知道這並沒有回答你的問題中的「使用方法並忽略返回類型」部分,但我認爲這對你當時正在做的事情是主觀的。

相關問題