2017-07-27 33 views
0

我發現有兩種方法參數傳遞到函數的, - 作爲函數簽名的參數或 - 收集參數對象傳遞參數,從我的知識發揮作用

例如: 如果我有一個求和函數

public int Sum(parameters) 

我需要知道哪個是更好的傳遞參數,就是像這樣

public int Sum(int x, int y) { 
    return x+y; 
} 

還是這樣?

public int Sum(Number no) { 
    return no.X + no.Y; 
} 

public class Number { 
    public int X {get;set;} 
    public int Y {get;set;} 
} 
+1

它沒有任何區別。您顯示的第二個選項稱爲封裝,並且是用於將數據捆綁到單個對象中的一種做法。兩者的不同用例。 – nbokmans

回答

1

沒有顯着差異。第二種方法,將東西放入對象中,稱爲封裝。如果有很多參數或一組通用的參數傳遞給其他方法,封裝通常會更好。對封裝有一個非常輕微的處理影響,但它不應該以任何可感知的方式影響你。

將每個變量分開後,對於一組較小的參數以及不傾向於將這些參數傳遞給其他方法的方法會更有意義。

儘管如此,這取決於你使用什麼。正如我之前所說的那樣,封裝的影響可以忽略不計,但它可以成爲定義所有事物的類和結構的麻煩。我通常使用封裝,如果有多個變量的集合,無論如何多個方法都使用它們。然後某些方法可以忽略它們不需要的變量。

獎金事實

還有,如果你想有一個方法能夠接受的東西任意數量的參數傳遞的第三條道路。這是通過使用參數params關鍵字完成的,該參數接着提供所有提供的參數並將它們粘貼在一個數組中。在您的總和的情況下將工作如下:

public int Sum(params int[] args) //Accepts any number of int parameters 
{ 
    int result = 0; 
    for(int i = 0; i < args.Length; ++i) 
    { 
     result += args[i]; 
    } 
    return result; 
} 

然後可以這樣調用:

Sum(1, 2); 
Sum(1, 2, 3, 4, 5, 6, 7, 8); 
or even 
Sum(1); 

params趨於雖然有較少的用途,而我不能確定它的處理的影響,但如果你需要的話,它就在那裏。

0

這取決於你需要什麼以及需要多少參數傳遞給函數。但是如果你想傳遞許多參數,那麼你應該通過創建屬性來使用第二種方法。這將是容易和更有效。

+0

儘管差異可以忽略不計,但實例化新對象絕不會比僅直接傳遞變量更有效。 – nbokmans

+0

在參數很少的情況下,您是正確的。但如果你想讓它變得安全,使用模型很容易。 –

0

這真的取決於你的功能的複雜性。在這個例子中,更好的方法是第一個。因爲你不需要創建新的對象來總結它。如果你有權利或不同時間閱讀你的課程,你必須使用第二個。

0

實際上,你應該決定你的應用程序將具有什麼樣的數據結構,並在這之後使用該結構傳遞給方法。它是一個很好的規則,不會產生你不需要的結構。有時候你可能會認爲幾個參數具有邏輯關係,並總是在方法中傳遞(幾乎總是)。在這種情況下,我會推薦將它們封裝到結構

0

我想嘗試總是傾向於第一種選擇,因爲從方法簽名其實際作用,並在同一時間,你確信你在這個方法中傳遞明確只實際需要什麼。

而且,如果你看到你的方法有太多的參數,它可能會警告壞設計的信號。所以最終第二選擇可能只是一個黑客如何隱藏一些設計問題。