2011-01-10 70 views
10

我在如何在真實應用程序中使用「ref」(通過引用傳遞參數)而掙扎。我想有一個簡單而主要有意義的例子。到目前爲止,我發現的所有內容都可以通過向該方法添加返回類型輕鬆地重做。 任何想法的人? 謝謝!「ref」使用的實際示例

回答

20

在我心中未來最好的例子就是交換兩個變量值的函數:

static void Swap<T>(ref T el1, ref T el2) 
{ 
    var mem = el1; 
    el1 = el2; 
    el2 = mem; 
} 

用法:

static void Main(string[] args) 
{ 
    string a = "Hello"; 
    string b = "Hi"; 

    Swap(ref a, ref b); 
    // now a = "Hi" b = "Hello" 

    // it works also with array values: 
    int[] arr = new[] { 1, 2, 3 }; 
    Swap(ref arr[0], ref arr[2]); 
    // now arr = {3,2,1} 
} 

類似這樣的功能,不能沒有ref關鍵字來完成。

4

構建在框架中的TryParse方法是典型示例。他們使用out而不是ref,但它是相同的語義,只是調用者不需要初始化值。例如:

int result; 
bool isSuccess = int.TryParse("some string", out result); 
if (isSuccess) 
{ 
    // use the result here 
} 

正如你可以看到該函數返回一個布爾值,指示操作是否成功,但實際結果返回爲out參數。

+0

是的,但我的意思是明確裁判在任何實際的例子:)我認爲這很簡單,但仍不能認爲任何例子。 – Loj 2011-01-10 11:11:29

+0

@Loj,當你想修改一個方法內的值類型時,ref很有用。 – 2011-01-10 11:13:52

+0

我知道,但你能給我一個實際的例子嗎? – Loj 2011-01-10 11:15:15

1
public static void Main(string args[]) 
{ 
    int i=0; 
    AddSomething(ref i); 
    AddSomething(ref i); 
    AddSomething(ref i); 
    AddSomething(ref i); 


    string mystr = "Hello"; 
    AddSomeText(ref mystr); 
    Console.WriteLine(mystr); 


    Console.WriteLine("i = {0}", i); 
} 


public static void AddSomeText(ref string str) 
{ 
    str+= " World!"; 
} 


public static void AddSomething(ref int ii) 
{ 
    ii+=1; 
} 
5

一個可能的例子:Interlocked.Increment。如果不通過引用傳遞變量,則無法以原子方式執行增量。

我不能說我用ref很自己,說實話 - 我通常避開需要返回多個值,而且當時out通常足夠。很多情況下,我使用看到ref,這是由於作者不瞭解在涉及引用類型時.NET如何傳遞參數。

0

我看到的最常見的地方之一是Save方法的一些框架。

原因在於,在許多情況下,如果對象被序列化到另一臺機器然後作爲新實例返回(可能有一些額外的默認值),在保存調用中維護同一對象實際上是不可能的。 。在這種情況下,您需要參考文件明確指出原始參考不再有效。

至於它的NECESSITY,我不能拿出一個需要它的例子。大部分地方都很好。

0

我認爲一個很好的例子就是蹦牀。

這是你採取遞歸函數並將其重寫爲重新調用一組值的方法的地方。原因在於,不是非常深入地進入堆棧,堆棧保持平坦,因爲您在每次調用之後都會返回而不是調用自己。

問候GJ