我在如何在真實應用程序中使用「ref」(通過引用傳遞參數)而掙扎。我想有一個簡單而主要有意義的例子。到目前爲止,我發現的所有內容都可以通過向該方法添加返回類型輕鬆地重做。 任何想法的人? 謝謝!「ref」使用的實際示例
10
A
回答
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
參數。
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
相關問題
- 1. Vim,實際使用示例
- 2. Boost :: MPL的實際用法示例?
- 3. Javascript關閉的實際用法/示例
- 4. JMX或NetMX實際示例
- 5. BufferManager的實際用例
- 6. 實際的例子使用Hibernate FlushMode.ALWAYS
- 7. 實際示例中的內存泄漏
- 8. 使用LLVM Alias和IFunc功能的任何實際示例?
- 9. oracle顯式遊標使用的實際生活示例
- 10. C++中樹數據結構的實際使用示例?
- 11. LockSupport&AbstractQueuedSynchronizer使用的任何實際示例?
- 12. Laravel路由實際使用案例
- 13. WCF消息合同實際示例
- 14. 實際例子NFA
- 15. 何時使用Paxos(真實的實際用例)?
- 16. 接口的使用,實際的和真實世界的例子
- 17. 實際使用
- 18. 用例建模的實際好處
- 19. Spring集成的實際用例?
- 20. 事件冒泡和捕獲的常見實際應用示例?
- 21. Android獲取片段的實際實例
- 22. System.Data.DataRowView實際值的DropDownList實例
- 23. 在C++中的RNG實際成本與REF
- 24. 使用用於Clojure的新some-的實際例子>宏
- 25. 使用調用約定fastcall的任何實際用例?
- 26. C#實際使用
- 27. 實際使用IBOutletColletion
- 28. 實際使用dynamic_cast?
- 29. 在實例變量上實際使用延遲初始化
- 30. NSApp隱藏了什麼:實際上是否使用NSWindow實例?
是的,但我的意思是明確裁判在任何實際的例子:)我認爲這很簡單,但仍不能認爲任何例子。 – Loj 2011-01-10 11:11:29
@Loj,當你想修改一個方法內的值類型時,ref很有用。 – 2011-01-10 11:13:52
我知道,但你能給我一個實際的例子嗎? – Loj 2011-01-10 11:15:15