Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2016, 23:03   #1
johio
Новичок
Джуниор
 
Регистрация: 15.12.2016
Сообщений: 5
По умолчанию зона видимости в C#

У меня в программе на C++ присутствовал класс log инициализированный глобально, который выводил логи так и туда, куда мне было нужно, инициализировался один раз, имел внутренние параметры и
БЫЛ виден из всех функций всех классов, которые туда кидали сообщения напрямую.
Как реализуется подобное на C#?
johio вне форума Ответить с цитированием
Старый 16.12.2016, 00:12   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Статическим классом, например.
Son Of Pain вне форума Ответить с цитированием
Старый 17.12.2016, 00:14   #3
johio
Новичок
Джуниор
 
Регистрация: 15.12.2016
Сообщений: 5
По умолчанию Спасибо. Помогло.

Не подскажете ли еще пожалуйста, почему конструктор такого класса, если не создавать его копию, вызывается только при обращении к нему, а деструктор не вызывается вообще?
johio вне форума Ответить с цитированием
Старый 17.12.2016, 03:55   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Первая ссылка в гугле по запросу c# static class lifetime:
Цитата:
As is the case with all class types, the type information for a static class is loaded by the .NET Framework common language runtime (CLR) when the program
that references the class is loaded. The program cannot specify exactly when the class is loaded. However, it is guaranteed to be loaded and to have its
fields initialized and its static constructor called before the class is referenced for the first time in your program. A static constructor is only called
one time, and a static class remains in memory for the lifetime of the application domain in which your program resides.
Что, в общем-то, логично: в С++ статические мемберы в классах ведут себя почти так же (только инициализируются в начале выполнения программы, а не при первом обращении).
Son Of Pain вне форума Ответить с цитированием
Старый 17.12.2016, 10:07   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не "при первом", а "до первого".
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.12.2016, 12:11   #6
johio
Новичок
Джуниор
 
Регистрация: 15.12.2016
Сообщений: 5
По умолчанию ошибочка ваша

проверял. конструктор статического класса вызывается непосредственно перед обращением к нему. нет обращения - нет запуска конструктора. по крайней мере в MS VS 2012 это так. В других версиях не проверял

Последний раз редактировалось johio; 17.12.2016 в 12:14.
johio вне форума Ответить с цитированием
Старый 17.12.2016, 12:24   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И? Что не так?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.12.2016, 22:15   #8
johio
Новичок
Джуниор
 
Регистрация: 15.12.2016
Сообщений: 5
По умолчанию

Конструктор статического класса выполняется только перед обращением к классу, а если такового нет, то не вызывается вовсе. Это отличие от С++.
То есть, если я не знаю, какая функция вызывает класс первой, то я не уверен сработал ли конструктор вообще. Таким образом, если конструктор выполняет настройку определенных параметров, то я не знаю была ли проведена эта операция или нет. И мне придется делать это явным образом и по-другому.
johio вне форума Ответить с цитированием
Старый 17.12.2016, 22:57   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да, в цитате выше никто и не писал, что он вызывается при запуске. Гарантирован только вызов до использования.

Но по-моему вы что-то странное хотите и в любом случае лучше использовать другие способы реализации.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.12.2016, 00:50   #10
johio
Новичок
Джуниор
 
Регистрация: 15.12.2016
Сообщений: 5
По умолчанию

Спасибо. Вопрос исчерпан.
johio вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зона рубля :) Alar Свободное общение 28 01.09.2011 00:06
зона рф и фиддлер crazy horse Общие вопросы Web 4 01.03.2011 21:13
Зона-17 [Зона17]Програміст Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 01.12.2008 14:53
Зона-17 [Зона17]Програміст Помощь студентам 3 30.11.2008 11:56