Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345

Переменные в C#

31.07.2013, 10:46. Показов 1255. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что такое переменные в C#?
Вот для примера этот кусочек программы где определяется переменная btn типа Button.
Дальше почему то для нее выделяется память. Тогда получается это не просто переменная, а указатель?
А если указатель, то тогда почему перед именем переменной нет звездочки ( Button *btn; ) как в C++?

C#
1
2
Button btn;
btn = new Button();
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2013, 10:46
Ответы с готовыми решениями:

Переменные экземпляра, класса, константы и переменные readonly
Как эту задачу записать в C#? Переменные экземпляра, класса, константы и переменные readonly: – Ф.И.О., – должность, – базовый...

Внутриблочные переменные не могут иметь те же имена, что и переменные из блока верхнего уровня
program matr; uses crt; const n = 5; m = 5; var

Почему в локальном классе доступны финальные переменные или переменные инициализированные при объявлении
Добрый вечер. Объясните пожалуйста, почему в локальном классе могут использоваться только финальные переменные или переменные которые были...

13
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2013, 10:49
Цитата Сообщение от BigLow Посмотреть сообщение
Тогда получается это не просто переменная, а указатель?
Ссылка. Ссылка может ссылаться на что-то, а может и не ссылаться.
Первая строчка — это просто объявление ссылки. Типа "она мне потом понадобится".
Вторая строчка — присвоение ссылке значения, в данном случае — адреса свежесозданной кнопки.

Цитата Сообщение от BigLow Посмотреть сообщение
А если указатель, то тогда почему перед именем переменной нет звездочки ( Button *btn; ) как в C++?
Потому что это не С++?
1
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
31.07.2013, 11:01  [ТС]
kolorotur, спасибо за объяснение
А как освобождается выделенная память?

Цитата Сообщение от kolorotur Посмотреть сообщение
Ссылка может ссылаться на что-то, а может и не ссылаться.
это больше для указателей подходит
0
24 / 24 / 1
Регистрация: 16.05.2012
Сообщений: 285
31.07.2013, 11:19
Цитата Сообщение от BigLow Посмотреть сообщение
А как освобождается выделенная память?
В идеале с с# ты вообще не должен об этом задумываться, философия не та
0
2 / 2 / 1
Регистрация: 25.05.2013
Сообщений: 54
31.07.2013, 11:26
Все сделают за тебя) и память освободят и почистят что надо)
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
31.07.2013, 12:11
BigLow, память высвобождается когда на объект не указывает ни одна ссылка, и отсуствуют обработчики у событий данного объекта.

допустим твой пример:
C#
1
2
3
4
5
void SomeMethod()
{
Button btn;
btn = new Button();
}
ссылка на объект существует до закрывающей фигурной скобки. не факт что место высвободится сразу, но высвободится..

Не по теме:

кривое какое слово, но черт с ним)


Далее, чуток модернизируем:
C#
1
2
3
4
5
6
void SomeMethod()
{
Button btn;
btn = new Button();
this.Controls.Add(btn);
}
Ссылка на объект осталась в коллекции контролов текущего объекта. при достижении фигурной скобки исчезнет толко ссылка btn, но на сам объект будет указывать ещё одна, память не высвободится.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2013, 13:18
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
и отсуствуют обработчики у событий данного объекта.
Точнее будет сказать, что объект жив, пока его методы являются обработчиками событий других объектов.

Цитата Сообщение от BigLow Посмотреть сообщение
это больше для указателей подходит
Подходит, но это не указатель.
Ссылки в .NET — это больше дескрипторы, чем указатели.
0
2 / 2 / 0
Регистрация: 07.02.2013
Сообщений: 29
31.07.2013, 13:32
используй метод Dispose() для обэкта
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
31.07.2013, 13:54
Цитата Сообщение от Constantin_ukr Посмотреть сообщение
используй метод Dispose() для обэкта

Не по теме:

Вот этим предложением вы только человека запутаете.

Вы бы хоть расписали это нормально. А так это лучше бы и не писать.




Метод Dispose() будет только у классов (объектов) реализующих интерфейс IDisposable.
А реализовать этот интерфейс лучше у классов, которые жрут память и она сама не освободится. Например работают с файловой системой.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
31.07.2013, 14:14
Цитата Сообщение от kolorotur Посмотреть сообщение
Точнее будет сказать, что объект жив, пока его методы являются обработчиками событий других объектов.
да тут скорее и ваше утверждение, и моё исходит из утверждения
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
память высвобождается когда на объект не указывает ни одна ссылка
если объект обрабатывает события других объектов, или другие объекты обрабатывают события текущего, то и ссылки остаются.

Добавлено через 34 секунды
по крайней мере я не могу представить такую ситуацию когда обработчик есть, а ссылки нет)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2013, 14:15
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
другие объекты обрабатывают события текущего
В этом случае — только если обработчик события отрабатывает в данный момент (см. sender).
А так — не влияет.
1
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
31.07.2013, 17:38
хм... другими словами:

C#
1
2
3
4
5
6
7
8
9
10
void Some()
{
Obj o=new Obj();
o.OnRename+=this.Rename;
}
 
void Rename(object sender, string message)
{
this.Name=message;
}
- бесполезный код, если при создании объекта он сам себя куда-нибудь не заносит...
мне почему-то казалось что где-то глубже останется какая-то конструкция, которая должна будет оповещать что метод текущего объекта вызывется при срабатывании события другого. Если задуматься то действительно логичнее сделать наоборот (в смысле в событии указать необходимый метод))
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2013, 19:19
Spectral-Owl, событие — это же урезанный в правах делегат, то есть ссылка на группу методов. Вот в событии и хранятся ссылки на все объекты, подписанные на это событие.
В целом получается, что объект не будет удален сборщиком, если методы этого объекта подписаны на события других объектов, так как ссылки на него будут "записаны" в их событиях.

Пример:
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
class Program
{
    static void Main()
    {
        Foo foo = new Foo();
        foo.FooEvent += FooEventHandler;
        foo = null;
 
        GC.Collect();
        GC.WaitForPendingFinalizers();
 
        Console.ReadLine();
    }
 
    static void FooEventHandler()
    {
 
    }
}
 
class Foo
{
    public Foo() { Console.WriteLine("Foo created"); }
    ~Foo() { Console.WriteLine("Foo destroyed"); }
 
    public event Action FooEvent;
}
В примере выше деструктор вызовется без проблем, т.к. объекту по барабану, если кто-то подписан на его события.

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
31
32
33
34
35
class Program
{
    static void Main()
    {
        Foo foo = new Foo();
        Bar bar = new Bar();
        foo.FooEvent += bar.DoSomething;
 
        bar = null;
 
        GC.Collect();
        GC.WaitForPendingFinalizers();
 
        Console.ReadLine();
    }
}
 
class Foo
{
    public Foo() { Console.WriteLine("Foo created"); }
    ~Foo() { Console.WriteLine("Foo destroyed"); }
 
    public event Action FooEvent;
}
 
class Bar
{
    public Bar() { Console.WriteLine("Bar created"); }
    ~Bar() { Console.WriteLine("Bar destroyed"); }
 
    public void DoSomething()
    {
 
    }
}
А вот тут уже объект Bar удален не будет, т.к. ссылка на него лежит у объекта Foo в событии.
1
01.08.2013, 09:18

Не по теме:

наглядно, благодарю

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2013, 09:18
Помогаю со студенческими работами здесь

Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения
Создать массив структур, каждая из которых состоит из следующих елементов: факультет, курс, группа, фамилия студента и екзаменационная...

Запись из формы данных в переменные php файла, данные из переменные используются в других файлах сайта
Всем привет! Ребят, подскажите пожалуйста! Есть один файл с обычной html формой, в которой обычные данные (фио, вэб-ссылка, контактные...

Переменные,значение функции,вспомогательные переменные.
1)Даны переменные A,B,C.Изменить их значения,переместив их содержимое из A-в B,B-в C,C-в A,и вывести новые значения переменных A,B,C. ...

Создать бинарное дерево, по правой ветке - переменные типа инт, по левой - 2 переменные типа чар
Здравствуйте. Необходимо создать бинарное дерево, по правой ветке - переменные типа инт, по левой - 2 переменные типа чар. ругается в...

Простые переменные и ссылочные переменные
Подскажите пожалуйста. Допустим напишем в коде: String s1 = "Hello"; Получается, что переменная s1 содержит ссылку на область памяти,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 03.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 03.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 01.04.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru