Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

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

20.12.2012, 23:22. Показов 1872. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2012, 23:22
Ответы с готовыми решениями:

Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

Не возвращается булевая переменная
Здравствуйте такую проблему наблюдаю код в This документ такой Option Explicit Dim WithEvents WebBrowser As WebBrowser ...

Не возвращается объект
#include<iostream> using namespace std; class MyString { private: char *str; int length;

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

Не по теме:

Цитата Сообщение от 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
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.12.2012, 09:01
Цитата Сообщение от kravam Посмотреть сообщение
Разве объекты в C# не живут от { до }?
Нет. Это ссылки на объекты в C# живут от { до }. А объекты живут, пока на них указывает хотя бы одна ссылка.
0
 Аватар для Runa
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
21.12.2012, 09:26
Цитата Сообщение от kravam Посмотреть сообщение
Разве объекты в C# не живут от { до }
от { до } находится область видимости объявленной переменной, а объект будет жить до тех пор, пока все ссылки не будут очищены.
за этими вещами надо следить, чтобы не происходило утечек памяти
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
21.12.2012, 10:07  [ТС]
Цитата Сообщение от Runa Посмотреть сообщение
за этими вещами надо следить, чтобы не происходило утечек памяти
а у меня в книге так написано:
"Одной из наиболее важных возможностей управляемого кода является сборка мусора
(garbage collection). Она гарантирует в .NET полное освобождение использованной
приложением памяти, когда она уже не нужна. "

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

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

Деструкторы вызывают,а финализаторы это уже дело GC.
0
 Аватар для Runa
134 / 87 / 22
Регистрация: 28.08.2009
Сообщений: 363
21.12.2012, 12:21
Цитата Сообщение от kravam Посмотреть сообщение
Ну то есть незачем мне явно память освобождать- авось сама освободится.
а явно никто и не просит. главное ссылки освобождать вовремя
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
21.12.2012, 14:10  [ТС]
Цитата Сообщение от 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
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
21.12.2012, 23:48
kravam, за блоком ссылка уже пустая.. да и конец программы,незачем.

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

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

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

Не по теме:

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



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

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

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

p.s. И да поможет вам строгая типизация !!111
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2012, 01:34
Помогаю со студенческими работами здесь

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

Движение ImageView. Объект возвращается на исходную позицию
Здравствуйте! Пытаюсь двигать ImageView, оно движется, условие срабатывает, но постоянно возвращается на исходное место и моргает при...

Если объект добавлять в 2 контейнера, то в них будет ссылка или новый объект?
Есть объект - obj. Последовательно добавляю его в два контейнера container1.add(obj); container2.add(obj); Если я удалю...

Возвращается пустой POST если русская строка
Если в пост передавать русские символы то возращается string(0) - пустая строка, если латинские то всё норм. Как победить это?

Получить значение из Json строки, если она возвращается массивом
Как можно получить id из json, если эта строка возвращает массив(я так понял, что это массив)? Вот возвращаемая строка:...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru