Обновление объекта внутри / снаружи метода - PullRequest
1 голос
/ 13 мая 2009

Хорошо,

Может быть, это из-за с # или, может быть, я поступаю неправильно.

Пожалуйста, посмотрите на код, который я имею ниже. Я сделал это, где вы можете скопировать и вставить его в консольное приложение и запустить его, чтобы увидеть, о чем я говорю.

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; }
    }
}

Если это сбивает с толку, дайте мне знать, и я посмотрю, смогу ли я объяснить лучше.

EDIT: Причина, по которой я это делаю, заключается в том, что мне нужно клонировать объект в базе данных, а клонированному объекту необходимо изменить несколько свойств. Затем я буду использовать идентификатор исходного объекта и нового объекта для другой обработки данных.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 мая 2009

Я бы потратил некоторое время на изучение передачи по ссылке или передачи по значению, а затем посмотрел, почему нужно менять имя в локальном контексте, а не в оригинале. У меня есть подозрение, что у вас могут быть некоторые недостатки в дизайне. Я хотел бы вернуться к проблеме и посмотреть, сможете ли вы найти решение с другим подходом.

1 голос
/ 13 мая 2009

Почему вы хотите изменить объект в методе, чтобы эти данные не отображались в вызывающем методе? Одна вещь, которую вы могли бы сделать, это реализовать код для отслеживания изменений и дать классу метод, возвращающий исходный объект с исходными данными.

Как уже говорили другие, это проблема типа значения по сравнению с типом ссылки. Если вы действительно хотите, чтобы объект не менялся, вы можете изменить свой тип на struct. Я не говорю, что это ответ, хотя я не знаю структуру вашего класса, чтобы составить обоснованное мнение по этому вопросу.

0 голосов
/ 13 мая 2009

В .NET все объекты являются ссылочными типами, если они не происходят от ValueType. Как правило, вы все равно не хотите изменять переменные экземпляра объекта напрямую. У вас гораздо больше контроля, если вы сделаете переменные экземпляра закрытыми, а затем добавите методы для манипулирования закрытыми данными.

http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx Список потомков ValueType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...