MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_01C6E59F.7229A350" Данный документ является веб-страницей в одном файле, также называемой файлом веб-архива. Если вы видите это сообщение, значит данный обозреватель или редактор не поддерживает файлы веб-архива. Загрузите обозреватель, поддерживающий веб-архивы, например Microsoft Internet Explorer. ------=_NextPart_01C6E59F.7229A350 Content-Location: file:///C:/64525993/file8483.htm Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="windows-1251" Азы C#

    

Ca= tone.

Азы C#.

СОДЕРЖАНИЕ

  = ;  

Часть 1.

Гла­ва 2. Син­так­сис дек­ла­ра­ций.

Гла­ва 3. Син­так­сис дек­ла­ра­ций мас­си­вов, свойств, де­ле­га­тов. As­sembly.<= /a>

Гла­ва 4. Ос­нов­ные опе­ра­то­ры и кон­с­т­рук­ты.

Гла­ва 5. Ини­ци­али­за­ция пе­ре­мен­ных. Кол­лек­ции. Ти­пы дан­ных.

Гла­ва 6. При­мер ко­да.

Часть 2.

Гла­ва 2. Ге­не­ало­гия клас­сов.

Гла­ва 3. Ис­к­лю­че­ния.

Гла­ва 4. Муль­ти­по­точ­ность.

Гла­ва 5. Вы­зов фун­к­ций биб­ли­отек Win32 (P/Invo­ke)

Часть 3.

Гла­ва 2. Се­ри­али­за­ция.

Гла­ва 3. Ref­lec­ti­on.

Гла­ва 4. Са­мо­дель­ные эле­мен­ты уп­рав­ле­ния 1.

Гла­ва 5. Са­мо­дель­ные эле­мен­ты уп­рав­ле­ния 2.

Часть 4.

Гла­ва 2. Объ­ект Grap­hics.

Гла­ва 3. Цве­та.

Гла­ва 4. Ка­ран­да­ши.

Гла­ва 5. Кис­ти.

Гла­ва 6. Ге­омет­ри­чес­кие эле­мен­ты.

Гла­ва 7. Мат­рич­ные тран­с­фор­ма­ции.

Гла­ва 8. Гра­фи­чес­кие фай­лы.

Гла­ва 9. При­ме­ры.

При­ло­же­ния.

2. Са­мо­дель­ная го­ло­во­лом­ка.

3. Са­мо­дель­ный из­ме­ня­тель раз­ме­ра кар­ти­нок.

4. Сис­тем­ный ин­ди­ка­тор в за­го­лов­ке ок­на.

5. "Ошку­ри­ва­ние" прог­рам­мы.

6. Пе­рех­ват­чик всех оши­бок.

7. Са­мо­дель­ный бе­ка­пер.

  = ;  

  = ;  

Часть 1.

  = ;  Самые ос­нов­ные ве­щи в язы­ке C# и плат­фор­ме .NET вце­лом.

  = ;  

