C# 如何将常量字符串引用传递给函数

C# 如何将常量字符串引用传递给函数,c#,string,performance,constants,ref,C#,String,Performance,Constants,Ref,这篇文章并不是关于下面代码中的bug,我可以自己想象几十种解决它的方法,它主要与简单、优雅和性能有关 我必须做一个非常简单的文本解析器,类似于: 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

这篇文章并不是关于下面代码中的bug,我可以自己想象几十种解决它的方法,它主要与简单、优雅和性能有关

我必须做一个非常简单的文本解析器,类似于:

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”变量“Line”是通过引用传递的,这是不允许的

正如你可能已经注意到的,我现在通常是C++程序员。 我的想法是,将字符串作为引用传递会更快,因为它不必每次都被复制

第一个问题:这个假设在c#中仍然有效吗

第二个问题:我如何传递对该“行”的引用并仍然使用“foreach”-c中没有“const”#


第三个问题:我是不是在思考C++中的一些不恰当的C++方式,我们会做一些不同的事情?

< P>不,这不是一个有效的假设。默认情况下,C#通过引用传递字符串,这意味着指针可以有效地传递到引擎盖下

使用
ref
out
传递字符串的唯一原因是被调用的方法需要修改字符串,并且该修改需要反映在调用方法中。因为字符串是不可变的,“更改”目标方法中的字符串实际上会创建一个新字符串,这不会影响最初传递的字符串。在这种情况下,使用
ref
out
将导致调用方法中的指针更新为指向新的修改字符串

如果您不更改字符串,那么只需正常传递字符串,这是非常有效的。我会推荐这样的文章

  • 当字符串作为变量传递时,不会复制字符串,因为它们是引用类型。你只是在传递它的引用

  • 我不认为您可以使用
    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
        }
    }
    
    for(int index=0;index
  • 为什么不仅仅是每一行:

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

    啊,我明白了。字符串的行为就像值类型,但它们实际上是引用。我应该考虑一下。它基本上和我曾经把自己建进我自己的C++字符串类:-----因为这只是一个煮沸的例子,在现实中,解析函数做了更多的事情,而且也不止一个。