Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Объекты передаются по ссылке! Или не совсем??!
#1
Знали ли вы что :
Код:
private class TestClass
        {
            public int Test;
        }

        private static void Main()
        {
            TestClass t = new TestClass();
[color=Red]            t.Test = 15[/color]
            Make(t);
            Console.WriteLine(t.Test);
            Console.ReadLine();
        }

        private static void Make(TestClass t)
        {
[color=red]            ++t.Test;[/color]
        }

Выведет на консоль: 16.

НО
Код:
private class TestClass
        {
            public int Test;
        }

        private static void Main()
        {
            TestClass t = new TestClass();
[color=red]            t.Test = 15[/color]
            Make(t);
            Console.WriteLine(t.Test);
            Console.ReadLine();
        }

        private static void Make(TestClass t)
        {
[COLOR="Red"]            t=new TestClass();
            t.Test = 16;[/COLOR]
        }

Выведет на консоль: 15.

Это справедливо как для шарпа так и для java. Короче кто шарит, может объяснить почему так? Ведь по идее все объекты передаются по ссылке а следовательно по тому адресу на который ссылается ссылка мы по идее вполне можем записать новый объект. А оказалось что это не так.
Ответ
#2
Да бред это, что объекты передаются по ссылке. Всегда возмущали подобные фразы (в том числе от преподавателей в универе много лет назад). Просто объект - это изначально ссылка. Ссылка передается по значению, т. е. внутри метода у нас копия ссылки на тот же объект. Объект тот же, но ссылка другая. Адреса у ссылок разные, значения одинаковые.
hLaPEx, Evermore, hAuthD, L2on, ...
Ответ
#3
А я то думал зачем в шарпе при передаче в параметр объекта можно прописать ref.
Ответ
#4
УДАЛЕНО.
Показалось ява, а тут C++.
Ответ
#5
Hett Написал:УДАЛЕНО.
Показалось ява, а тут C++.
тут c#^^
Ответ
#6
Почему вместо
t = new TestClass();
этот код
t.Test =new TestClass();
?
Ответ
#7
Потому что второй вариант не копипастил а писал сразу в редакторе комментариев и про*бался
Ответ
#8
Проверил, всё так~
[Изображение: GgMFf9l.png]
Ответ
#9
По умолчанию в метод передается копия ссылки и во втором случае вы вешаете новый обьект именно на копию, оригинал остается неизменным. В случае с примитивами создается копия самого примитива (актуально как минимум для java). Рекомендую покурить операторы ref, out.
Ответ
#10
А еще можно сделать объект статиком и все будет ок. Но это уже на любителя.
А еще можно вернуть измененный объект обратно.
[Изображение: 4e38c909fcd08c5fcdf363b54a62.png]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Объекты на территории РБ, Украины и Подмосковья. Dеmon 27 5,772 10-23-2012, 05:18 PM
Последний пост: Dеmon
  я наверное совсем кривой e2e4r51 18 3,451 06-01-2011, 10:29 AM
Последний пост: Cheezle

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)