【问题标题】:C# - Why is this variable not being changed after being put through a method [duplicate]C# - 为什么这个变量在通过方法后没有被改变[重复]
【发布时间】:2017-02-07 04:25:55
【问题描述】:

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

我正在尝试获取字符串 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;
        }

    }

【问题讨论】:

    标签: c# methods


    【解决方案1】:

    Strings are immutablepassed by value。每次创建字符串时,它都不会更改。因此,与类的实例不同,您不能通过将字符串交给修改它的方法来修改它。

    在这种情况下,由于您return 修改了namechanger 中的字符串,因此您需要做的就是确保将myname 分配给该方法的结果;像这样

    myname = namechanger(myname);
    

    原始类型(intfloatlong 等)以这种方式工作,struct 实例也是如此——因此,如果您不确定为什么将结构传递给方法时,结构的值不会改变。

    【讨论】:

    • 所有类型都以这种方式工作,而不仅仅是原始类型...
    • 也许从迂腐的意义上说,但是使用classstruct 调用方法传递的值截然不同——一个是指针,一个是整个结构。 “按值传递”和“按引用传递”是用于区分行为差异的术语。
    • 对字符串的引用是按值传递的,真的。它是对同一个字符串的引用,不像传递,比如说,一个 DateTime,在函数内部它是一个不同的 DateTime 实例。
    • @Knetic,这不是按值传递和按引用传递。 “ref”或“out”是使某些东西通过引用传递的原因。如果你不包括它,它就是按值传递。见:blogs.msdn.microsoft.com/csharpfaq/2004/03/11/…
    • @Knetic - 我一点也不困惑。这里有两个相互竞争的概念——引用/值类型与通过引用/值传递。它们是两个不同的概念。问题围绕着按值传递——它与引用/值类型无关。阿奎那说所有类型都以这种方式工作是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-06-20
    • 2021-10-31
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多