Аннотация:
Статья рассчитана на тех, кто хочет изучить программирование в .Net и язык C#, или хотя бы понять, как можно использовать эту среду, чтобы решить стоит ли этим заниматься. Эта статья также будет полезна начинающим программистам, так как позволяет пройти весь цикл разработки программы. В качестве побочного эффекта вы получите полезную утилиту.
22.12.03 16:11: Перенесено модератором из '.NET' — AVK
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Абсолютно неверная фраза: "До C# не было языков, позволяющих использовать в качестве меток в операторах, подобных switch, не простые char или int, а строки."
был QuickBasic в его конструкции SELECT (точный синтаксис уже не помню) можно было использовать строки... и в компиляющем варианте — тоже. часто использовалось при опросе клавиатуры (если программировал под DOS через Бейсик — поймешь, почему так )
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
internal AscDir(AscDir ParentDir, string sPath, string sPattern)
{
[...skip...]
// Запаминаем имя каталога. В принципе можно было бы просто хранить
// сам объект DirectoryInfo, но это привело бы к неоправданному
// расходу ресурсов.
m_sName = di.Name;
[...skip...]
и дальше рекурсия этого конструктора,
в котором di локальная переменная 8-[ ]
Не понимаю где мы ресурсы выигрываем ?
Если di будет жить при вызове конструтора AscDir для родительского каталога,
а также во всем дереве конструкторов AscDir для дочерних
каталогов. (фух... надеюсь объяснил)
конечно, ресурсы сильно съедятся тут
m_Root = new AscDir(null, sPath, sPattern);
а после все подчиститься (может быть).
только зачем освобождать то что занимали di,
если на этот конструктор их уже хватило.
Буду рекомендоватиь начинающим! Куча возможностей упоминется... и GUI, и RegExp, и DllImport, и XML... Очень удачно все влезло в небольшую задачку для демонстрации возможностей.
В следующих номерах будут статьи по технологиям созданным для RSDN@Houme (Януса). Но такой же целиковой статьи вряд ли получится. Все же проект по больше. Да и технологии посложнее.
Так же планируются статьи по таким вопросам как создание компонентов и контролов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Можно конечно и так. Просто хотелось показать case с текстовыми строками.
Ну а лучше всего было бы написать более качественную реализацию меню и тубларов в которой сделать поддержку Verb-ов (типа акшенов в Дельфи). Тогда можно было бы делать обратбочики визуально, да и настройку в рантайме можно было бы осуществить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
ВЧ>Авторы: ВЧ> Владислав Чистяков
ВЧ>Аннотация: ВЧ>Статья рассчитана на тех, кто хочет изучить программирование в .Net и язык C#, или хотя бы понять, как можно использовать эту среду, чтобы решить стоит ли этим заниматься. Эта статья также будет полезна начинающим программистам, так как позволяет пройти весь цикл разработки программы. В качестве побочного эффекта вы получите полезную утилиту.
Соглашения об именовании элементов
Для текстовых окон (TextBox) будем давать префикс tb, для переключателей (CheckBox) – cb, для кнопок (Push Buttons) – pb, для TabControl – tab, для страниц TabControl-а – tp, для элементов меню (Menu Items) – mi, для кнопок тулбара – tbb, для разделителей тулбара – tbs, для сплитеров – spl. Эти префиксы дадут возможность легко определять элемент управления по его названию и облегчать поиск нужного элемента при использовании Complete Word в VS.Net.
Честно говоря, без этого "вводного" курса по изучению алфавита и словаря программы, очень трудно вникать в её суть с первого раза, да и этой "азбукой" приходится частенько пользоватся — листать туда-сюда, чтобы свериться, какой объект и правильно ли используется.
Добавьте три закладки и дайте им следующие имена/заголовки: tpSetings/Settings, tpPreview/Preview и tpLog/Log.
Давайте осмысленные имена объектам!
Почему бы не отказаться от префиксной нотации и перейти к нормальной постфиксной:
tp... -> SetingsTab, PreviewTab, LogTab...
tbFind –> FindTextBox,
lblPath -> PathLabel (метка — она везде метка, можно без постфикса Label, но во избежание...),
pbBrowseFolder -> BrowseFolderButton (опять: что обозначает префикс "pb"? Лезем в "словарь"... )
cbReplAll -> ReplAllFlag (флажок, Вы же не будете использовать такой же, но булевый эквивалент — как правило, значение берётся из контрола, а не синхронизируется с другой "одноимённой" булевой переменной),
gbRegExpOptions -> RegExpOptionsGroup (кратко и логично).
Попробуйте следовать приведённым или аналогичным рекомендациям и текст статьи засияет в лучшем свете некосноязычного, но человеческого звучания.
Здравствуйте, iZEN, Вы писали:
ZEN>Давайте осмысленные имена объектам! ZEN>Почему бы не отказаться от префиксной нотации и перейти к нормальной постфиксной: ZEN>tp... -> SetingsTab, PreviewTab, LogTab... ZEN>tbFind –> FindTextBox, ZEN>lblPath -> PathLabel (метка — она везде метка, можно без постфикса Label, но во избежание...), ZEN>pbBrowseFolder -> BrowseFolderButton (опять: что обозначает префикс "pb"? Лезем в "словарь"... )
Погляди на дату публикации статьи (26.10.2002). В те времена никаких соглашений об именовании переменных небыло и я пользовался своими С++-ными привычками. Теперь я (как и очень многие) пользуюсь нашими соглашениями по оформлению кода.
ZEN>Попробуйте следовать приведённым или аналогичным рекомендациям и текст статьи засияет в лучшем свете некосноязычного, но человеческого звучания.
Уже года два как пользуюсь. Но все равно спасибо за коментарий.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, iZEN, Вы писали:
ZEN>(Кстати, почему при цитировании отрезается первая буква: iZEN -> ZEN? )
Погляди на мое цетирование. Там вообще две буквы остается. Просто собираются только большие буквы. Это позволяет избежать огромных префиксов если ник имеет огромный размер.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
public class CDelegateTest
{
// Объявление делегата (типа).public delegate void SomeDelegate(string sFileName);
// Этот метод получает делегат в качестве параметра.public void DelegateTest(SomeDelegate sd)
{
// Вызов делегата синтаксически эквивалентен вызову глобальной функции,
// или локальной функции (находящейся в этом же классе). Однако при
// этом вызывается метод, ссылка на который помещена в делегат.
// Причем если метод не статический, то вызов производится у конкретного
// экземпляра объекта, ссылка на который также хранится в делегате.
sd(); // Вызов метода, указанного в делегате.
}
}