Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
#1

Если возвращается переменная ссылочного типа, то возвращается объект или просто ссылка - C#

20.12.2012, 23:22. Просмотров 859. Ответов 11
Метки нет (Все метки)

Почему-то авторы всегда акцентируют внимание на передачу параметров в функцию, а на возврат не очень:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
 
 
class Program
{
    static void Main(string[] args)
    {
        kl o;
        
        //Вот сюда что вернётся, объект или просто ссылка на объект?
        o = kl.foo(); 
    }
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
class kl
{
    public kl() {}
    static public kl foo ()
    {
        //Вот отсюда
        return new kl ();
    }
}
спасибо кто откликнется
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 23:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Если возвращается переменная ссылочного типа, то возвращается объект или просто ссылка (C#):

Почему при присваивании значения некоторым объектам ссылочного типа копируется не ССЫЛКА, а само значение?
Здравствуйте! Пытаюсь докопаться до сути ссылочных и значимых типов данных. ...

не возвращается значение
В методе /// <summary> /// Воспроизведение звука после остановки ...

После шифрования возвращается исходный текст
надо зашифровать и расшифровать строку по алгоритму Виженера. на бумажке код...

При удалении значения из реестра возвращается ArgumentException
string WinPath = @"Software\Microsoft\Windows NT\CurrentVersion\Windows";...

При возведении в степень возвращается неправильный ответ
Дорый день. Если взять: MessageBox.Show((Math.Pow(3, 7).ToString()));...

Ссылка типа object на объект класса
using System; using System.Collections.Generic; using System.Linq; using...

11
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.12.2012, 23:56 #2
В C# ссылочные переменные хранят не объекты, а ссылки на объекты. Поэтому вернется ссылка, так как объект физически не может вернуться.
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
21.12.2012, 01:46  [ТС] #3

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
объект физически не может вернуться
а как в C# обстоят дела с конструкторами копирования?



Но не суть. Вопрос был задан не просто так. Имеем:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
class Program
{
    static void Main(string[] args)
    {
        kl o;
        o = kl.foo();
        Console.WriteLine(o.znak); 
    }
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
class kl
{
    public kl() { znak = 100;}
 
    public int znak;
    
    static public kl foo ()
    {
        return new kl ();
    }
}
теперь смотрите, код корректен, печатает 100. Но! Ведь он возвращает ссылку на объект, КОТОРОГО НЕТ! ОБъект ведь создался в функции foo и по всем законам жанра должен умереть! Разве объекты в C# не живут от { до }?

Немножко бы всё прояснилось, если бы я умел вызывать деструктор объекта, тогда бы написал деструктор и просто посмотрел вызывается деструктор или нет. Но тут как-то хитро обстоят дела с деструкторами, вроде как и заботиться о них не очень надо...

Добавлено через 1 час 18 минут
Я немного разобрался, дело в том, что скорее всего (не знаю как на самом деле), в функции foo ссылка на kl создаётся в области памяти, называемой кучей, в противоположность стеку. А ссыль на объект, соданный в куче, можно вернуть безболезненно. В этом смысле этот объект не локальный.
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.12.2012, 09:01 #4
Цитата Сообщение от kravam Посмотреть сообщение
Разве объекты в C# не живут от { до }?
Нет. Это ссылки на объекты в C# живут от { до }. А объекты живут, пока на них указывает хотя бы одна ссылка.
0
Runa
133 / 85 / 22
Регистрация: 28.08.2009
Сообщений: 363
21.12.2012, 09:26 #5
Цитата Сообщение от kravam Посмотреть сообщение
Разве объекты в C# не живут от { до }
от { до } находится область видимости объявленной переменной, а объект будет жить до тех пор, пока все ссылки не будут очищены.
за этими вещами надо следить, чтобы не происходило утечек памяти
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
21.12.2012, 10:07  [ТС] #6
Цитата Сообщение от Runa Посмотреть сообщение
за этими вещами надо следить, чтобы не происходило утечек памяти
а у меня в книге так написано:
"Одной из наиболее важных возможностей управляемого кода является сборка мусора
(garbage collection). Она гарантирует в .NET полное освобождение использованной
приложением памяти, когда она уже не нужна. "

То есть типа я следить не должен. Ну то есть незачем мне явно память освобождать- авось сама освободится.
0
Noob.net
Темная сторона .Net
579 / 476 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
21.12.2012, 12:07 #7
kravam, должны
как минимум адекватным расположением блоков,то-есть архитектурой.
(иногда даже нужно писать подобие деструкторов)

Иногда можно насильно вызывать деструктор.(а вот тут,опять забыл разработчика компилятора,писали
что деструктор и финализатор в Шарпе просто напросто перепутали. Деструктор - пометил объект на удаление.
Финализатор - удаляет обьект,а должно быть на оборот (= )

Деструкторы вызывают,а финализаторы это уже дело GC.
0
Runa
133 / 85 / 22
Регистрация: 28.08.2009
Сообщений: 363
21.12.2012, 12:21 #8
Цитата Сообщение от kravam Посмотреть сообщение
Ну то есть незачем мне явно память освобождать- авось сама освободится.
а явно никто и не просит. главное ссылки освобождать вовремя
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
21.12.2012, 14:10  [ТС] #9
Цитата Сообщение от Runa Посмотреть сообщение
главное ссылки освобождать вовремя
хм... А вот авторы книги, которую я щас читаю, похоже забили на это правило:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        public abstract class Animal
        {
            public string Name;
            public Animal() {}
            public Animal(string newName) { Name = newName;}
        }
 
        
        public class Cow : Animal
        {
            public Cow(string newName): base(newName) {}
        }
 
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
        static void Main(string[] args)
        {
            Cow myCow1 = new Cow("Deirdre");
            //куча разного кода
            myCow1.Name = "Janice";
            Console.ReadKey();
            
            //Тут по идее и должно быть то самое освобождение ссылки
            //myCow1, но его нет!
        }
я, конечно, упростил код, но уж будьте уверены, освобождение ссылки я не пропустил бы
0
Noob.net
Темная сторона .Net
579 / 476 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
21.12.2012, 23:48 #10
kravam, за блоком ссылка уже пустая.. да и конец программы,незачем.

Добавлено через 1 минуту
kravam, вы же только до конструкторов дошли,как будет GC вы заметите как что освобождается)
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
22.12.2012, 01:05  [ТС] #11
стоп-стоп-стоп. На мой взгляд никаких скидок на то что конец программы быть не должно. Это ладно я малограмотный- но не авторы же книг. Это я могу сказать "ссылка больше не нужна, ибо программа заканчивается поэтому ресурсы и так освободятся"- но не авторы же учебников!

...если в С++ память освобождать НУЖНО, то освобождать нужно БЕЗУСЛОВНО. И не дай Бог в какой о книге изучение оператор delete (освобождение памяти) вы встретите не СРАЗУ ЖЕ за оператором new (выделение памяти)- в топку такую книгу и весь разговор.

А тут вроде как нужно, но... потерпит.

Не по теме:

Этак можно и всю книгу прочесть, и с освобождение памяти не столкнуться! Так-то перед формошлёпством там осталась одна серьёзная тема- обобщения (аналоги шаблонов, как я понял в C++) и всё, считай базовый синтаксис изучен, вперёд к формошлёпству! А освобождением памяти и не пахнет!



ну ладно время терпит пока.
0
Noob.net
Темная сторона .Net
579 / 476 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
22.12.2012, 01:34 #12
kravam, здесь с памятью проблем не так много,да иногда очень неудобно,когда архитектура неграмотная.
Можно создать деструктор раз уж сильно припекло,но уверяю ничего сверхумного вы там не увидите.
(реализуем интерфейс Dispose(),но как мне кажется в книге еще не было речи о интерфейсах и их реализации)

Да объект будет жить весь блок Main,так как он главный,если бы вы перенесли кусок кода с созданием экземпляра в метод,то он будет помечен на удаление и при последующем запуске GC - будет удален.
(Здесь можно подписаться на события,что б знать когда происходит удаление объекта,но я за 2 года этого еще не делал,так как нужды не было =) )

Насильно удалять объекты почти что нельзя,а коль и можно,то не советуют ибо грех.
об этом холиварят и будут наверное)
Вы пометили на удаление или создали определенные условия - Уборщик сделал все за вас.

p.s. И да поможет вам строгая типизация !!111
1
22.12.2012, 01:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 01:34
Привет! Вот еще темы с решениями:

POST авторизация: в переменную html возвращается стартовая страница
public string zapros(string logins, string passes, string adress =...

Возвращается разное значение по модулю при одинаковых значениях
У меня происходит какая-то магия. Прошу великих колдунов помочь разобраться....

При вызове метода не возвращается значение. (вызов a.result)
using System; using System.Collections.Generic; using System.Linq; using...

Switch-case: Не могу понять почему не весь код в методе возвращается
подскажите пожалуйста... Не могу понять почему пишет что не весь код в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru