Глобальные переменные в C#


18 0

Сегодня задали интересный вопрос - как и где хранить глобальные переменные. Человек привык создавать в Delphi отдельный модуль, в котором хранил глобальные переменные и методы. Это большая проблема Delphi, что он умеет создавать глобальные переменные. По правилам OOP не должно быть такой возможности, и в C# такой возможности нет!

Но как же тогда поступить, если хочется создать что-то глобальное? Сначала нужно подумать 10 раз, а действительно ли нужна эта глобальность. Забудьте Delphi как страшный сон и вообще забудьте, что может быть такая возможность, как глобальная переменная или метод. Просто подумайте и ответьте себе на следующие вопросы:

1. Действительно ли нужно, чтобы к переменной мог быть доступ откуда угодно? Если нет, то создайте свойство у какого-нибудь самого подходящего класса.

2. Может переменная по смыслу относится к какому-то классу? Если да, то опять же создайте свойство у какого-нибудь самого подходящего класса.

3. Может у вас код логики в классах с визуальным интерфейсом? Если да, то лучше удалить код, и начать писать заново, только проектировать код, а не лепить.

Если ты сейчас думаешь "да задолбал ты, просто скажи, как сделать глобальную переменную или метод", то в таком случае просто говорю:

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

namespace GlobalTrash
{
    class MyGlobalTrash
    {
        public static int MiGlobalVariable;

        public static void MiGlobalFunction()
        {
        }
    }
}

Теперь в любом месте программы вы можете обратиться к переменным и методам так: GlobalTrash.MyGlobalTrash.MiGlobalVariable = 10;. Но еще раз хочу посоветовать создавать глобальные переменные только в крайнем случае.

В принципе, можно не создавать отдельный класс и namespace, а использовать класс Program, который итак уже есть в программе в файле Program.cs.


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Spider_NET

13 Aпреля 2010

Этим мне и нравиться C#. После перехода с Delphi мне было чертовски непривычно, но потом я прочувствовал эту фичу. И код легче поддерживать (я про static) и все как-то на виду, в отличии от Delphi.

Хотя это относится к старым версия дельфина. В последних версиях, в Delphi появились так называемые классовые методы/переменные - аля статичные.

Все таки хорошо, что Delphi продолжает развиваться.


psycho-coder

14 Aпреля 2010

Я как-то писал клиент для MySQL на C++.NET (изврат конечно), но там нужно было где-то хранить настройки (пароль, имя пользователя, порт, имя базы и т.д.). Пришлось делать через глобальные переменные, т.к. окон было много, приписать к какому то классу было нельзя, а может и можно (на ум ничего не пришло).
Как быть в таких случаях?

Еще намучался с передачей данных между формами, где то можно было напрямую с одной формы на другую, а где то, только через глобы(


Михаил Фленов

14 Aпреля 2010

Зачем настройки соединения нужны окнам? Они нужны там только в одном случае - у тебя код доступа к базе находиться в классах с окнами. Это очень плохо. Нужно отделить это дело.


Сергей

14 Aпреля 2010

Забудьте Delphi как страшный сон

Михаил, зачем же так пренебрежительно?
Не правильно ли было бы сказать "забудьте ваши неправильные навыки кодирования на Delphi, как страшный сон". Сама среда Delphi тут ни в чем не виновата.
Чем объектно-ориентированные способности Delphi слабее чем в C#?
В нормальных книгах по Delphi черным по белому не рекомендуется использование глобальных переменных.
И ничего не мешает в Delphi так же как в твоём примере для C# обернуть все глобальные переменные в класс и обращаться к ним через свойства.
Delphi полностью объектно-ориентированный язык программирования. И ничего не мешает кодировать с его помощью "продвинуто" (100%-тно объектно ориентированно).


psycho-coder

14 Aпреля 2010

Ммм... Нужно выкинуть код доступа к базе в отдельный класс? Тогда значит, нужно передавать из класса данные, которые будут получены из базы, в класс окна и заполнять все поля этими данными?


Михаил Фленов

14 Aпреля 2010

2Сергей

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

Точно так же я скажу любому программисту, который переходит с C# или Java на Delphi - "забудьте C# и Java". Иначе не получиться написать успешный проект.

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


Михаил Фленов

14 Aпреля 2010

2psycho-coder

Жди отдельную заметку


Михаил Фленов

14 Aпреля 2010

Решил все же не писать заметку.

Подход Delphi: компоненты доступа к данным располагаются в отдельном модуле DataModule. Этот модуль создается при запуске приложения и любая форма обращается к модулю и может выполнять запросы у себя в классе и обрабатывать данные.
В принципе, ты можешь то же самое реализовать на C#. Создай отдельный класс, который будет создаваться при запуске приложения. Это будет у тебя как бы DataModule. Можешь даже называть его так же. Ссылка на класс будет статична (глобальна). В этом классе будет компонент для создания соединения с базой данных и объекта таблиц и запросов. Ты можешь в любом окне обратиться через статичную переменную к этому классу и получить объект любой таблицы для работы с ним. Не нужно хранить глобально все параметры, достаточно одной переменной, указывающий на объект модуля данных.
Но я уже давно говорю, что надо идти дальше и полностью отделять код от логики. Форма должна получать от DataModule не объект, через который можно получить данные, а НЕПОСРЕДСТВЕННО ДАННЫЕ. В формах должны быть вызовы в стиле:

DataModule.ДайМнеДанныеХХХ();

Результатом может быть набор данных, и можно даже в виде массивов, а не в виде Table.
Опять же, в Delphi можно так же сделать, но никто не делает, потому что сама VCL написана в стиле 70-хх годов и примеры с Delphi поставляются в стиле 70-х годов.


psycho-coder

14 Aпреля 2010

2Михаил
Спасибо. Нужно будет подумать над этим хорошенько). А прогу придется переписывать с нуля, т.к. исправлять то что там есть нет смысла.

[offtop]я только что понял, что не могу нормально высказать мысль((([/offtop]


Дмитрий

09 Октября 2010

[QUOTE]
Delphi - очень хороший язык. Но любому программисту, перешедшему с Delphi на C# нужно забыть практически все, что он делал на Delphi.

Точно так же я скажу любому программисту, который переходит с C# или Java на Delphi - "забудьте C# и Java". Иначе не получиться написать успешный проект.

Писать действительно можно одинаково, но не всегда это нужно. Просто у этих языков и библиотек подход разный. Я считаю, что писать нужно с использованием языка и его преимуществ. А не пытаться реализовать в языке преимущества других.
[/QUOTE]
Здравствуйте Михаил!
Для начала хотелось бы выразить Вам признательность и уважение за ваши книги. Буквально недавно я учился программировать по второму изданию Библии Delphi. И это помогло мне совершить "быстрый старт". Это была первая моя бумажная книга по программированию.
Но, я все-таки хочу выразить несогласие с тезисами такими как "забудьте как вы делали в Дельфи". Просто потому что как раз в подходах  особой разницы между дельфи и сишарп нету. Есть разница в концепции, но это нас прикладных программистов сильно не волнует.
Вот например, я в своих проектах вообще не использую подпрограммы и переменные вне классов, и даже перемещаю из модуля с классом формы глобальный экземпляр в dpr-файл.
Дальше, с событиями, дженериками, анонимными методами и атрибутами я познакомился в дельфи.
Читая MSDN по C# я практически не встречаю революционно нового - основное уже знакомо по дельфи, не считая специфичных штучек дотнета.
Про различия в архитекуре стандартных библиотек - да, ядро RTL сделано в процедурном стиле. Основная причина этого - быстродействие.
Но главное достоинство дельфи VCL является как раз таки олицетворением ООП подхода, и стала прообразом Windows.Forms.
Я это все к тому что не стоит вешать ярлыки на дельфистов якобы они все используют глобальные переменные. Тут предоставляется свобода и программист сам решает, вот я для себя и выбрал объектно-ориентированный подход.
Почему я изучаю C#? Ответ прост: более богатая стандартная библиотека, WPF, ASP.NET, и легче найти работу.
С уважением, Дмитрий.


Михаил Фленов

10 Октября 2010

"забудьте как вы делали в Дельфи" потому что в Дельфи можно использовать глобальные переменные, а в C# их просто нету (может я что-то упускаю).

У C# и Delphi все же много разного. VCL очень похожа на Delphi, но они только похожи. Лично для меня эти языки больше разные, чем похожие.


Дмитрий

10 Октября 2010

Они изначально должны были быть похожи, хотя бы потому, что их проектировал один человек.
Сначала сишарп много позаимствоал из дельфи, а теперь дельфи заимствует у сишарпа.
С С++ намного меньше схожести, синтаксис не считается, т.к. это не принципиально.
Кто-то не помню точно кто сказал что сишарп это 75% джавы и 25% дельфи. Теперь про дельфи можно сказать что там 50% сишарпа.
Не знаю, может Вы просто совсем не следите за последними версиями дельфи?


Дмитрий

12 Сентября 2011

А как быть например со строкой доступа к БД, которая формируется в окне авторизации и должна быть доступна всему приложению? Где ее хранить?


Михаил Фленов

12 Сентября 2011

Строка подключения не должна быть доступна всему приложению. Она должна быть доступна только одному - двум классам, в которых ты работаешь с данными и где у тебя будут находиться объекты SqlConnection....


Владимир

10 Октября 2012

Всем привет!

Проблема - в одном из классов библиотечной сборки нужно установить событие, которое бы виделось в главной сборке, ну и во всех остальных заодно.


Елена111

10 Мая 2021

Спасибо!!!
Может в реальной жизни глобальные переменные - это и зло, но для моей курсовой - самое то)))


Владимир№66

06 Aпреля 2022

Здравствуйте, Михаил!
Еще вопрос по C# VS.
Происходит неожиданное изменение глобальной переменной типа байт, объявленной в классе Programs. Она вдруг принимает значение 0.
Есть ли возможность в отладчике Vs отследить когда она принимает это значение?
Спасибо!


Михаил Фленов

06 Aпреля 2022

Сегодня отвечал на такой вопрос по почте


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне