Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Веселая фича

565  1 2 3 все
Murr патриот15.01.13 11:07
Murr
NEW 15.01.13 11:07 
Веселая фича
имеем следующую конструкцию:
private static string DefaultCstFolder = TTemplatesDll.TemplateDir;
TTemplatesDll - синглетон
TemplateDir - проперть, контролирующая доступ к полю. Проперть критична и потому отслеживает ситуацию с своей инициализацией - выкидывае Ехцептион если что не так. Инициализация происходит в начале.
Вопрос - Каким образом она может оказаться НЕ инициализированной в средине выполнения программы, когда инициализация DefaultCstFolder уже давно позади?
#1 
  Posmotrim завсегдатай16.01.13 00:07
Posmotrim
NEW 16.01.13 00:07 
в ответ Murr 15.01.13 11:07
CLR всего лишь гарантирует, что инициализация статического члена произойдёт до его первого использования. Ты уверен, что использование имело место быть? ;-)
#2 
Murr патриот16.01.13 00:23
Murr
NEW 16.01.13 00:23 
в ответ Posmotrim 16.01.13 00:07
100%...
#3 
Murr патриот16.01.13 00:25
Murr
NEW 16.01.13 00:25 
в ответ Posmotrim 16.01.13 00:07
Да, если интересно - только в Релеасе... в Дебуге все тип-топ...
#4 
  scorpi_ постоялец16.01.13 01:56
NEW 16.01.13 01:56 
в ответ Posmotrim 16.01.13 00:07
В ответ на:
что инициализация статического члена произойдёт до его первого использования

По-русски это звучит так пошло...
#5 
  Posmotrim завсегдатай16.01.13 09:53
Posmotrim
NEW 16.01.13 09:53 
в ответ Murr 16.01.13 00:23
В ответ на:
Вопрос - Каким образом она может оказаться НЕ инициализированной в средине выполнения программы

перед и после первого использования DefaultCstFolder сделать записи в лог.
В ответ на:
когда инициализация DefaultCstFolder уже давно позади?

На основании чего сделан данный вывод? Измени геттер для TemplateDir:
string TemplateDir
{
get
{
log.trace("TemplateDir: 1");
try
{
//перед return:
log.trace("TemplateDir: 2");
}
catch
{
log.trace("TemplateDir: 3");
throw;
}
}
}


что будет в лог файле?

#6 
  Posmotrim завсегдатай16.01.13 12:35
Posmotrim
NEW 16.01.13 12:35 
в ответ scorpi_ 16.01.13 01:56
В ответ на:
По-русски это звучит так пошло...

даже не хочу знать знать, о чём ты думал в 6-м классе, изучая одночлены и многочлены =))
#7 
Murr патриот16.01.13 13:32
Murr
NEW 16.01.13 13:32 
в ответ Posmotrim 16.01.13 09:53
На основании чего сделан данный вывод?
-----
На основании лога. Есть запись об инициализации, есть записи об доступе и в конце есть запись об Ехцептионе...
Не мучайся - в этом коде проблем нет. Проблема есть в другом месте - там создается (не мною) второй инстансе синглетона и он - не инициализирован...
#8 
  Posmotrim завсегдатай16.01.13 13:49
Posmotrim
NEW 16.01.13 13:49 
в ответ Murr 16.01.13 13:32
В ответ на:
там создается (не мною) второй инстансе синглетона и он - не инициализирован.

ну так ССЗБ. приватный конструктор тебе в руки...
#9 
Murr патриот16.01.13 14:39
Murr
NEW 16.01.13 14:39 
в ответ Posmotrim 16.01.13 13:49
приватный конструктор тебе в руки...
------
Он и так приватный - указано же - синглетон...
ну так ССЗБ.
-----
Скорее - разработчиков Linq надо кормить звиздюлями...
#10 
  Posmotrim завсегдатай16.01.13 15:16
Posmotrim
NEW 16.01.13 15:16 
в ответ Murr 16.01.13 14:39
Если конструктор приватный, как был создан второй объект данного класса? И чем тебе насолили создатели линка?
#11 
Murr патриот16.01.13 15:59
Murr
NEW 16.01.13 15:59 
в ответ Posmotrim 16.01.13 15:16
Как - это не ко мне, а аккурат к создателям Linq...
#12 
  Posmotrim завсегдатай16.01.13 16:23
Posmotrim
NEW 16.01.13 16:23 
в ответ Murr 16.01.13 15:59
В ответ на:
Как - это не ко мне, а аккурат к создателям Linq...

Ты не мог бы дать более расширенный ответ, а то я вообще не понимаю твои отрывки фраз :-(
#13 
Murr патриот16.01.13 17:15
Murr
NEW 16.01.13 17:15 
в ответ Posmotrim 16.01.13 16:23
Хммм... Ну хорошо...
Где-то в недрах Linq происходит вызов приватного конструктора TTemplatesDll или класс инстанцируется без вызова.
Причина такого поведения, скорее всего в том, что Linq сам по себе инстанцирует обьекты и делает это где-то в отдельном блоке памяти.
Как результат - там действительно создается другой инстансе singleton'a TTemplatesDll и он непаравильно инициализирован.
Наверное есть какой-то метод как сообщить Linq что ему нужен полный клон обьекта, но мне было лениво копать и обошел по-другому - убрал статику.
#14 
  Posmotrim завсегдатай16.01.13 18:11
Posmotrim
NEW 16.01.13 18:11 
в ответ Murr 16.01.13 17:15
а можно привести конструкцию linq, посредством которой
В ответ на:
происходит вызов приватного конструктора TTemplatesDll или класс инстанцируется без вызова?

Спасибо.
#15 
Murr патриот16.01.13 19:21
Murr
NEW 16.01.13 19:21 
в ответ Posmotrim 16.01.13 18:11
Могу дать завтра. Там удаление из списка.
Но сам код - не принципиален - любой код с использованием Линк будет делать тоже самое...
#16 
AlexNek патриот16.01.13 19:47
AlexNek
16.01.13 19:47 
в ответ Murr 16.01.13 13:32
В ответ на:
там создается (не мною) второй инстансе синглетона

А тебе не кажется что в этом случае это просто не синглетон. Иначе говоря его кривая реализация.
Либо ты еще о чем умалчиваешь....
#17 
Murr патриот16.01.13 20:29
Murr
NEW 16.01.13 20:29 
в ответ AlexNek 16.01.13 19:47
А тебе не кажется что в этом случае это просто не синглетон.
-----
Нее, не кажется... TTemplatesDll представляет единственную длл в системе... Мне просто вреден второй экземпляр...
Я так припоминаю, что уже была дискуссия по этому поводу... лет 5-6 назад...
#18 
  Posmotrim завсегдатай16.01.13 21:14
Posmotrim
NEW 16.01.13 21:14 
в ответ Murr 16.01.13 19:21
Удаление из списка единственного члена? o_O
#19 
Murr патриот16.01.13 21:35
Murr
NEW 16.01.13 21:35 
в ответ Posmotrim 16.01.13 21:14
Едиственного члена Я прибью и без Линка...
#20 
1 2 3 все