2013-01-03 94 views
3

這篇文章並不是真的關於下面的代碼中的錯誤,我可以想象它有幾十種解決方法,它更主要與簡單性,優雅性和性能有關!如何傳遞一個常量字符串參考到函數

我不得不做一個非常簡單的文本解析,這樣的事情:

string ParseWord(ref string Line, ref int Pos) { 
    // Inspect Line from Pos, increment Pos and return next Word 
} 

void ParseText(string[] Lines) { 
    foreach (string Line in Lines) { 
     int Pos = 0; 
     string Word; 
     while ((Word = ParseWord(ref Line, ref Pos)) != null) { 
      // Do something with Word 
     } 
    } 
} 

遺憾的是它不工作的方式,因爲「的foreach」變量「線」是通過引用傳遞這是不允許的。如你現在可能已經注意到的,我通常是一個C++程序員。 我的想法是,傳遞字符串作爲參考會更快,因爲它不必每次都被複制。

第一個問題:這個假設在c#中仍然有效嗎?

第二個問題:我如何傳遞到「行」的引用,並仍然使用「的foreach」 - 沒有「常量」,在C#

第三個問題:我在想一些不適當的C++的方式和喜歡的事那我們會在c#中完成不同的工作嗎?

回答

11

不,這不是一個有效的假設。默認情況下,C#通過引用傳遞字符串,這意味着指針有效地在引擎蓋下傳遞。

使用refout傳遞字符串的唯一原因是被調用的方法需要修改字符串,並且該修改需要反映在調用方法中。因爲字符串是不可變的,所以「改變」目標方法中的字符串實際上會創建一個新字符串,這不會影響最初傳遞的字符串。在這種情況下,使用refout將導致調用方法中的指針更新爲指向新的已修改字符串。

如果你沒有改變字符串,那麼只需正常傳遞字符串,它非常有效。我會推薦諸如C# Concepts: Value vs Reference Types之類的文章。

+0

我明白了。字符串的行爲類似於值類型,但它們確實是參考的。應該有這個想法。它的基本原理與我一直將自己構建到自己的C++字符串類中的機制相同:-) –

4
  1. 將字符串作爲變量傳遞時,不要複製字符串,因爲它們是引用類型。你只是通過它的參考。

  2. 我不認爲您可以使用foreach循環來滿足您的需要,但您可以使用for循環。

    for (int index = 0; index < Lines.Length; index++) 
    { 
        string Line = Lines[index]; 
        int Pos = 0; 
        string Word; 
        while ((Word = ParseWord(ref Line, ref Pos)) != null) 
        { 
         // Do something with Word 
        } 
    } 
    
0

爲什麼不split每一行:

void ParseText(string[] Lines) 
{ 
    foreach (string Line in Lines) 
    { 
     foreach (string word in Line.Split(' ')) 
     { 
      // Do something with Word 
     } 
    } 
} 
+0

因爲這只是現實中的一個簡化的例子,所以解析函數會做更多的事情,並且不僅有一個。 –

相關問題