C# - 为什么在通过方法之后不会更改此变量

Osc*_*r W 2 c# methods

所以我显然对编程很新,但我想弄清楚为什么这不起作用

我正在尝试使用字符串myname,并将Mr.添加到它的开头.我知道我可以做到这一点,myname = "Mr. " + myname但我正在努力了解如何使用方法来改变变量的值.那么,为什么这不会改变呢?

public class Program
    {
        public static void Main(string[] args)
        {
            string myname = "harry";
            Console.WriteLine(myname); //output is harry

            namechanger(myname); //this should modify harry to Mr. Harry
            Console.WriteLine(myname); //output is still harry?
        }

        static string namechanger(string name) 
        {
            name = "Mr. " + name;
            return name;
        }

    }
Run Code Online (Sandbox Code Playgroud)

Kne*_*tic 6

字符串是不可变的,并且通过值传递.每次创建字符串时,都不会更改.因此,与类的实例不同,您不能通过将字符串交给修改它的方法来修改字符串.

在这种情况下,由于您return修改了String in namechanger,所以您需要做的就是确保分配myname给该方法的结果; 像这样

myname = namechanger(myname);
Run Code Online (Sandbox Code Playgroud)

原始类型(int,float,long等),以这种方式工作,因为这样做struct实例-所以一定要寻找那些在未来,如果您不确定为什么当您将它传递到方法的结构的价值没有改变.

  • 所有类型都以这种方式工作,而不只是原始类型...... (2认同)
  • @Knetic,这不是通过值传递并通过引用传递."ref"或"out"是让某些东西通过引用传递的东西.如果你不包括它,那就是值传递.请参阅:https://blogs.msdn.microsoft.com/csharpfaq/2004/03/11/how-are-parameters-passed-in-c-are-they-passed-by-reference-or-by-value/ (2认同)