Справочник C# Кратко, быстро, под рукой
Справочник C# Кратко, быстро, под рукой
Справочник C# Кратко, быстро, под рукой
973
ISBN 978-5-907592-06-3
Серия «Справочник»
Справочник будет полезен всем, кто использует или изучает С#: от на
чинающих до профессионалов.
Все права защищены. HикalWI часть данной книm не может быть воспроизведена в какой бы то ни было форме без лисьмснно1u раэрешенИJ
впадельцев а!JfОрскн х прав.
Издпельство не несет ответственности за возможный ущерб, причиненный в ходе исполаювани.ч материалов данной книm, а таюке за
доступность мпсриалов, ссылки на которые вы можете найти в )ТОЙ книге. На момеm подrотовки книги к изданию все ссылки на интернет
ресурсы были действующими.
ISBN 978-5-907592-06-3
Контактные телефон1,1 издательства:
(812) 412 70 26
Официальный сайт: www.nit.com.ru
© Евдокимов П. В.
9 J5 2063 >
© Издательство Наука и Техника (оригинал-макет)
Содержание
ГЛАВА 1. ВВЕДЕНИЕ В .NET...............................11
1.1. ЧТО ТАКОЕ .NET..........................................................................12
ГЛАВА 4. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАННЕ ........................................131
4.1. основы ооп ....................................................................................................132
6.5. СТРУКТУРЫ........................................................................................................229
Введение в .NET
Справочник С#
Первая версия .NET появилась лишь два года спустя - l мая 2002 года.
В целом, таблица l. l содержит информацию обо всех версиях .NET, вы
пущенных с 2002 года.
Windows Vista,
Windows 7, Win-
2.0 11 июня 2005 г. Visual Studio 2005
dows Server 2008
R2
Windows Vista,
Windows Server
Visual Studio 2005
3.0 6 ноября 2006 г. 2008, Windows 7, 2.0
+ расширения
Windows Server
2008 R2
Windows 7, Win-
3.5 9 ноября 2007 г. Visual Studio 2008 dows Server 2008 2.0, 3.0
R2
Windows 8, Win-
4.0 12 апреля 2010 г. Visual Studio 2010
dows Server 2012
Windows 10
4.6.2 20 июля 2016 г. - 4.0-4.6.1
v1607
Windows 10
4.7 5 апреля 20 l7 г. Visual Studio 2017 4.0-4.6.2
vl703
Windows 10
17 октября Visual Studio 2017
4.7.1 vl 709, Windows 4.0-4.7
2017 г. vl5.5
Server 2016
•1<:1 Справочник С#
Версия 4.0 появилась в 2010 году вместе с Visual Studio 2010. Нововве
дений довольно много:
http:/lwww.codeproject.com/Articles/599756/Five-Great-NEТ-Framework-Features
Версия 4.5.1 является обновлением для 4.5 и выпущена в 2013 году вместе
с Visual Studio 2012. Данная версия поставляется вместе с 8.1 и Windows
Server 2012 R2, а минимально подцерживаемая версия - Windows Vista
SP 2. Версия 4.5.2 является обновлением для 4.5.1, 4.5 и 4.0, но может
быть установлена на одном компьютере вместе с версией 3.5 SPl.
https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/versions
and-dependencies#net-framework-48
Сам по себе Java - очень элегантный язык, но у него есть одна потен
циальная проблема: применение Java означает необходимость исполь
зования Java в цикле разработки и для взаимодействия клиента с сер
вером. Другими словами, Java очень сложно интегрировать с другими
языками, поскольку он задумывался изначально как единственный язык
программирования и единственная платформа для удовлетворения лю
бой потребности. Смешать Java с другим языком будет очень сложно,
поскольку ограничен доступ к Java API.
1.7. Язык С#
Поскольку платформа .NET радикально отличается от предыдущих тех
нологий Microsoft, корпорация разработала специально для нее новый
язык программирования - С#. Синтаксис этого языка похож ... на Java.
Даже не на С++ (хотя язык называется С#), а именно на Java. В прин
ципе, все эти языки - С, Objective С, С++, С# и Java - используют
похожий синтаксис. Все они являются членами семейства языков
программирования С.
Глава 1. Введение в .NET св•
Несмотря на схожесть с Java, многие синтаксические конструкции в С#
моделируются согласно различным особенностям Visual Basic 6.0 и С++.
Как и в VB6, в С# подцерживается понятие формальных свойств типов
(вместо традиционных методов get и set). Как и в С++, в С# допускается
перезагрузка операций, создание структур, перечислений и функций об
ратного вызова.
С появлением .NET 4.0 язык С# снова бьш обновлен. Появился ряд но
вых функциональных возможностей, а именно:
Характеристика Описание
Каждый класс должен настраиваться с атрибутом види-
мости (visibility). По сути, данный атрибут указывает,
Степень видимости должен ли класс быть доступным внешним сборкам или
его можно использовать только внутри определенной
сборки
void Press();
Глава 1. Введение в .NET со•
От самих интерфейсов проку мало. Однако если они реализованы в клас
сах или структурах, то позволяют получить доступ к дополнительным
функциональным возможностям за счет добавления просто ссьшки на
них в полиморфной форме.
struct Nums
System.Decima\Deci-
decimal Decimal Decimal
mal
System.Boo\eanBool-
Ьоо\ Ьоо\ Boolean
ean
long х = О;
System.Int64 у = О;
System.Data.SqlClient
System.Windows
Является корневым для нескольких пространств
System.Windows.Controls имен, предоставляющих набор графических инстру-
System.Windows.Shapes ментов WPF (Windows P resentation Foundation)
System.Xml
System.Xml.Linq Здесь содержатся многочисленные типы, которые ис-
пользуются при работе с ХМL-данными
System.Data.
DataSetExtensions
using System;
using System.Drawing;
using System.Windows.Forms;
ГЛАВА 2.
ПЕРВАЯ ПРОГРАММА С#
•t<-J Справочник С#
http://net-framework.ru/soft/asoft-net-version-detector
Кow/1.ioтep\HКEY_LQCALМACH1"4E\SOFТWARE\,Мk.to,on\NEТ F� Setup\NoP
j MpSigStuЬ " Имlll T•n
) J МSВuilcl
З,.11-.!f4.ef'
�)(По yt,taJ1<1•1-ttМO) REG_SZ ан...-ме roe щмс1ЮеtЮ)
> MSDE
> 1 MSDRМ
> JI MSDK
> J MSf
> МSIME
> J м�,ng
1-1 MSМQ
J I MSNApps
) :J MSSQl.SerYtt
> J МТF
f· ' ""'""""""'
>. MfFЩ)l.rtT�
> • МTTKeyt,o.�ing,
>• Muitttnedi•
>JI Мultivaii•nt
.., 1 NfТFr.amewott�t\ip
� i1Ч!!)
1 > J COF
"'ш
::
>:
: jl vЭ.S
1 > ...
!' v ;J 114.0
1
1
! L J Cl1tnt
1 0S lrllegr•tlon
:, """"
,.._,
KOW'!...OT!p\HO:EY_tocдLМACHINE\S,OnW�uosoft\,ЧEТ Fr,mewooc Setup\NDf'\"4\full\10]]
�=ub
11 ,r·: мsо,
т,n
REG_SZ (5к--��,
R[G,_D'№RD 0.0000000,(1)
;, ,1. МSОМ1 R E G [)W()W
_ 0-0000000, (1}
,.!мят:
REG_DWORD OxOOGSOeti1 (S28049'1
7;) MSf
> t MSIM[
� MSUc�nsing
R [ GO_ WORO
REG..SZ
REG_5Z
.....
� {О)
1: � :�:...
1.1
1 1:: :·
:1· ! j i ) J Client
1 •
@1;,о;.kт Ш&t-iШ
.НЕТ Ffмnewort 4.8 млn более ncв:»tet o6ttoeмщte y,u �ы Н�11 пом ммnыаrере. Рис. 2.4. Установщик .NET
Framework 4. 6.1: установле
на более новш, версия
if (name != "")
continue ;
el se if (install == "1")
https://go.microsoft. com/fwlink/?linkid=2088631
,..,,:,os<,l'r .r,;n r,,_..,,.� Н! - )N •..,.:,,,,.<•>f>,<t,:<.c•d<><- 00>+:)ОМ:""" ..� ...�,.. V<• .NП Fr11:'tl•-·� 4
1- }Hiitнiiil
4.5,<1.S.1,.is.�,4.6.•H,.1. ..i6.2,.i7. •.71 и-4.�.l.
А•т,:,,,-,u....,· '1�<.,Т UО»:,Ю ""'"°"""''°"•,>Tk О ,,...,.,...,,�><. .!А � ,,_ш, �,о 4Т 6_,•,. ,., ><>011>1
.,� J� <;1<у,с·101<11 ,ю.-км.,,..,.,.,,. ,,,,,,,r ·••i- 3'ют """"' б<-,ь,,.�. ,,_.;., y,,,.....,..w, , ,,.,
,.,_,.к,...,от • ..., �"��'"'· f'••o..,..'<,11· .,,,."' "" ,,. / ,:1•tю•щи� ""•�cr<> ,,.,,_,.,...,,о
уп,>,,.:,ощ.....а ,:,.,� ,,nтнм.мькоil п;ю.,�,к:;�,<ТС"J;Ь•«=<тм и тp�<JWl�><i,il � np<>�y(кж>it ,ncc<-�-IO<T"
Ясное дело, что когда у вас будет серьезный проект, вы создадите для
него инсталлятор, который будет автоматически загружать нужную вер
сию .NET Framework. Поэтому данный раздел предназначен больше не
Справочник С#
1
8§1 Microservices
о.-�»�-'И'IФt�
..,1mн1:•·••<бttu\l\"1\lr>P<.�1:\ol
И.l;e-r�-VIШl!StudioCommunll)'I022f>f�-17дO�<l.1 Х
о
Раб чие нагрузки О,,де11ьные 1tомnонент"1 Яsыковые пакеты Расnопожения установ�си
х Сведения об установ1ее
• Р.uраtю-тк. кпассичеа:мх nрМJЮЖ•···
Кл&есические м мобильные приложения (S)
_, Qlet,CТN ра]р"6.лl(М КМCO''lfCIOOI npi'!A.�
1 � =.6::;:::;��:�:т
� (!)еДСТ.8 Pl)p86on:м A/ljll Ml!ФOt)O,lllil .Ne••
Р«--.
C�,.l'rogritmF.-,,�ViWfl�l\PI....,.- ,1.,,_..,...._.
rlf)QIIOIOQ,.,_t!pl'__.)'(AOe,.•�AA•ew6�..н,;woaыnrcuViswl!it-.юio.Mw1.-::enpe,t,11,1,_��0<eщ1n.c Oбiiier>le06��12.0SГБ
�Studio.llP)f'Oenpofl)fW-�0мoJ.11�1"1J)\fe'J<:1101д1!/l""'°'Q«)'UЯIIOl-��.t\.��!�M�tl
<:OП)'m�JIIШC't<--np,;tAW\..:I"IJWY-np,,o-�ycМ)&ИJl,rю;."'4(i('1<3><i\.
��1IOU.1-1,'!WМS!OO'OC,ommumyl022i>rtмw-17дll�4.I
Рабочи� наrрузки DтАел•ные 1Сомnож�нты Яэыкоеь1е f\31(e'f"8 Расгооложе,ния устаноеtеи
Сведения об установке
.NET • РаэраЬот1<11 класс:ичеа:им nрилож•...
.NЕТ ""•mewotl( 4.б f..-getil\9 РаС11:
ГJ .NЕТ F11mewoft.4.6.1 Tм�lin9 P.кlr. -, �AOU ра-6Qт�11 �IIXЩ)'!.�..
-, С�• l)f)paбoflCII -'l!Я Mil,�...N€_.
l"."_"j .NEТfr1�""-'П.t6.2T1�ЩP.к.t
_, О11�В.iс:
(..; .NEТfr�.a,т.-�ingPIO
•д«ю!!t�ТU�
: .NEff•1�.a7.1Т1rgellfl!iJl't<t J2 Cl)",V:,Ul),l,pюoootAМ,.N(Т
t2 .NHfr1�◄.8Tм9etirlgl'Ю 5 �-�и.NHfr.ameworl\4.0
Г\.NfТММXSOКfo,Android t!J � for 'tllsuм SШdio
rJ .NftМAUISCЖkWIOS r',,il � ....�[niityfr.-tЬ
[.. i .NfТMALIISO!(forMKC��1 rJ C;,,e.liCIU l'll)Oф>1ll"l)ONК,.. .NH
е'.,1 mt�i(ode
f',I J!Т-оr�цщ<•
["OJ .NЕТ SDK f.:.r Android
1!.) LМ"SMt'1!
\"_""j ,NE! SOK 1.х Andmi,J v.il.t• ЮТ
ISI ML.NEТМool!IBuildt'f
;__ ; .NH SOK lor IOS
[".""jn�я-Ff.L'IЯIUIКCl<<tКDUIA...
l.. : .NEТЯЖlorM,c:C�.tt,,d П Pr�Proi;e<:tion-Octtusct:or
f" .Nff�t:l'f'Ьuildlooll; !!Cpц,.re,1PJ�6oц,,.NEТFr-1t-t.6...
n
·-�
MLNEТModr!Buil<Ж : : r_,_-"-�!!МОЙ6"о6мL
Г' ПимIOICpv,.!'«!frМ!"l/l'\NO/t4.f>.1 ]Wi�Com""-"'Ulioofowю,,tioo,
.. ,,. --;:,.,t
И,.l'"l"yct6НOIIO-V'1SUll9.\JdlQ�20Ul"l"t'>'iew-17.0.0�4.1 х
Рабочие нагрузки ОтдеJlьные комnон�нты Языковые п;1кеты РасnОJ1ожени,� усrановки
Иll"rerpмpoм1<�q>t.pp.1�Viw11Stud,0Q
Сведения об усrановке
::���;�:f�����i�� St���-��� .. 4.зrr.
• Раэработка к11ассических nриложе.,,
... i:IJJOO-Чe:>I()
V Ч)l!,11С"1"а1 �хмrюrк11 ц,с<.,.чесК11� n�.�-
"' (Pf".IIC"fblfmpIOOШl�Mllrфcpl.<ы.Nf ...
,-��Proor�D·�-i,\М��ft\v���io\P� .. ,..
цrrr.
,_
C�tmГ�es\Microюt.�Sl.udio\2022\Pmw
�illl, ... npw!IIIAИ""e)'(№8>tll"l'\�A!111�1""1)'CQ�Stuala.Mwтea;enpeA/l.,._803/Ю:w:,,oc::n.<:f.8ЩT11,C О6ще,е lfeOбm,._ �IК1'8С 12,0S fБ
\l'&nl!St\ldio.4A1c,enpcrp.m11t№e �i<e.Oo40Jl�p)'e!OI " \)'t"�Q� )"(IШl(>l)U.t..,��1�;:;,,�Mlll>I
conym-1� /1.o!tJ;Ьm<"- Продоюа,�. IW тн:же r.p,,>1-Tt' )CIICIЖ• ,tюе /1.11Цеt\5!11.. Ytl"iJt1080"1И(QЦl<l.)ltlll>I � �tнOelfl"lt
"-"·""''"°'"l·Nt:l6�-.<.:,ndid•1•·1
� <11\'! lwl>J')'to•·.-.e- ,Nl:1'6�11:.e CМ\tlidM...
&�noc:М!)'("l....,_"1'
iЬ-...ly.N!f,m,t,Y-:m"\,'wiltli-'mth.r.t:',,<(y�
"3-т..w о �._:пуаt.(1 :;,:,cts t� шVilt.<41SшdOl>�UU
v�<;IU(l>ozo.l2 lsne<• «ldl$ mo<•ninomia...
ц;ц:rv11t,1,�lfkl<
х Вы можете зарегистрироваться
прямо сейчас, а можете при
Visual Studio следующем запуске IDE. Далее
Запуск в знакомом окружении
Visual Studio предложит
Параметры разрабо-тк:и:
выбрать тему (ее также можно
будет изменить позже) - синяя
Выберите цветовую схему
(по умолчанию), темная или
светлая (рис. 2.12). Хотя по
умолчанию используется синяя
тема, для этой книги с целью
1я.
О Сини� {Аоnолн�тепьн... () Синяя
улучшения иллюстраций будет
гс
--: - ~'
_,.,,...,;,.,.:r.,.,;i..,..,..,.,.,,..,,.,.,.. ,_,�...,,.,.м.,.,.,,_,'71/,:ff
c�o.<c��A••fu.oc-:,;oroдc;,l')'М
..
'1p,-мtn0.
lli�-"�"�
,),-r. .t�� <йW"><t< l'lf)I,\-�,.,� ��м 'Тl'КШt. ... ттмн-п! -
--
•"'""""11':...::<"•q,<,Ч ><H<,:.,..aW:-...S.L�IIIC>'W�OS
(
""""
- •• х
: =!]t�
: �
11
е ><
........... ..... ........:1....... ... ........ .. .. .... Н............��; :� � С tl 16 .-"El. ..
,:?���:;
!, 5,.., htti:,1.;.l :..Jц....1tS.lмr.::�11JЦfllA::1�l&.U i'<ar -:r,i, ir,f-,,..,,iti.<::>
C:»>м:'\.,o.1"rit.t..:i,-e(�КcL\o, W..r\.dt•);
1
.,.
i l:Yt:!:�:��:::r:��,. ,�'�t;"?rr·
�...... ··""''"i>\){iS>'
.,,д..•
i':•>.,;,::Jy.:.,.;:,_..,,
n�- CJtLF ;;
� ., " 1' ., �! � нeilQ • Нello > Ьin > 0eЬug > net6.0 v r; j., :l..'H(")',nt"l.f•G
................................................. •
8Р.а6оч�,ilстол
_iз.,оу,ос,,
j;,Qoq�"''"'
".,J06pu:�.мi
{1Нei!o.1U11tfmecмf'9
•·QrleC)rille
) f!111ю6р11-�
>O�"'u
►-Р-6о<,14$11с,о,о
Вот теперь у вас есть понимание, что такое .NET Framework, и есть среда
для написания .NЕТ-приложений. Значит, вы полностью готовы к даль
нейшему изучению .NЕТ-программирования.
namespace Hello
class Program
Console.WriteLine("Hello, world!");
Среда Visual Studio 2022 генерирует код шаблонов в стиле .NET 6. Хотя
это две одинаковые программы. Разница лишь в самих шаблонах. Вы
можете использовать как новый стиль, так и старый стиль. Чтобы ис
пользовать старый стиль, сохранив целевой платформой новейшую .NET
6, введите команду:
При создании нового консольного проекта в Visual Studio вам будет пред
ложено выбрать целевую платформу. Выбрать 5.0 нельзя, но в файле
проекта нужно произвести следующие изменения:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netS.0</TargetFramework>
+ <TargetFramework>netб.0</TargetFramework>
Справочник С#
<ImplicitUsings>enaЫe</ImplicitUsings>
<NullaЫe>enaЬle</NullaЫe>
</PropertyGroup>
</Project>
ОСНОВЫ СИНТАКСИСА С#
•ro Справочник С#
• using System;
• using System.IO;
• using System.Collections.Generic;
• using System.Linq;
• using System.Net.Нttp;
• using System.Threading;
• using System.Threading.Tasks.
- 1) х
[:j
• ..• ()l\.(_\�t!!•�"�
·+
�
� .. 'iэ-::a•,r;
.•.•• ' "'''"'�"""""''··· �•w"'""'
,.ь·1 р.
е:1 � ..
�,•1,,no· lr.poell,fМ' 1 � 1;
1
(
�.<'lt>';<>\� .W,,,.Ji·.t•.l.n•(•t,•\lo, ,rnrtdt•);
'"
,, t>
16
Рис. 3.1. Среда VS 2022 безо всяких возражений приняла код в традици
онном стиле
namespace Hello
class Program
{
static void Main(string[] str)
Console.WriteLine("Hello, world!");
Пример:
• 'х
р.
..........
Рис. 3.2. Параметр <<Автоматически запускаемый объект" позволяет
задать объект, из которого будет вызван метод Main()
Console.WriteLine("Hello, world!");
Console.ReadLine();
Метод Main() можно задать иначе, чем приведено в листинге 3.1. Глав
ное, чтобы в программе был идентификатор Main() в одном из классов.
А как он будет определен, то есть какие параметры он будет принимать
и что будет возвращать, компилятору все равно. Рассмотрим несколько
вариантов этого метода:
return О;
t! � --�!'!,ma;r;;:,,,. "'"'>'<"""
i np>11!()Ж!H<t<<!
r., ••
i
е i"J!k'J
СЩц
lf
-� fl3i«!•
11.;.:::
Ccxtf,ЩlfJ,$
"'"""= r
Иc---�-.,..o•-n-n,�
CJ У..uы,и: '"'-'Cl'k\t'<lll<-.�>u«ыы:11 "'"Р"'--«еу ttaYA��,,(>l,O OI0""1-Pte.
П.,pe--q>e,\W • • х
r"'j,_\<': ,·;,o-;;t,c .,,,,,�,;.-+<-«>(о>ОСZ,<М<� !��,.,_ '><'Yt"-" '\il!"'"'-Иt-1 :11,'1<'1(0
r;,,p,-..,,,.,...-"'P.•::it,,;,11,,...,.,.•.,_,..,.."i,;,,.,..,,.,,_.,,..,..P<",._,,.,...,..,,.,.__,,,....,,�._....-,.,.,,,.,
�><;,,vи,1 �'<lt�"''" ,.,.;_ 111,-.,,�_.,,:,. �'"t���-,�1 "-��, ✓,,,\>N'...,,J_,•.-,:,ж1. 3•>N,,,O<ll :< "IKJ�
Р�f.•••••::м .,..,,,,,., ,�,,,,_,., "'>"'-'«'>yt,-,.v,_,..,,,. < ,......,,,,.,._ю ,.,_� ...,n,.- ;,';
"
А
р ••�:�•,,М•\\•Nbl
·1---
: !\�,!::�:,?��-,:.�: � · •:.,
. Cll "-..i. 'H<IIIO' .,""'°"lfl"'; 1 ,_ Jj
-:;ф;'•-
И
1: �\..f;�A�=�:
� f.tc"t.ir; v<>id "".iн(,.тri.ng[] [f\·r)
f • �JJl'rtli:,.1111
11- -Jil••<=..-
► t:•P,�f""'-"!i
{ //C<,r.�,)le.iolritll.'1...1"�(•«.,.\L<::, :.<.=1·\d! );
м
;���::::�:: �;::�:�1�;'Я/���j1�;;�����-!�;_;�;;
<<>n:<.,r,;!,,:.�.rH.,("!m•Jlмr♦ <::0<1• ,.,._n; •);
fitri.r.g \ls"r,,«,.., .. f: ....��l"'·.il"'"'<i'·.:1""�1• ,;,·
<мм:-1.<': .itri.t.,..L.i.n.,(�f!p1<м.- {е} !", u.serna.м)-;
<:1>"1-<'\s-.l<ei.1H..:i1>,..(};
Примеры:
Console.WriteLine("Знaчeниe 123456 в разных форматах:");
Console.WriteLine ("d7: {0:d7}", 123456);
Console.WriteLine("c: {0:с}", 123456);
Console.WriteLine("n: {0:n}", 123456);
Console.WriteLine("f3: {O:f3}", 123456);
,.. C.'\WindOWs\SystemЗ2\cmd.e1e о х
ulong System.Ulnt64
о... 18 446 744073
Нет
64-битное число
709 551 615 без знака
32-битное число с
float System.Single +1,5х10-45 ... 3,4xl038 Да
плавающей точкой
decimal System.Decimal
±l,0xl0e·28 ... Да
96-битное число
-7,9х1028 со знаком
64-битное число с
douЫe System.DouЫe 5, Ох 10·324 ... 1, 7х 10308 Да
плавающей точкой
Ряд символов
Ограничен объемом
string System.String Да в кодировке
доступной памяти
Unicode
Используется для Базовый класс
object System.Object хранения любого Да для всех типов в
типа в памяти .NЕТ
int Х;
х = О;
int х = О;
int х = 1; у = О;
int а, Ь, с;
Примеры:
bool Ь = false;
int х = О;
• Epsilon - эпсилон;
• Positivelnfinity - положительная бесконечность;
Пример:
int х = int.MaxValue;
douЫe d = douЫe.Epsilon;
Пример:
Console.WriteLine("{O}", char.IsDigit('l'));
Член Описание
Базовые операции
Работа с членами System.String осуществляется довольно просто -
нужно объявить переменную типа string и получить доступ к методам
(членам) класса через операцию точки. Но имейте в виду, что некоторые
члены System.String представляют собой статические методы и потому
должны вызываться на уровне класса, а не объекта.
string h = "Hello";
Console.WriteLine("h = {0)", h);
Console.WriteLine("Длинa h = {О)", h.Length);
Console.WriteLine("h в верхнем регистре {О)", h.ToUpper());
Console.WriteLine("h {0)", h);
Console.WriteLine("h в нижнем регистре {О)", h.ToLower());
Console.WriteLine("h {О)", Ь);
Console.WriteLine("h содержит е? : {О)", h.Contains("e"));
Console.WriteLine("Зaмeнa {0)", h.Replace("lo", ""));
Console.WriteLine("h = {О)", h);
Console.ReadLine();
\ ■ C:\WindoWS\system32\cmd.exe • Hel10 □ х
h = h. ToUpper() ;
Сравнение строк
Для сравнения строк используется метод Compare(). Существует много
разных форм вызова этого метода. Рассмотрим формы, использующиеся
для сравнения целых строк:
puЫic static int Cornpare(string strA, int indexA, string strB, int indexВ, int
length)
puЫic static int Cornpare(string strA, int indexA, string strB, int indexВ, int
length, Ьооl ignoreCase)
puЬlic static int Cornpare(string strA, int indexA, string strB, int indexВ, int
length, StringCornparison cornparisonType)
puЬlic static int Cornpare(string strA, int indexA, string strB, int indexВ, int
length, Ьооl ignoreCase, Cultureinfo culture)
puЬlic static int CompareOrdinal(string strA, string strB)
puЬlic static int CrnpareOrdinal(string strA, int indexA, string strВ, int indexВ, int
count)
Синтаксис Описание
Поиск в строке
Для поиска в строке в С# есть множество методов. Начнем с метода
Contains(), который описан так:
string s = "Hello";
char[] Ch = { '1', 'о' ) ;
if (s.IndexOfAny(Ch) != -1)
Console.WriteLine("Oдин из символов был найден в позиции {0)",
s.IndexOfAny(Ch));
Конкатенация строк
Переменные типа string можно соединить вместе, то есть выполнить
конкатенацию. Для этого используется оператор +. Компилятор С#
Глава 3. Основы синтаксиса С#
string s1 "sl";
string s2 "s2";
string s3 s1 + s2;
Получение подстроки
Получить подстроку можно методом Substring(), обладающим следую
щим синтаксисом:
Послецовательность Описание
\r Возврат каретки
Пример:
// Выведем две пустых строки и звуковой сигнал после слова Hello
Console.WriteLiпe("Hello\n\n\a");
Строки и равенство
В языке С# операция равенства предусматривает посимвольную провер
ку строк с учетом регистра. Другими словами, строки Hello и hello не
равны. Проверку на равенство двух строк можно произвести или с по
мощью метода Equals(), или с помощью оператора ==:
string s1 = "s1";
string s2 = "s2";
Console.WriteLine("s1 s2: {О)", s1 s2);
s1 == s2: false
using System.Text;
Г• C:\W!ndows\Systemll\cmcl.ex� - Hello о х
Console.Write(" {0}",i);
// Здесь заканчивается область видимости i
int k = 5 * i; // Оператор не будет выполнен
return О;
namespace ConsoleApplicationl
{
class Program
{
static string uname = "den";
Обратите внимание, что в данном коде есть поле (член класса Program)
и локальная переменная с одинаковыми именами - ипате (объявлена в
методе Main()). Когда вы запустите этот код, вы увидите строку «johш>.
Приоритет у локальных переменных выше, чем у членов класса, поэто
му вы увидите именно эту строку, а не строку «den». Об этом следует
помнить.
3.4.7. Константы
Константы - это переменные, значение которых нельзя изменить во
время выполнения программы. Константа объявляется с помощью слу
жебного слова const, после которого следует тип константы:
Особенности констант:
3.5. Операторы
3.5.1. Арифметические операторы
Арифметические операторы представлены в таблице 3.6. Операторы+,-,
* и / работают так, как предполагает их обозначение. Их можно приме
нять к любому встроенному числовому типу данных. Думаю, в особых
комментариях данные операторы не нуждаются.
Оператор Действие
+ Сложение
- Вычитание, унарный минус
* Умножение
/ Деление
% Деление по модулю
-- Декремент
++ Инкремент
int а = О;
int х = 1;
а = х++; // а = 1, х = 2
а = О; х 1; // исходные значения
а = ++х; // а = 2; х = 2;
https:/lwww.tutorialspoint.com/compile_csharp_online.php
Оператор Значение
- Равно
!= Не равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
Оператор Значение
& и
1 или
л Исключающее ИЛИ
&& Укороченное И
11 Укороченное ИЛИ
! НЕ
Пример:
bool t = true;
int i = О;
// При использовании обычного оператора, в данной конструкции
// i будет увеличиваться
if (t 1 (++i < 5))
Console.WriteLine("i равно {О}", i); // i 1
i = О;
// При использовании укороченного оператора
// значение i останется прежним
if (t 1 1 (++i < 5))
Console.WriteLine("i равно (О)", i); // i О
Оператор Значение
& Поразрядное И
1 Поразрядное ИЛИ
л
Поразрядное исключающее ИЛИ
<< Сдвиг влево
>> Сдвиг вправо
~ Дополнение до 1 (унарный оператор НЕ)
Wt<J Справочник С#
namespace Hello
{
class Program
return а + Ь;
с = 3000
Глава 3. Основы синтаксиса С# 1-F:1-
Теперь рассмотрим листинг 3.3, попытка скомпилировать который при
ведет к ошибке компиляции. Измененные строки выделены жирным.
namespace Hello
class Program
return а + Ь;
� VI!� (4:щ:.., .il'A Uit � 1.бо:>""' Q,,-.цц 1�� д.!ц� (;:,1Ц<m:<1 V�o,pe,t"" Q«:,ю Crr:»ti,I tJ c,,.t��:,i;.,,(Г, р №11◊ 0 )<
• 1111 � � 't,..щ �/· � .s ��Sh;,1� й Е"'�"Ш
��,
;i;;
'0011. •;Q 01 A,J:>
•• х
кы 86 ФMJ9Мlfd§l§II В1Ы·,ФИМ11'1445%ФМ41
short с = (short)Add(a, Ь)
8 C:\Windows\system32\cmd.exe - Hello о х
try
{
short с = checked((short)Add(a, Ь));
Console.WriteLine("c = {О)", с);
Console.WriteLine(ex.Message);
unchecked
var А О;
var s "String";
// Правильно
var variaЫeЗ О;
// Ошибок нет
var Х = О;
var У = Х;
string str = "Hello!";
var world = str;
3.8. Циклы
В любом языке программирования имеются итерационные конструкции,
использующиеся для повторения блоков кода до тех пор, пока не будет
Глава 3. Основы синтаксиса С# IWZIMiii
выполнено какое-то условие завершения. В языке С# поддерживаются
четыре таких кoнcmpyкцuu:for,foreach, while и do/while.
3.8.1. Цикл/оr
Идеальное решение, если нужно выполнить какой-то блок кода фиксиро
ванное количество раз. Операторfor позволяет указать, сколько раз дол
жен повторяться блок кода, и задать условие завершения цикла. Первый
параметр оператора/оr задает оператор, который будет выполнен до пер
вой инициализации цикла. Обычно здесь инициализируется переменная
счетчик. Второй параметр задает условие выхода из цикла, а третий -
оператор, который будет выполнен после каждой итерации. Но, думаю,
вы все это знаете.
Небольшой пример:
int[] digits = { 1, 2, 3, 4 };
foreach (int i in digits)
Console.WriteLine(i);
while ( логическоевыражение)
оператор;
do
(
// тело цикла
}
while (условие);
Пример:
int i = 1;
do
Console.Write(i);
while (i++ < 10);
Синтаксис оператора if/else такой же, как в языке С/С++. Но, в отличие
от С и С++, в С# этот оператор может работать только с булевскими вы
ражениями, но не с произвольными значениями вроде -1 и О. Учитывая
этот факт, в операторе if/else можно использовать следующие операции
сравнения:
• < (<=) - возвращает true, если выражение слева меньше или рав
но, чем выражение справа: if (price < 100);
• > (>=) - возвращает true, если выражение слева больше или равно,
чем выражение справа, if (price > 200).
int k = 100;
if (k)
{
// do something
• && - условная операция AND (И), возвращает true, если все вы
ражения истинны;
else
string OS = "Linux";
switch {0S)
3.1 О. Массивы
3.10.1. Одномерные массивы
Массив - это набор элементов данных одного типа, доступ к которым
осуществляется по числовому индексу и общему имени. В С# массивы
могут быть как одномерными, так и многомерными. Массивы служат са
мым разным целям, поскольку они предоставляют удобные средства для
объединения связанных вместе переменных.
<тип>[] <имя>;
Глава 3. Основы синтаксиса С# 1-z1•
Пример:
ints[OJ 12;
ints[l] 15;
ints[2] 22;
ints[ЗJ 5;
ints[4] 122;
Ранее было сказано, что массив - это набор элементов одного типа. Но в
С# есть одна уловка, позволяющая помещать в массив элементы разных
типов. В С# поддерживаются массивы объектов. Вы можете объявить
массив типа object[] и поместить в него элементы самых разных типов.
Вот как это работает:
int[] ints { 1, 2, 3, 4, 5 };
Console.WriteLine();
Здесь размер обозначает число строк в массиве, а память для самих строк
распределяется индивидуально, и поэтому длина строк может быть раз
ной. Пример работы со ступенчатым массивом приведен в листинге 3.4.
Console.WriteLine();
for (i = О; i < 5; i++)
myArr[l][i] = i;
Console. Write ("{О} \t", myArr[1][i]);
Console.WriteLine();
for (i = О; i < 4; i++)
myArr[2][i] = i;
Console.Write("{O}\t", myArr[2][i]);
Глава 3. Основы синтаксиса С#
Для создания массива можно использовать еще и класс Апау. Класс Апау
является абстрактным, поэтому создать массив с использованием какого
либо конструктора нельзя. Но вместо применения синтаксиса С# для соз
дания экземпляров массивов также возможно создавать их с помощью
статического метода Createlnstance(). Это исключительно удобно, когда
заранее неизвестен тип элементов массива, поскольку тип можно пере
дать методу Createlnstance() в параметре как объект Туре:
Array.Sort(rnyArr);
Console.WriteLine("\nПocлe сортировки:");
foreach (int i in myArr)
Console. Write("\t {О}",i);
Глава 3. Основы синтаксиса С# t<:JMHI
■ C.'\WindOWS\System32\Cmd.eic-e - �По о х
Массив может выступать как параметр метода. Также метод может воз
вращать целый массив. Рассмотрим небольшой пример описания мето
да, принимающего массив в качестве параметра и возвращающего также
массив:
3.11. Кортежи
В отличие от массивов (которые содержат объекты одного типа), корте
жи (tuple) могут содержать объекты самых разных типов. Кортежи часто
используются в языке F#, а с появлением .NET 4 кортежи доступны в
.NET Framework для всех языков .NЕТ.
Console.WriteLine("Bвeдитe текст:");
string[] tArr;
string text = Console.ReadLiпe();
tArr = text.Split(' ');
Console.WriteLiпe("Koличecтвo слов:");
Console.WriteLiпe(tArr.Leпgth);
Console.ReadLiпe();
8 C:\Windows\system32\cmd.exe • Hello о х
using System.Text;
using System.Threading.Tasks;
namespace Hello
class Program
Console.WriteLine("Bвeдитe текст:");
string[] tArr;
string text = Console.ReadLine();
tArr = text.Split(' ');
Console.WriteLine("Koличecтвo слов:");
Console.WriteLine(tArr.Length);
Console.ReadLine();
Зх 3 - 2х2
3 * х * х * х - 2 * х * х;
Но, согласитесь, это не совсем правильно. Думаю, читая эти строки, у
вас созревает лишь один вопрос: а зачем приводить столь простой при
мер? Но этот пример не так прост, как вам кажется. Не стоит забывать,
Глава 3. Основы синтаксиса С# k№:JMW
что вы программируете не на С, а на С#, где все представлено в виде
объектов. Полный код приложения приведен в листинге 3.7, а результат
выполнения программы - на рис. 3.14.
r--···--··
' 8 C.'\Windows\system32\cmd.exe о х
namespace Hello
class Program
Console.WriteLine("Bвeдитe Х:");
string t = Console.ReadLine();
int х = Convert.Toint32(t);
int i;
•t-t/,1 Справочник С#
douЫe sum = О;
Console.ReadLine();
8 C.'\Windows\system32\cmd.exe • Hello о х
namespace Hello
class Program
douЫe а;
douЫe Ь;
douЫe res О;
char oper;
Console.Write("\nBвeдитe оператор:");
oper = Convert.ToChar(Console.ReadLine());
if (oper == '+')
res = а + Ь;
.res а - Ь;
if (Ь ! = 0)
res = а/ Ь;
else Console.WriteLine("Ha О делить нельзя!");
else
Console.WriteLine("Heизвecтный оператор.");
Console.ReadLine();
cla s s Pr o gram
int i = rand.Next(lO);
int х = Convert.Toint32(Console.ReadLine());
if (i = х) O:nsole.WriteLire(''В,r �! �!");
else Console.WriteLine("K сожалению, вы проиграли.
Компьютер загадал число {0)", i);
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ
Wl<1 Справочник С#
class имя_класса {
// Объявление переменных экземпляра.
access type varl;
access type var2;
// . ..
access type varN;
// Объявление методов.
access return type methodl ([args]) {
// тело метода
namespace ConsoleAppl
class Program
class Sysinfo
{
puЬlic string win, net, cpu;
puЬlic string hostname, username;
puЬlic Sysinfo()
{
net = Environment.Version.ToString();
Глава 4. Объекrно-орнентированное программирование
string р ;
switch (р)
case "cpu":
Console.WriteLine("CPU count: {О}", info.cpu);
break;
case "win":
Console.WriteLine("Windows Version: [О}", info .win);
break;
case "net":
Console. WriteLine(".NET Version: {О}", info.net);
break;
case "host":
Console.WriteLine("Hostname : {0}", info.hostname);
break;
case "u ser":
Console.WriteLine("Username : {0}", info.username);
break;
default:
Coo.sole.WriteLire('"Usз::,г: sysinfo <q,..i I win I ret I h::бt I user>");
break;
Справочник С#
Поле win будет содержать версию ОС, net - версию .NET, СРИ - ко
личество процессоров (ядер процессоров), hostname - имя узла, а
username - имя пользователя. Все поля публичные, то есть к ним можно
будет обращаться за пределами класса, что мы и будем делать в нашей
программе.
Метод Описание
Возвращает символьную строку, содержащую описание объек-
та, для которого он вызывается. С этим методом мы уже знако-
мы из предыдущего раздела. ТаlОКе метод ToString() автомати-
ToString() чески вызывается при выводе содержимого объекта с помощью
метода Write()/WriteLine(). В своем классе вы можете переопре-
делить этот метод, чтобы созданные вами объекты могли быть
корректно преобразованы в строку
Используется при помещении объекта в структуру данных -
карту (map), которая также называется хэш-таблицей. Исполь-
зуется классами, которые манипулируют картами. Если вы
желаете использовать свой класс в таком контексте, то должны
GetНashCode() переопределить метод GetНashCode(). Однако это требуется до-
вольно редко, если вам когда-то и понадобится использовать
этот метод, подробности вы сможете узнать в документации по
.NET, поскольку существуют строгие требования перезагрузки
этого метода
Rl<J Справочник С#
4.2.4. Конструкторы
// Устанавливаем параметры
puЫic Human(string n, byte а)
{
Name = n;
Age = а;
4.2.5. Деструкторы
Обратите внимание, как создается новый объект. Перед указанием имени
вы указываете оператор new, который выделяет оперативную память для
создаваемого объекта. Понятное дело, что оперативная память не рези
новая, поэтому свободная память рано или поздно закончится. Именно
поэтому одной из главных функций любой схемы динамического рас
пределения памяти является освобождение памяти от неиспользуемых
объектов, чтобы сделать ее доступной для последующего выделения
(allocation).
// Устанавливаем параметры
puЫic Human(string n, byte а)
{
Name = n;
Age = а;
puЫic -Human ()
{
Console.WriteLine("Object was destroyed");
// Устанавливаем параметры
puЫic Human(string Name, byte Age)
{
// Что и чему присваивается?
// Name = Name;
// Age = Age;
this.Name = Name;
this.Age = Age;
1
Примеры:
• Если какой-то член может нанести вред объекту, если он будет ис
пользоваться неправильно, он должен быть закрытым.
class Pr og r am
n = 100;
int х = О;
Coosole.WriteLire(''Value of х tefore caJ..l.irg marq:Nt.rn: {0}",х);
changeNum(r ef х ) ;
Coosole.WriteLire(''Value of х after callirg marq:Nt.rn: {0}", х);
Справочник С#
Console.ReadLine();
namespace ConsoleApplicationl
class Program
int i (int) а;
Ь = а * а;
с = а * а * а;
Глава 4. Объекrно-ориентированное программирование
return i;
int i;
douЫe с, Ь, а = 4.5;
Console.ReadLine();
namespace ConsoleApplicationl
class Program
douЫe min;
// Array is empty?
if (arr.Length == О)
Console.WriteLine("Empty array!");
return DouЫe.Negativeinfinity;
else
// Only 1 element in array
if (arr.Length == 1)
min = arr[0J;
return min;
min = arr[0J;
// Searcing for min
for (int j = 1; j < arr.Length; j++)
if (arr[j] < min)
min = arr[j];
return min;
douЬle result О;
douЫe [] arrl { 4.5, 7.6, 3.3, -11.7};
result = minElement(arrl);
Console.WriteLine("Min: {0}", result);
Console.ReadLine();
Пример:
// Устанавливаем параметры
puЬlic Human(string n, byte а)
{
Name = n;
Age = а;
puЬlic ~Human()
{
Console.WriteLine("Object was destroyed");
}
IWZI Справочник С#
Human.Hello();
namespace ConsoleApplicationl
class SampleClass
// Статический конструктор
static SampeClass()
{
х = 1;
// Обычный конструктор
puЬlic SampleClass()
{
у = 12;
class Program
4.2.12. Индексаторы
Любой программист хорошо знаком с процессом доступа к отдельным
элементам массива с помощью квадратных скобок[]. В языке С# имеется
возможность создавать специальные классы и структуры, которые мож
но индексировать подобно обычному массиву посредством определения
индексатора. Другими словами, в С# можно обращаться к классу как к
массиву. Это позволяет создавать специальные типы коллекций.
namespace ConsoleApplicationl
class MyArr
int[] arr;
puЬlic int Length;
// Простой индексер
puЬlic int this[int index]
{
set // Устанавливаем элемент массива
arr[index] = value;
get
{
return arr[index];
class Program
arrl[i] = i * 2;
Console.Write("{O} ", arrl[i]);
4.2.13. Свойства
В С# есть еще одна диковинка - свойства. В других языках програм
мирования, поддерживающих ООП, свойством называется член класса,
содержащий данные. Просто есть свойства и методы. Свойства - это
переменные, а методы - это функции. Грубо говоря, конечно. Но в С#
все немного иначе. Свойство сочетает в себе данные и методы доступа
к ним.
тип имя
get
{
// код аксессора для чтения из поля
set
Здесь тип означает конкретный тип, например, char. Как видите, свой
ства не определяют место в памяти для хранения полей, а лишь управля
ют доступом к полям. Это означает, что само свойство не предоставляет
поле, и поэтому поле должно быть определено независимо от свойства.
Справочник С#
// Перегружаем конструктор
puЬlic void Car()
•1в Справочник С#
int а = 1, Ь = 2;
int с = а + Ь;
string n "user";
string s = "hello" + " " + user;
=, !=, <, >, <=, >= Могуr быть перегружены, но нужно пере-
грузить все эти операторы
Не может быть перегружен. Но подобный
[]
функционал предлагают индексаторы
namespace ConsoleApplicationl
class SampleClass
// Переменные
puЫic int х, у;
this.y у;
//Перегрузка +
puЫic static SaпpleClass cpera tor +(SaпpleClass ol, SaпpleClass о2)
{
SampleClass res = new SampleClass();
res.x = ol.x + о2.х;
res.y = ol.y + о2.у;
return res;
//Перегрузка
puЫic static SaпpleClass cpera tor -(SaпpleClass ol, SaпpleClass о2)
{
SampleClass res = new SampleClass();
res.x = ol.x - о2.х;
res.y = ol.y - о2.у;
return res;
class Program
using System.Threading.Tasks;
namespace ParentChild
class Parent
puЬlic int х, у;
puЬlic Parent ()
{
х = 10;
у 20;
puЫic int z;
puЫic Child()
30;
= 50;
class Program
Console.ReadLine();
liJiMl-ril Справочник С#
Пример:
class Parent
puЫic Parent ()
х = 10;
у = 20;
z = 100;
а = х;
� • �rc�"�"""' ••х
_ __J_e_. _ ·---_,., с, ,11 \!> • z • с, ..,.EJ
.. !.:.t,,,-�.,.,....••,.._�11:-r,,,..._.:c:ti<•� p"j
!::l"!.--·�ncuiacr,�--, ..,,)
06,,�---pйt<>ll',wli�·и·м.,;· ,;;;.w --
с� ,.., ... ,х
puЫic int х, у;
puЬlic Parent ()
{
х = 10;
у 20;
puЬlic int z;
puЫic int у;
puЬlic Child ()
{
у 30;
z = 50;
Как показано на рис. 4.4, компилятор сообщает о том, что Child.y скры
вает унаследованный член Parent.y. Если член базового класса требуется
скрыть намеренно, то перед его именем следует указать ключевое слово
IMMIЮI Справочник С#
�•!Ш.2,_�__:_:.:,����- -=-=-=_-_..:_-_-J=:.::::::::::�::j
11 • 18;
,,cc.;,,�.j""'',c,c.,,......, �
._,,. �· 0,-,1C'S
,,,.,>� --:-~-
у. ::lt;
• -)-IIUO('f;!
� t:• ProQl'.:tm;;;,
-(-�
�- -
"Ctiid:.(aq:>t,IIИ'I
...:.�.а-��:,·.
•ACS&H)IJit:.:-apwr,w6t.oм) �
...
j
Рис. 4.4. Предупре:нсдение компилятора
и
'111! l'tpoel(t с6щжа Of'-UD Т«т Ан:w/,
�; · 1 ое�•< :,.ч��-
r
: : у �
i .. "
1·1
х:,18;
у 11 :18;
lf
,.
" cl.11•s Cl>i.J.f!: Vы-,,;r.t
m.
_f>'lb\!<:Ц!_;r.;
2,:,·• у;
:���� n•w
"" p<1btJc: t:h.11;,i()
{
class Parent
puЫic int х, у;
puЬlic Parent ()
= 10;
20;
class Reader
class Library
class Reader
Что меняет в поведении класса Reader эта замена? Рассмотрим его при
менение:
РАСШИРЕННЫЙ
СИНТАКСИС
Справочник С#
5.1. Делегаты
Делегаты представляют собой такие объекты, которые указывают на ме
тоды. Иначе говоря, делегаты - это указатели на методы и с помощью
делегатов мы можем вызвать данные методы.
Делегат Message в качестве возвращаемого типа имеет тип void (то есть
ничего не возвращает) и не принимает никаких параметров. Это значит,
что этот делегат может указывать на любой метод, который не принимает
никаких параметров и ничего не возвращает.
Message mes;
mes = Hello;
mes();
Глава 5. Расширенный синтаксис IOMU
Прежде всего, сначала необходимо определить сам делегат:
Message mes;
mes = Hello;
mes ();
messagel(); // Greeting
message2(); // Привет
class Greeting
Справочник С#
class Hello
class Program
Message mes;
mes = Hello;
mes();
Message mes;
mes = Hello;
mes();
Глава 5. Расширенный синтаксис kit/.lMN
void Hel l o() => Console.WriteLine("Hel l o");
message();
Справочник С#
Hello
How are you?
Hello
Hel lo
Message? mes;
//mes(); // Ошибка: делегат равен null
Operation? ор = Add;
ор -= Add; // Делегат ор пуст
int n = ор(З, 4); // !Ошибка: делегат равен null
Operation? ор = Add;
ор -= Add; // Делегат ор пуст
int? n = op?.Invoke(З, 4); // Qnибки нет, депегат просто не ЕЬl'ЫВается, а n
= null
DoOperation(5, 4, Add); // 9
DoOperation(5, 4, Subtract); // 1
DoOperation(5, 4, Multiply); // 20
Console.WriteLine(op(a,Ь));
operation = SelectOperation(OperationType.Subtract);
Console.WriteLine(operation(l0, 4)); // 6
Глава 5. Расширенный синтаксис k+rllMPII
operation = SelectOperation(OperationType.Multiply);
Console.WriteLine(operation(l0, 4)); // 40
switch (орТуре)
{
case OperationType.Add: return Add;
case OperationType.Subtract: return Subtract;
default: return Multiply;
enum OperationType
DoOperation(lO, 6, Add); // 10 + 6 16
DoOperation(lO, 6, Multiply ); // 10 * 6 60
Console.WriteLine(isPositive(20));
Console.WriteLine(isPositive(-20));
Console.WriteLine(resultl);
dеlеgаtе(параметры)
{
// Инструкции
Глава 5. Расширенный синтаксис IUMN
Например:
Console.WriteLine(mes);
} );
handler(message);
return х + у;
);
int result operation(4, 5);
Console.WriteLine(result); // 9
return х + у + rn;
);
int result operation(4, 5);
Console.WriteLine(result); // 17
5.3. Лямбды
5.3.1. Введение в лямбда-выражения
Лямбда-выражения представляют упрощенную запись анонимных ме
тодов. Лямбда-выражения позволяют создать емкие лаконичные методы,
которые могут возвращать некоторое значение и которые можно пере
дать в качестве параметров в другие методы.
if (х > у) return х - у;
else return у - х;
};
int resultl = subtract(l0, 6); // 4
Console.WriteLine(resultl); // 4
int[] integers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int result = О;
foreach (int i in numЬers)
if (func(i))
result += i;
return result;
if (func(i))
Подобным образом работает второй вызов метода Sum, только здесь уже
идет проверка числа на четность, то есть если остаток от деления на 2
равен нулю:
operation = SelectOperation(OperationType.Subtract);
Console.WriteLine(operation(l0, 4)); // 6
operation = SelectOperation(OperationType.Multiply);
Console.WriteLine(operation(l0, 4)); // 40
enum OperationType
5.4. События
5.4.1. Введение в события
События сигнализируют системе о том, что произошло определенное
действие. И если нам надо отследить эти действия, то мы как раз и мо
жем применять события. Например, рассмотрим следующий класс, кото
рый описывает банковский счет:
class Account
// Сумма на счете
puЫic int Sum { get; private set; }
// В конструкторе устанавливаем начальную сумму на счете
puЬlic Account(int sum) => Sum = sum;
// Добавление средств на счет
puЫic void Put(int sum) => Sum += sum;
// Списание средств со счета
puЫic void Take(int sum)
{
if (Sum >= sum)
Sum sum;
Nоtifу("Произошло действие");
Или так:
Notify?.Invoke("Sorne action");
class Account
Sum - sum;
Notify?.Invoke($"0iяn-E q::едсrв: {Sll11}"); // 2.Еыюв сххыrия
else
Вывод программы:
Вывод программы:
Зачисление средств: 20
Зачисление ср едств: 20
Зачисление ср едств: 50
class Account
add
notify += value;
Console.WriteLine($"{value.Method.Name} добавлен");
remove
notify -= value;
Console.WriteLine($ "{ value.Method.Name} удален" ) ;
Sum -= sum;
notify?.Invoke($"Cнятиe средсrв: {sum}"); // 2.1:ыэов соеьnия
else
add
notify += value;
Console.WriteLine($"{value.Method.Name} добавлен");
remove
notify -= value;
Console.WriteLine($"{value.Me thod.Name} удален");
class AccountEventArgs
// Сообщение
puЫic string Message{get;}
// Сумма, на которую изменился счет
puЫic int Sum {get;}
puЬlic AccountEventArgs(string message, int sum)
Message = message;
Sum = sum;
Sum -= sum;
Notify?.Invoke(this, new AccountEventArgs($"Cyм,.,в {sum} снята
со счеrа", sum));
else
acc.Notify += ShowMessage;
acc.Put(20);
acc.Take(70);
acc.Take(lSO);
5.5. Замыкания
Замыкание (closure) представляет объект функции, который запоминает
свое лексическое окружение даже в том случае, когда она выполняется
вне своей области видимости.
Action Outer ()
1int х = 5;
void Inner ()
х++;
Console.WriteLine(x);
return Inner;
fn (); // 6
fn (); // 7
fn (); // 8
int х = 10;
var innerFn = () => Console.WriteLine(++x);
return innerFn;
};
Глава 5. Расширенный синтаксис
var fn = Multiply(5);
Console.WriteLine(fn(5)); // 25
Console.WriteLine(fn(б)); // 30
Console.WriteLine(fn(7)); // 35
Operation Multiply(in t n)
{
int Inner(int m)
return n * m;
return Inner;
int Inner(int m)
return n * m;
var fn = Multiply(5);
Console.WriteLine(fn(б)); // 30
var fn = multiply(5);
Console.WriteLine(fn(5)); // 25
Console.WriteLine(fn(б)); // 30
Console.WriteLine(fn(7)); // 35
IW/J Справочник С#
interface имя{
return type method name 1 (args);
return type method name 2 (args);
// . . .
return type method name N (args);
namespace ConsoleApplicationl
// Описываем интерфейс
puЫic interface ITest
{
// Определяем набор абстрактных методов
int Testl();
int Test2();
puЫic MyClass() { }
return 1;
class Program
Console.ReadLine();
namespace ConsoleApplicationl
{
interface ITest
string Str
{
get;
set;
string myStr;
myStr value;
get
{
return myStr;
class Program
Console.ReadLine();
narnespace ConsoleApplicationl
{
puЬlic interface А
{
int TestA();
class Prograrn
6.5. Структуры
Объекты конкретного класса доступны по ссылке (поскольку классы от
носятся к ссылочным типам данных), в отличие от значений обычных
типов, которые доступны непосредственно. В некоторых ситуациях для
повышения эффективности программы полезно иметь прямой доступ к
объектам, как к значениям простых типов. Ведь каждый доступ к объ
екту (даже к самому небольшому) требует дополнительные системные
ресурсы (оперативную память и процессорное время).
Для решения подобных задач используются структуры. Структуры по
добны классам, но они относятся не к ссьшочным типам данным. Струк
туры отличаются от классов способом хранения в памяти и способом
доступа к ним. Классы размещаются в куче, а структуры - в стеке. Это
и есть самая большая разница. Из соображений эффективности програм
мы структуры полезно использовать для небольших типов данных. Син
таксически описание структуры похоже на классы. Основное отличие в
том, что класс определяется с помощью служебного слова c/ass, а струк
тура - с помощью служебного слова struct. Синтаксис следующий:
struct имя : интерфейсы {
// объявления членов
namespace ConsoleApplicationl
// Создадим структуру
struct Carinfo
class Program
carl = car2;
car2.Brand = "Toyota";
car2.Model = "Camry";
Console.Write("carl: ");
car.GetCarinfo();
Console.Write("car2: ");
car2.GetCarinfo();
Console.ReadLine();
6.6. Перечисления
Перечисление (enumeration) - это определяемый пользователем цело
численный тип. Когда вы объявляете перечисление, то указываете набор
Справочник С#
namespace ConsoleApplicationl
// Создать перечисление
enum car : long { Brand, Model, Year, Engine 1
class Program
car carl;
for (carl = car.Brand; carl <= car.Engine; carl++)
Console.WriteLine("Ключ: \"(01\", значение (11",
carl, (int)carl);
Console.ReadLine();
6. 7. Вложенные типы
Вложенным является тип, который обновляется внутри другого типа:
puЫic class UpLevel
{
puЫic class NestedType {)
puЫic enum Font { Arial, Times, Courier )
class Test
UpLevel.Nested а;
catch (DivideByZeroException)
{
Console.WriteLine("Дeлeниe на 0");
catch (DivideByZeroException)
{
Console.WriteLine("Дeлeниe на 0");
catch (IndexOutOfRangeException)
{
Console.WriteLine("Bыxoд за пределы диапазона");
https://msdn.microsoft.com/ru-rn/librarylsystem.exception%28v = vs.110%29.aspx
Свойство Описание
Console.Write("Oшибкa: ");
Console.Write(ex.Message + "\n\n");
Console.Write("Meтoд: ");
Console.Write(ex.TargetSite + "\n\n");
Console.Write("Cтeк: ");
Console.Write(ex.StackTrace + "\n\n");
Console.Write("Пoдpoбнocти: ");
Console.Write(ex.HelpLink + "\n\n");
if (ex.Data != null)
Console.WriteLine("Пoдpoбнocти: \n");
foreach (DictionaryEntry d in ex.Data)
Console.WriteLine("-> {О} {l}",d.Key, d.Value);
• Наследоваться от ApplicationException;
puЫic МуЕхс () { }
puЬlic МуЕхс (string message) : base(message) ( }
puЫic МуЕхс (string message, Exception ех) : base(message) { }
protected МуЕхс (System.Runtime.Serialization.Serializationinfo info,
System.Runtime.Serialization.StreamingContext context)
: base( info, context) { }
Синтаксис следующий:
try {
// Блок кода, проверяемый на наличие ошибок.
finally {
// Этот код будет выполнен после обработки исключений
Пример:
int х = 10, у о, z;
try
[
z = х / у;
catch (DivideByZeroException)
{
Console.WriteLine("Дeлeниe на 0");
finally
{
Console.WriteLine("Koнeц программы");
Синтаксис такой:
checked {
// операторы
}
unchecked {
// операторы
}
byte х, у, res;
try
{
Console.Write("Bвeдитe х:");
х = unchecked((byte)int.Parse(Console.ReadLine()));
Console.Write("Bвeдитe у:");
у = unchecked((byte)int.Parse(Console.ReadLine()));
checked
catch (OverflowException)
Console.WriteLine("Пepeпoлнeниe");
Справочник С#
Здесь специально используется тип byte (диапазон 0.. 255), чтобы про
ще было вызвать переполнение. Потенциально опасный код заключен в
checked. Обратите внимание: код, получающий значения х и у, заключен
в unchecked. Для одиночного выражения допускается использование
круглых скобок вместо фигурных.
•1-а Справочник С#
Интерфейс Описание
Интерфейс Описание
Класс Описание
Определяет динамический массив. Динамические
AпayList массивы при необходимости могут увеличивать свой
размер
Используется для работы с хеш-таблицами для пар
HashtaЫe
«ключ-значение>>
Интерфейс Описание
Класс Описание
Метод Описание
namespace WorkingWithCollection
class IntCollection
return arr;
arr.RemoveRange(i, j);
class Program
Изначально была создана коллекция с числами 97, 11, 26 и 96. Для созда
ния коллекции мы использовали метод NewCollection(), которому пере
дали число 4 - количество элементов в новой коллекции. Сами же эле
менты коллекции создаются генератором случайных чисел:
• ICloneaЫe
• ICollection
• IDictionary
• IDeserializationCallback
• IEnumeraЫe
Метод Описание
namespace ConsoleApplicationl
class Program
// Создаем хеш-таблицу
HashtaЫe ht = new HashtaЫe();
Console.ReadLine();
namespace ConsoleApplicationl
class Program
Console.OutputEncoding = Encoding.GetEncoding(866);
Console.WriteLine("Coдepжимoe стека: ");
if (MyStack.Count == О)
Console.WriteLine("Cтeк пуст!");
Глава 8. Коллекции и итераторы C<JM
Вывод программы будет таким:
Му Stack contains:
СВА
с
в
А
Stack is empty
namespace ConsoleApplicationl
class Program
Console.WriteLine("Moя очередь:");
foreach (int i in MyQueue)
Console.Write("{0} ", i);
Console.ReadLine();
-
;� 1 1- 1
Newt Next
1
Vвlue
Метод Описание
Как обычно, настало время для примера. В листинге 8.5 приводится при
мер создания связного списка и вывода его в двух направлениях - в
прямом и обратном. Обратите внимание, как построены циклыfоr. В ка
честве начального значения при прямом обходе мы используем First, а за
тем присваиваем узлу значение Next (идем вперед). При обратном обходе
мы начинаем с Last и узлу при каждой итерации присваиваем значение
Previous, то есть идем назад.
namespace ConsoleApplicationl
class Program
l.AddFirst("Orange");
l.AddFirst("Peach");
Console.WriteLine( );
// Элементы в обратном порядке
Consol e.WriteLine("Rev erse order: ");
for (node = l.Last; node != null; node = node.Previous)
Console.Write(node.Value + "\t");
Console.ReadLine( );
• IDictionary
• IDictionary<TKey, TValue>
• ICollection
• ICollection<KeyValuePair<TKey, TValue>>
• IEnumeraЫe
• IEnumeraЫe<KeyValuePair<TKey, TValue>
puЫic SortedList()
puЫic SortedList(IDictionary<TKey, TValue> dictionary)
puЫic SortedList(int capacity)
puЫic SortedList(IComparer<TK> comparer)
namespace ConsoleApplicationl
class Program
Глава 8. Коллекции и итераторы C-&JM•i
static void Main()
// Добавление элементов
Carinfo.Add("Audi ", "2015");
Carinfo.Add("Toyota", "2016");
Carinfo.Add("BMW", "2015");
Carinfo.Add("Renault", "2014");
Carinfo.Add("L exus ", "2016");
// Коллекция ключей
ICo llection<string> keys = Carinfo.Keys;
Con sole.ReadLine();
namespace ConsoleApplicationl
c lass Carinfo
// Реализуем словарь
puЫic static D ictionary<int , string> MyDic(in t i)
stri ng s;
return dic;
c lass Program
Глава 8. Коллекции и итераторы
Console.OutputEncoding = Encoding.GetEncoding(866);
Console.Write("Cкoлькo машин добавить? ");
try
// Получаем ключи
ICollection<int> keys = dic.Keys;
Console.WriteLine("Cлoвapь: ");
foreach (int j in keys)
Console.WriteLine("ID -> {О} Мэрка -> {l}",j, dic[j));
catch (FormatException)
Console.ReadLine();
• IDictionary
• IDictionary<ТKey, TValue>
• ICollection
• ICollection<KeyValuePair<TKey, TValue>>
• IEnumeraЫe
• IEnumeraЫe<KeyValuePair<TKey, TValue>>
namespace ConsoleApplicationl
class Carinfo
return dic;
class Program
WCW/J Справочник С#
int i = int.Parse(Console.ReadLine());
catch (FormatException)
Console.WriteLine("Oшибкa!");
Console.ReadLine();
sb.Add(7);
sb.Add(2);
sb.Add(З);
sb.Add(l);
// Пересечение
ss.ExceptsWith(sb);
foreach (int j in ss)
Console.Write(j + " ");
// Объединение
ss.UnionWith(sb);
foreach (int j in ss)
Console.Write(j + " ");
8.14. Перечислители
К элементам коллекции иногда приходится обращаться циклически -
ранее приводились примеры циклаfоrеасh как один из способов цикли
чески обратиться ко всем элементам коллекции. Второй способ -
использование перечислителя.
Перечислитель - это объект, реализующий необобщенный интерфейс
/Enumerator или обобщенный /Enumerator< Т>.
RMIIOJ Справочник С#
enum.Reset();
namespace ConsoleApplicationl
byte [ ] bytes = { 1, 3, 5, 7 } ;
byte index = -1;
// Интерфейс IEnumeraЬle
puЬlic IEnumerator GetEnumerator()
return this;
// Интерфейс IEnumerator
puЫic bool MoveNext()
{
if (index == bytes.Length - 1)
bliMl-0 Справочник С#
Reset();
return false;
index++;
return true;
class Program
Пример итератора:
class MyClass {
int limit = О;
puЫic MyClass(int limit) { this.limit limi t; }
Справочник С#
РАБОТА С ДАТОИ И
ВРЕМЕНЕМ
HfMl-0 Справочник С#
Console.WriteLine(DateTime.MinValue);
Модификатор Описание
Вывод:
07:46:38
08.06.2022
Справочник С#
В этой главе, как было уже отмечено, рассматриваются две темы. Первая
просто связана с файловым вводом/выводом. Соответствующие типы вы
можете найти в пространстве имен System.1O. Вторая тема - это сериа
лизация, то есть представление в символьном виде различных объектов.
После того как объект сериализирован, его можно сохранить в файл (или
в базу данных) или передать на удаленную машину посредством техно
логии WCF (Windows Communication Foundation).
Класс Описание
Console.WriteLine();
namespace MyDriveinfo
class Program
Console.ReadLine();
Член Описание
CreateNew,
Create,
Орел,
OpenOrCreate,
Truncate,
Append
Read,
Write,
ReadWrite
Delete,
InheritaЫe,
None,
Read,
ReadWrite,
Write
Пример:
string[] myFriends = {"Jane", "Мах", "John" };
Console.WriteLine("{O}", friend);
Член Описание
// Сбрасываем position
fStream.Position = О;
bytesFromFile[i] = (byte)fStream.ReadByte();
Console.Write(bytesFromFile[i]);
Console.WriteLine();
writer.WriteLine("Bacя");
writer.WriteLine("Иpa");
writer.WriteLine("Oлeг");
Пример:
using(StreamReader readerl File.OpenText("friends.txt"))
string s = null;
while ((s = readerl.ReadLine()) != null)
{
Console.WriteLine(s);
Пример использования:
Fileinfo f = new Fileinfo(@"file.dat");
using(BinaryWriter bw = new BinaryWriter(f.OpenWrite()))
{
// Данные для записи
douЫe а = 12310.56;
int Ь = 123456;
string s = "123456";
// Записать данные.
bw.Write(a);
bw.Write(b);
bw.Write(s);
// Читаем данные
using(BinaryReader br = new BinaryReader(f.OpenRead())
Console.WriteLine(br.ReadDouЬle());
Глава 10. Файловый ввод/вывод
Console.WriteLine(br.Readlnt32());
Console.WriteLine(br.ReadString());
[SerializaЬle]
puЬlic class UserSettings
bf.Serialize(fs, currentSettings);
catch (SeriaizationException е)
finally
{
fs. C lose();
u sing System.Xml.Serialization;
https://msdn.microsoft.com/en-usllibrarylsystem.runtime.serialization.
formatters.blnary.blnaryformatter%28v = vs.110%29.aspx
i
11
1 °" 1 .,,_, 1 "'--
StrearnReader sr = n ew StrearnReader("c:\\users\\Mark\\file.txt",
System.Text.Encoding.Default);
class Program
string s;
s = sr.ReadLine();
Console.WriteLine(s);
sr. Close();
Console.ReadLine();
c;;;;:
-,.�'?.'i... �.;►l)J(.i,•l>�•DiC,,,,
'8 Фаi!!� � � 6'1 1'1ром1' C6oflц о._ Хмt.•- ,К\' � � "•tw�,.. с�� ,_ ··р) llml..,..tder о х
Ф· �-llif!81t}•(.,'•· 6'�siw. 1r ...,_.
OoG,o
;�==�;,.••н-.1t-••1.e•t1oco,H"g •ut-••r:,, +
:-
_....:....!•·~-��-•• ·••
rf" ";Q,IJ Ъ·Z(.){I., .. ,..е3
11 --�• •mЩ�•- ��--
a
·
•f::;��1�:;:::::::9:::::
� i�;��::;::zi;·�,)
r
l 1f 1
�
</EIC!fl1.0),.•"' ► ;'�
!
11,.
"Ptчщ1r_r.,.J"a\и<1Pt-og•·-,.. ,. 18 fo,rnt..:.,
: c/E8f>\OJf"� ► t:.lfOf"'l.�n«.a
1
� ' "�::::.'"
·-
.. '
,. ,
t 1@::;;.:�":::р
1 "/nюt><
·с:�1
Е "110•;>\•�V {�хм�.
в-
!r�r.-"""""'
� u.kocte(VП-8)
i•им..
: ,..�,,_,,т n�aм:>NIIMR XSL.
....
rlc"ac:.((JJI•�)
Teir.croвыA фait-1 • ТИn; Обшие
Общие
n�XML--Фзl'l.n.
,_..
.�
HTML-cтptttt14цa
Vi$1Jaj с·•·•
Оцмnт .D Общ••
Ви1и
D' �i\11J.waScript Общ..,
Т,16J!ицвстw��
►
(!:)
n.
( >
(xet,1a1X:Мl 00.Ц,,е
� Ф&ЙАюцеЧЖ)f'Орv:<уМ"'8 Об-
Фail11t3t1�<Ж3
[1 Общие
__
Посл•дние шаблоны проектов
........=�..
�-•�W!nclowl.�)"lll'OМ'--�'1<,e,,o
г.........J
-
Рис. 10. 7. Создание нового проекта Windows Forms Application
е. •
�
aw � k G<t
••е�в111 '? •
rtac-т
• -~-- · ""-�
t6ot:ca О,11� �т rcr А,q_щ
-t ►R)o::·b�·
�
�·:, s;
� Q,ж1
•·11-•r•-ii.,a:►j1
� ·�-�
l.�
" х
lf
ii .""""
.,..�.... -
-··-·-•""- ....�-''""""""'�'---�.,..-� --� .. •
iiil-lMЧti/ИЩ.1-
х
��-м�-1
,-:::::::::::.::-::i
_
. • :.:::-
1r!
► 611/Ct
..,_
► t) fonn1.Dt1io,,e,.o
"Qlofml.m-
I
► С'• ll'fogr-a
S,Stem.Wtndowvo,ttnJl\opertyG,lo
ТМ: ).-....ewn,iVi,u,tH:,
Пустое�меu.сс:,
1
1 *i
-�
i
i.
ISX·фlllл 1�-,16:rial
M<К1'it1el«i"'Н!O�(�l,.N(Т}
Runt!n-,elatTe<npl&�
• • '•• 1 • (> 1• •• I ••
Как видите, класс очень простой. Однако, тем не менее, без него -
никак. Конструктор класса просто инициализирует свойства класса. Так
же мы переопределили метод ToString() - в качестве строкового значе
ния будет возвращаться значение свойства Name. Теперь приступаем к
редактированию файла кода формы - Fonnl .cs (в области Обозреватель
решений для этого выделите файл Fonnl .cs, щелкните правой кнопкой
мыши и выберите команду Перейти к коду или нажмите F7). Первым
делом нужно добавить метод чтения из ХМL-файла:
private void LoadEmployees ( )
Также нам надо сделать так, чтобы при выборе имени в ListBox все дан
ные выводились в PropertyGrid. Для этого дважды щелкните левой кноп
кой мыши на ListВox в форме и в появившемся блоке кода введите:
private void listBoxl_SelectedindexChanged(object sender, EventArgs е)
if (listBoxl.Selectedlndex != -1)
propertyGridl.SelectedObject = listBoxl.Sel�ctedltem;
puЫic Forml ()
{
InitializeComponent();
LoadEmployees();
if (listBoxl.Selectedindex != -1)
propertyGridl.SelectedObject = listBoxl.Selecteditem;
ijiForm1 о х
SergeyPertov
Mark Larкfau
VikзOdova )'5
E-,;g;;miy Or!ov
https:/larchive.codeplex. com/?p=dotnetzip
https://documentation. help/DotNetZipl
После этого в файле Fonn 1.cs нужно указать, что мы будем использовать
подключенную библиотеку:
using Ionic.Zip;
Обработчик нажатия первой кнопки (Выберите папку) будет таким:
if (fo.ShowDialog() == DialogResult.OK)
textBoxl.Text = fo.SelectedPath;
l:IJ Ар:н1еащ,1я - О Х
IC:\Usm\den\Desktop"2jpl)ing 1
namespace wordscount
class Program
string s = "" ;
string[] txt;
StreamReader sr = new StreamReader("file.txt",
System.Text.Encoding.Default);
s = sr.ReadLine();
sr.Close();
Console.ReadLine();
Уважаемые авторы!
Приглашаем к сотрудничеству по изданию книг по IТ-технолоrням, электронике,
медицине, педагогике.
Издательство сушествует в книжном пространстве более 20 лет и имеет большой
практический опыт.
Наши преимущества:
- Большие тиражи (в сравнении с аналогичными изданиями других издательств);
- Наши книги регулярно переиздаются, а автор автоматически получает гонорар с
каждого издания;
- Индивидуальный подход в работе с каждым автором;
- Лучшее соотношение цена-качество, влияющее на объемы и сроки продаж, и, как
следствие, на регулярные переиздания;
- Ваши книги будут представлены в крупнейших книжных магазинах РФ и ближнего
зарубежья, библиотеках вузов, ссузов, а также на площадках ведущих маркетплейсов.
Ждем Ваши предложения:
тел. (812) 412-70-26 / эл. почта: [email protected]
Будем рады сотрудничеству!