【问题标题】:Updating Object inside/outside Method更新对象内部/外部方法
【发布时间】:2009-05-13 19:06:10
【问题描述】:

好的,

也许这是 c# 的设计,或者我的做法是错误的。

请看我下面的代码。我制作了它,您可以将其复制并粘贴到控制台应用程序中并运行它以查看我在说什么。

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main()
        {
            var o1 = new oObject
                             {
                                 Name = "Before Method"
                             };

            var o1b = new oObjectBad
            {
                Name = "Before Method"
            };

            Console.WriteLine("Object Bad 1 Before: " + o1b.Name);
            oObjectBad o2b = GetNewObjectBad(o1b);
            Console.WriteLine("Object Bad 1 After: " + o1b.Name);
            Console.WriteLine("Object Bad 2 After: " + o2b.Name);


            Console.WriteLine(string.Empty);

            Console.WriteLine("Object 1 Before: " + o1.Name);
            oObject o2 = GetNewObject(o1);
            Console.WriteLine("Object 1 After: " + o1.Name);
            Console.WriteLine("Object 2 After: " + o2.Name);

            Console.ReadLine();
        }

        public static oObject GetNewObject(oObject o)
        {
            oObject newObject = new oObject(o);

            newObject.Name = "Changed in Method";
            return newObject;
        }

        public static oObjectBad GetNewObjectBad(oObjectBad o)
        {
            o.Name = "Changed in Method";
            return o;
        }
    }

    class oObject
    {
        public oObject()
        {
        }

        public oObject(oObject o)
        {
            Name = o.Name;
        }

        public string Name { get; set; }
    }

    class oObjectBad
    {
        public string Name { get; set; }
    }
}

现在,这是我不明白的。

当我将对象传递给方法并更新对象属性“名称”时。然后它更新方法之外的原始对象。

解决这个问题的方法是创建另一个对象(如代码所示)以创建对象的克隆,然后更新克隆,然后返回克隆。

所以问题是这样的: 有没有更简单的方法来传递一个对象并更新该对象的属性,这样我就可以在不更新原始对象的情况下拥有这样的东西。

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main()
        {
            var o1 = new oObject
                             {
                                 Name = "Before Method"
                             };



            Console.WriteLine("Object 1 Before: " + o1.Name);
            oObject o2 = GetNewObjectBad(o1);
            Console.WriteLine("Object 1 After: " + o1.Name);
            Console.WriteLine("Object 2 (New Object) After: " + o2.Name);

            Console.ReadLine();
        }

        public static oObject GetNewObjectBad(oObject o)
        {
            o.Name = "Changed in Method";
            return o;
        }
    }

    class oObject
    {
        public string Name { get; set; }
    }
}

如果这令人困惑,请告诉我,我会看看是否可以更好地解释。

编辑: 我这样做的原因是我需要在数据库中克隆一个对象,并且克隆的对象需要更改几个属性。然后我将使用原始对象的 ID 和新对象的 ID 进行其他数据处理。

谢谢!

【问题讨论】:

    标签: c# object


    【解决方案1】:

    我会花一些时间研究按引用传递与按值传递,然后看看为什么需要在本地上下文中更改名称而不是在原始上下文中。我怀疑你可能有一些设计缺陷。我会重新审视这个问题,看看你是否可以用不同的方法开发一个解决方案。

    【讨论】:

    • 好的,我同意。我将做一些研究,看看我是否可以用不同的方式来解决这个问题。我需要处理一个克隆的对象,然后再处理其他数据。我认为我走错了路,我会研究更可靠的原则。
    【解决方案2】:

    在 .NET 中,所有对象都是引用类型,除非它们来自 ValueType。通常,您无论如何都不想直接修改对象的实例变量。如果您将实例变量设为私有,然后添加操作私有数据的方法,您将拥有更多的控制权。

    http://msdn.microsoft.com/en-us/library/s1ax56ch.aspxValueType 的死者名单。

    【讨论】:

      【解决方案3】:

      为什么要更改方法中的对象而不让数据反映在调用方法中?您可以做的一件事是实现代码来跟踪更改,并为类提供一个方法,该方法返回带有原始数据的原始对象。

      正如其他人所说,这是一个值类型与引用类型的问题。如果您真的不想更改对象,可以将类型更改为结构。不过,我并不是说这就是答案,我不知道你的班级结构,无法就此事发表明智的意见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多