| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > вопрос по статическим членам класса. |
| Автор: 4ybaka 14.5.2007, 19:22 |
| нужно чтобы до создания экземпляра класса у данного класса был обязательно определен статический член класса.как это реализовать?есть предположение,что както можно это сделать через атрибуты,но дальше предположения мысль не идет...через простую проверку в конструкторе - не катит. |
| Автор: kobra 14.5.2007, 21:45 |
| для этого есть статические конструкторы. |
| Автор: 4ybaka 21.5.2007, 18:05 | ||
а если надо инициализировать поле неопределенными параметрами?кот при компиляции не известны... |
| Автор: Дрон 21.5.2007, 18:33 | ||
Совсем-совсем неопределёнными или может всё-таки зависящими, например, от фазы луны? Ты, видимо, не совсем понял, что такое "статический конструктор":
|
| Автор: 4ybaka 21.5.2007, 19:30 |
| Дрон, у нас класс SomeClass вообще не имеет понятия,о том какая строка(например) ему будет передаваться,а значит ничего он расчитать сам не сможет.те нужно просто инициализировать статическую перем класса,но сделать это нужно красиво) |
| Автор: 4ybaka 21.5.2007, 21:01 | ||||
так блин,это все и ежу понятно...
надеюсь теперь понятно?
я бы это не назвал прям такой серьезной опечаткой...;) |
| Автор: Дрон 21.5.2007, 22:06 |
| 4ybaka, хмм... Виноват. Чувствую в эту тему нужен кто-то со свежим взглядом, а то меня сейчас точно заклинит Вообще, мне кажется, что ты усложняешь себе жизнь Можешь словами описать то, что ты хочешь сделать. Т.е. во-перых, объяснить, почему просто вызов A.S = str; тебя не устраивает? А во-вторых, зачем вообще такая хитрость нужна? По мне так всё это скорее всего противоречит правилам ООП. Зачем, например, делать статическую переменную в классе A, если можно str в классе B объявить как public static. Или зачем вообще ей быть статической, если её инициализация неразрывно связана с созданием объекта. Как-то всё это странно выглядит. Вроде как, где-то в глубинах сознания, я понимаю, что вся эта конструкция может иметь смысл, но всё же мой опыт говорит мне, что тут что-то не так и можно сделать по-другому Просто я сначала подумал, что ты вообще про статические конструкторы не знаешь, тогда бы это могло сбить с толку. А так, конечно, ясно про что я хотел сказать |
| Автор: 4ybaka 21.5.2007, 22:22 | ||||||
это означает,что мы можем в любой момент изменить поле A.S,чего нельзя.даже если поставить защиту на изменение,то это дополнительная переменная(а значит и память),+ сбиваем с толку программиста:"почему этот гребаный метод не работает как надо?!!!!":)
эта переменная была приведена для примера.фактически она формируется один раз и удалялется.да и вообще класс А является автономным,поэтому не допускается зависимость от другого класса...
1)назначение статической переменной никак не связано с ее инициализацией.еси есть один Graphics для всего класса,то зачем его делать для каждой переменной?2)ее инициализация должна предшествовать созданию объекта,тк при создании последнего она может потребоваться... впринципе я начинают понимать,что это не сделать,как я хотел...но если будут предложения,обязательно выслушаю. |
| Автор: archeg 22.5.2007, 00:35 | ||
Передавай в перегружений конструктор строку. Например вот так:
|
| Автор: Дрон 22.5.2007, 09:00 | ||
| Попробую ещё раз. Итак, у нас есть статическая переменная в классе A, которую нужно инициализировать извне, причём инициализировать один единственный раз, ещё до создания первого экземпляра класса. После инициализации, переменную изменять уже нельзя. Хмм...Статические переменные -- это всё-таки плохо. Например, ты точно уверен, что за всё время выполнения программы тебе не понадобится изменять эту переменную? Мне кажется, это довольно редкий случай. А так, я бы всё-таки сделал что-то вроде:
|
| Автор: ivashkanet 22.5.2007, 09:17 | ||
| Дрон, ага, так. Я так у себя делал: Сначала инициализируются два класса и сообщают об этом с помощью ContextControlLoaded и WorkControlLoaded. После того как оба загружены создается экземпляр менеджера. Если к нему обращаются до загрузки этих двух частей, то выкидывается исключение.
|
| Автор: tol05 22.5.2007, 12:56 | ||
Индусы написали бы так
в момент вызова new A() перед заходом в конструктор экземпляра мы зайдем в статический конструктор. Ну, или когда будем вызывать статический метод класса A. |
| Автор: 4ybaka 23.5.2007, 16:59 |
| archeg, идея нормальная,но смущает немного то,что придется создавать объект.я конечно понимаю,что на него можно и не обращать внимание,но всеже... Дрон, я как раз делал именно так,но оказалось,что таких переменных несколько,и меня не порадовала перспектива писать много раз одно и тоже...кстати я уже писал по поводу этого варианта ivashkanet, а можно по подробней,как это все работает?те просто объяснить принцип действия...например не понятно "Сначала инициализируются два класса",это как? tol05, ну про индусов я к сожалению промолчал,когда говорил об автономности класса.... |
| Автор: tol05 23.5.2007, 17:12 | ||
| Я имел в виду: - не искать сложного в простом - про индусов - это моя личная тема Давай вспомним задачу. Нужно проинициализировать статическую переменную класса, т.е. до создания первого экземпляра класса. Правильно? Как это сделать? Только статическим конструктором. Откуда взять данные? Из хранилища, а им может быть что угодно. Кроме, конечно, экземпляра другого класса, т.к. неизвестно, будет ли он вообще создан и когда. Но в статической переменной хранить - гораздо надежнее. Хоть один класс-хранилище-то будет создан до экземпляра класса А, я надеюсь Ну, раз уж ОН создает A. Так я думал, да и сейчас так же думаю. А вообще, данные можно хранить где угодно, в БД, в файле, в MemoryStream, разве в этом дело? Разве в этом был вопрос?
Вот и все. |
| Автор: 4ybaka 23.5.2007, 17:33 | ||
хм...ну вообщем да.надо обмозговать... |