Глава 1. Как читать чужой код.

  &nb= sp; 

    По прось­бам чи­та­те­лей­, по= ­пы­тал­ся на­пи­сать об ос­но­вах язы­ка. Впро­чем, толь­ко прис­ту­пив по­нял, что д= е­ло гиб­лое - что­бы пи­сать об ос­но­вах на­до быть или МУД­рым АКа­де­ми­кОМ,= или дей­ст­ви­тель­но иметь та­лант пре­по­да­ва­те­ля. Я та­ко­во­го та­лан­та= не имею. По­это­му смо­гу толь­ко крат­ко рас­ска­зать о не­ко­то­рых осо­бен­= нос­тях. По­няв, что от та­ко­го тол­ку ма­ло, я ре­шил на­пи­сать для на­ча­ла как = чи­тать чу­жой код. Ибо, нас­коль­ко я по­ни­маю, ос­нов­ные проб­ле­мы с по­ни­ма­= ни­ем ко­да кро­ют­ся не в нез­на­нии, а в не­уме­нии эти са­мые зна­ния до­быть.= В этой об­лас­ти пи­сать про­ще, т.к. мне час­то при­хо­дит­ся чи­тать чу­жой код, са­мо­го раз­но­го уров­ня и на са­мых раз­ных, в том чис­ле не­из­вес= ­т­ных мне, язы­ках.

    

    Кратко о язы­ке

    Итак язык C# вы­рос из C++, со= х­ра­нив ос­нов­ные осо­бен­нос­ти син­так­си­са и опе­ра­то­ры. Да и ос­нов­ные опе= ­ра­то­ры оди­на­ко­вы во всех язы­ках, так что ес­ли вы зна­ете хоть один язык, то у= вас не дол­ж­но воз­ни­кать воп­ро­са что та­кое for, if...then...else, do...wh= i­le и пр. Не са­мый рас­п­рос­т­ра­нен­ный опе­ра­тор ис­поль­зу­ющий­ся в C# -= fo­re­ach. Соб­с­т­вен­но де­ла­ет то, что обоз­на­ча­ет - "for each =3D для каж­= до­го", т.е. про­во­дит цикл для каж­до­го чле­на из мас­си­ва/кол­лек­ции/спис­ка.=

    Особенностью всех С-по­доб­ных= язы­ков яв­ля­ет­ся ог­ра­ни­чи­ва­ние бло­ков ко­да фи­гур­ны­ми скоб­ка­ми, в от­= ли­чии от, нап­ри­мер, Ba­sic, в ко­то­ром все окон­ча­ния обоз­на­ча­ют­ся как End что-то (Sub, If и пр.). Ну и еще од­на осо­бен­ность - лю­бовь к сок­ра­ще­= ни­ям все­го че­го толь­ко мож­но.

    В .NET вце­лом по­яви­лось нес= ­коль­ко осо­бен­нос­тей - нап­ри­мер, из­чез­ли ос­нов­ные ти­пы дан­ных. Те­перь к= лю­че­вые сло­ва do­ub­le и int не пред­с­тав­ля­ют со­бой пос­ле­до­ва­тель­ность ба= йт в па­мя­ти, а яв­ля­ют­ся крат­кой за­писью для System.Do­ub­le и System.Int32 (на 32-х раз­ряд­ных ма­ши­нах) со­от­вет­с­т­вен­но. По­яви­лись ин­тер­фе= й­сы, поз­во­ля­ющие опи­сать на­бор фун­к­ций­, не­об­хо­ди­мых для сов­мес­ти­м= ос­ти с ка­ким-ли­бо клас­сом, и еще мно­го че­го, в ос­нов­ном не нуж­но­го но­в= ич­кам.

    И не на­до за­бы­вать, что в .= NET сох­ра­не­на сис­те­ма win­dows со­об­ще­ний и со­бы­тий. Так что иметь пре= д­с­тав­ле­ние о том, как ра­бо­та­ет Win­dows опе­ра­ци­он­ка не­об­хо­ди­мо хо­тя бы на = на­чаль­ном уров­не.

    

    Основы ра­бо­ты сис­те­мы

    Специалистов за­ра­нее про­шу = не кри­вит­ся - я бу­ду пи­сать толь­ко о са­мых ос­но­вах и прос­тым язы­ком. То что нас= ин­те­ре­су­ет - это сис­те­ма со­бы­тий (event) и их кон­т­ро­ля. Что бы ни про­изош­ло в= ком­пе - дер­ну­лась мыш­ка, на­жа­ли кла­ви­шу или от­к­ры­ли ок­но - это прев­ра= ­ща­ет­ся в event. Event'ы бы­ва­ют раз­ные - на все слу­чаи жиз­ни. При же­ла­нии вам ник­то не ме­ша­ет сде­ла­ет свое со­бы­тие, впро­чем это до­воль­но ред­ко= нуж­но, хо­тя уметь по­лез­но. Ког­да Event соз­дан - он рас­сы­ла­ет­ся всем за­ин= ­те­ре­со­ва­ным ли­цам :), сво­его ро­да рас­сыл­ка по ин­те­ре­сам. Ва­ша прог­рам­ма, ес­= ли она хо­чет по­лу­чать ин­фор­ма­цию о ка­ких-то со­бы­ти­ях - дол­ж­на под­= пи­сать­ся на них. Все до­воль­но прос­то:

    Если вам на­до что­бы ва­ша пр= ог­рам­ма по­лу­ча­ла ин­фор­ма­цию о со­бы­тии на­жа­тия кноп­ки - под­пи­ши­тесь:

    

   &nb= sp;кнопка1.Click +=3D new Even­t­Han­d­ler(на­жа­лиК­ноп­ку);

    Этой строч­кой вы вклю­ча­ете = фун­к­цию "на­жа­лиК­ноп­ку" в спи­сок рас­сыл­ки ин­фор­ма­ции о со­бы­тии "Click" (на­жа­тие) для кноп­ки "кноп­ка1". Пом­нить на= ­до толь­ко об од­ном - лю­бые вла­дель­цы рас­сы­лок лю­ди хит­рые, кон­ку­рен= ­тов не лю­бят и рас­сы­ла­ют толь­ко "сво­им", что в пе­ре­во­де на п= рог­рам­ми­ро­ва­ние зна­чит - фун­к­ция, ко­то­рую вы вно­си­те в спи­сок дол­ж­на быть имен­но= та­ко­го ви­да, ка­ко­го ждут в спис­ке, ина­че не при­мут. Пос­лед­ний мо­мент - Ev= en­t­Han­d­ler - это пос­ред­ник меж­ду спис­ком рас­сыл­ки и по­лу­ча­те­лем, имен­но он = дер­жит имя фун­к­ции, ко­то­рой на­до со­об­щить о со­бы­тии. Even­t­Han­d­ler'ов столь­ко же, сколь­ко и раз­ных event'ов, и он то­же дол­жен быть имен­но т= о­го ти­па, ко­то­рый ждут.

    

    Как чи­тать чу­жой код<= /p>

    Конечно код бы­ва­ет раз­ный­,= и что­бы чи­тать чу­жой код, ко­то­рый на­пи­сан на сла­боз­на­ко­мом язы­ке, без ко= м­мен­та­ри­ев и в неп­ри­выч­ной ма­не­ре нуж­но не толь­ко уме­ние, но и из­ряд­ная до­ля уда­чи и ин­ту­иции. Од­на­ко ес­ли код до­воль­но прос­той и на­пи­сан с к= ом­мен­та­ри­ями, хо­тя бы с ка­ки­ми-то, то про­чи­тать его проб­лем обыч­но не сос­тав­ля­е= т. Боль­шой плюс C# в этом от­но­ше­нии, это воз­мож­ность вбить не­по­нят­ную строч­ку в Go­og­le или MSDN и поч­ти на­вер­ня­ка най­дет­ся при­мер с под= ­роб­ным опи­са­ни­ем, или что-то по­доб­ное. Боль­ше чем про C#, сре­ди .NET язы­ко= в, в се­ти толь­ко про VB на­пи­са­но.

    Итак, раз­бор ко­да. Рас­смот­= рим код внут­ри фун­к­ции, так как все ос­таль­ное обыч­но воп­ро­сов не вы­зы­= ва­ет.

    Код, как при­ви­ло, струк­ту­р= и­ро­ван - или фор­ма­ти­ро­ван та­бу­ля­ци­ей­, или как-то ина­че (нап­ри­мер re­gi= ­on'ами). Очень час­то каж­дый блок име­ет ком­мен­та­рий­, опи­сы­ва­ющий про­из­во­= ди­мую внут­ри опе­ра­цию - нап­ри­мер, "Чте­ние фай­ла", "За­пол­н= е­ние таб­ли­цы", "Под­бор раз­ме­ров". Та­ким об­ра­зом, мы зна­е= т что там про­ис­хо­дит, ос­та­лось по­нять как. Боль­шин­с­т­во, т.е. поч= ­ти все, фун­к­ции и свой­ст­ва стан­дар­т­ных клас­сов об­ла­да­ют наз­ва­ни­я= ми точ­но опи­сы­ва­ющи­ми их дей­ст­вия. Ес­ли вы не зна­ете ан­г­лий­ский - = поп­ро­буй­те сна­ча­ла пе­ре­вес­ти наз­ва­ние фун­к­ции, раз­бив его на от­дель­ные сло= ­ва по боль­шим бук­вам: Get­C­hil­d­F­rom­Po­int =3D Get Child From Po­int =3D= По­лу­чить Ре­бен­ка Из Точ­ки - по­лу­чить до­чер­ний эле­мент уп­рав­ле­ния, на­хо­д= я­щий­ся в точ­ке. Дру­гой ва­ри­ант - пе­ре­во­дить имя клас­са и фун­к­цию: Con­ve= rt.ToS­t­ring =3D Con­vert To String =3D Пе­ре­вес­ти В Стро­ку. Не­ко­то­рые тер­ми­ны, = ко­неч­но, при­дет­ся по­ис­кать в се­ти и пос­ле пе­ре­во­да. А не­ко­то­рые пе­ре­ве= с­ти по­нят­но не по­лу­чит­ся, по­это­му при­дет­ся по­нять, что имен­но фун­к­= ция де­ла­ет. Нап­ри­мер, в та­кой вот строч­ке:

    

   &nb= sp;largerImagesComboBox.DataSource =3D Enum.Get­Na­mes(type­of(Des­k­top­Bac­k­g­ro­un­d­S­t­y­le));

    

    даже ес­ли вы по­ня­тия не име= ­ете что та­кое Enum, мож­но мно­гое по­нять из прос­то­го пе­ре­во­да: объ­ект = Com­bo­Box (вы­па­да­ющее ок­но), его свой­ст­во Ис­точ­ник Дан­ных (Da­ta­So­ur­ce) п= ри­рав­ни­ва­ет­ся че­му-то не­по­нят­но­му. Ло­гич­но пред­по­ло­жить, что ис­точ­ник дан­ных= ука­зы­ва­ет на ка­ко­го-ли­бо ви­да спи­сок зна­че­ний. Фун­к­ция, пред­по­ло­жим не­из= ­вес­т­но­го, клас­са Enum на­зы­ва­ет­ся Get­Na­mes - по­лу­чить име­на, воз­в­ра­ща­ет = она мас­сив строк, ко­то­рый и за­пол­нит вы­па­да­ющее ок­но зна­че­ни­ями.

    

    Подведем ито­ги - ни­че­го тол= ­ком по­лез­но­го я не ска­зал. Все мои со­ве­ты мож­но свес­ти к трем фра­зам:<= /p>

    1. вни­ма­тель­но чи­тай­те ко= д

    2. учи­те ан­г­лий­ский­, кто = не зна­ет

    3. поль­зуй­тесь справ­кой (MS= DN) и Go­og­le'ом.

    

Гла­ва 2. Син­так­сис дек­ла­ра­ций.=

  &nb= sp; 

    Вторая по­пыт­ка на­пи­сать чт= о-то по­лез­ное для сов­сем на­чи­на­ющих в С#. 

    Чуть-чуть о струк­ту­ре ко­да:= вер­х­ним эле­мен­том струк­ту­ры яв­ля­ют­ся прос­т­ран­с­т­ва имен (na­mes­pa­ce), = до­воль­но фик­тив­ная вешь, приз­ван­ная упо­ря­до­чить ту ку­чу клас­сов, спис­ков, = ин­тер­фей­сов и кон­с­тант, ко­то­рые уже су­щес­т­ву­ют и бу­дут соз­да­вать­ся. В na­me= s­pa­ce мо­гут вхо­дить дру­гие na­mes­pa­ce, клас­сы, enum, кон­с­тан­ты и ин­тер­= фей­сы. Класс сос­то­ит из фун­к­ций­, пе­ре­мен­ных и кон­с­тант. По по­во­ду пе­р= е­мен­ных - они мо­гут быть объ­яв­ле­ны на лю­бом уров­не, и су­щес­т­во­вать бу­дут толь­ко в пре­де­лах (и во вре­мя жиз­ни) то­го бло­ка, в ко­то­ром объ­яв­= ле­ны. Нап­ри­мер: пе­ре­мен­ная объ­яв­лен­ная в клас­се дос­туп­на для все­го кл= ас­са, час­то для дру­гих клас­сов, жи­вет все вре­мя, по­ка жив класс (если он ст= а­тич­ный­) или объ­ект клас­са (если не ста­тич­ный­). Дру­гой при­мер: пе­ре­мен­ная = объ­яв­лен­ная в пре­де­лах бло­ка if { }, ко­то­рый на­хо­дит­ся внут­ри бло­ка for { }, = ко­то­рый на­хо­дит­ся внут­ри фун­к­ции клас­са... та­кая пе­ре­мен­ная бу­дет дос­т= уп­на толь­ко в пре­де­лах бло­ка if {}, в ко­то­ром объ­яв­ле­на и бу­дет жить п= о­ка не за­кон­чит­ся вы­пол­не­ние бло­ка, т.е. да­же до кон­ца фун­к­ции не до= ­жи­вет.

    О том, что та­кое ста­ти­чес­к= ий класс, что зна­чит пе­ре­мен­ная объ­яв­ле­на и пр - чи­тай­те ни­же.

    

    Синтаксис дек­ла­ра­ций=

    Декларации - или объ­яв­ле­ния= - это оп­ре­де­ле­ние име­ни и фор­ми­ро­ва­ние ти­па, прик­реп­ля­емо­го к это­му име­ни. Т.е. ес­ли вам нуж­но мес­то для хра­не­ния це­ло­го чис­ла, вы дол= ­ж­ны объ­явить пе­ре­мен­ную, с по­нят­ным вам име­нем, ти­па дан­ных це­лое (in= t). К сло­ву, int =3D in­te­ger =3D це­лое чис­ло. И пом­ни­те, дек­ла­ра­ция н= е соз­да­ет объ­ект и не вы­де­ля­ет па­мять - это толь­ко зак­реп­ле­ние име­ни за ти­= пом. Для соз­да­ния дек­ла­ри­ро­ван­но­го объ­ек­та не­об­хо­ди­мо его ини­ци­а= ли­зи­ро­вать (или оп­ре­де­лить), т.е. ли­бо прис­во­ить на­чаль­ное зна­че­ние, ли­бо з= а­пус­тить кон­с­т­рук­тор.

    Декларация клас­сов, фун­к­ций= и пе­ре­мен­ных на уров­не клас­са тре­бу­ет ука­за­ния мо­ди­фи­ка­то­ра дос­ту­па. Впро­ч= ем, ес­ли не ука­зы­вать бу­дет ис­поль­зо­ван стан­дар­т­ный­, обыч­но pri­va­= te. Мо­ди­фи­ка­то­ры дос­ту­па - это клю­че­вые сло­ва, оп­ре­де­ля­ющие, от­к= у­да мож­но бу­дет по­лу­чить дос­туп к дек­ла­ри­ро­ван­ной пе­ре­мен­ной­/фун­= к­ции и пр. Их все­го нес­коль­ко:

    private - дос­туп воз­м= о­жен толь­ко из­нут­ри клас­са, в ко­то­ром объ­яв­ле­на.

    protected - дос­туп воз= ­мо­жен из это­го клас­са и всех нас­лед­ни­ков.

    internal - дос­туп воз­= мо­жен из всей as­sembly (сбор­ки/биб­ли­оте­ки, фай­ла ко­ро­че). Так­же при­ме­н= я­ет­ся для клас­сов, enum и ин­тер­фей­сов.

    public - дос­туп воз­мо= ­жен от­ку­да угод­но. Так­же при­ме­ня­ет­ся для клас­сов, enum и ин­тер­фей­со= в.

    Есть еще мо­ди­фи­ка­то­ры сос= ­то­яния, оп­ре­де­ля­ющие прин­ци­пи­аль­н