【问题标题】:Can't modify an object from function using `new` keyword [duplicate]无法使用`new`关键字从函数修改对象[重复]
【发布时间】:2018-02-02 18:04:46
【问题描述】:

我正在尝试执行以下代码,但不明白为什么 person.Name = "anton"; 行不起作用?程序的输出是“colin”。

class Person
{
    public string Name;
}

class MainClass
{
    public static void MyMethod(Person person)
    {
        person.Name = "colin";
        person = new Person();
        person.Name = "anton";
    }

    public static void Main()
    {
        Person person = new Person();
        person.Name = "felix";
        MyMethod(person);
        Console.WriteLine(person.Name);
    }
}

【问题讨论】:

    标签: c# .net windows


    【解决方案1】:

    想想发生的事件的顺序:

    • Main 创建一个 Person
    • Main 将对 Person 的引用传递给 MyMethod
    • MyMethodMainPerson 进行了修改。这是修改#1
    • MyMethod 替换Main 到对象的引用与对新Person 对象的引用。此时,Mainperson 变量和MyMethodperson 参数引用了两个不同的对象。
    • MyMethod 修改其Person 对象(修改#2),并返回
    • Main 的人显示了第一次修改的结果,在对象被MyMethod 调用new 之前替换。

    如果您希望允许在 MyMethod 内重新分配给 person,您需要通过引用传递变量。

    【讨论】:

      【解决方案2】:

      除非您在 C# 中指定 refout 关键字 function parameters are passed by value,即使该类型是引用类型。

      “按值传递”是指创建原始变量的副本,对于引用类型来说,这意味着引用的副本(不是实际的对象,对象没有被复制,只是“变量和参数都指向”。

      这意味着MyMethod 内的person 参数是Main 方法中person 变量的副本,因此为该参数分配新实例不会影响原始变量。

      所以在函数内更改实例的属性影响原始实例,直到参数开始指向不同的对象(在 MyMethod 内实例化一个新的 Person )。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 2013-10-24
        • 2017-02-26
        相关资源
        最近更新 更多