ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل دوم اصول زبان #C

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:BNazaninBold; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:178; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"\@MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:FantasyMatrix; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:FantasyMatrixSmall; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Jokerman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"HolidayPi BT"; panose-1:5 12 1 2 1 2 9 2 2 2; mso-font-charset:2; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"OldDreadfulNo7 BT"; panose-1:4 8 8 5 6 1 7 1 8 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"MisterEarl BT"; panose-1:3 8 8 2 2 3 2 2 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Calligraph421 BT"; panose-1:3 6 7 2 5 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Blackletter686 BT"; panose-1:3 4 8 2 2 6 8 4 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Cataneo BT"; panose-1:3 2 8 2 4 5 2 6 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Staccato222 BT"; panose-1:3 9 7 2 3 4 7 2 4 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"ParkAvenue BT"; panose-1:3 2 6 2 5 5 6 8 7 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Square721 BT"; panose-1:2 11 5 4 2 2 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Broadway BT"; panose-1:4 4 9 5 8 11 2 2 5 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:"Scruff LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Odessa LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Highlight LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"One Stroke Script LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Mekanik LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Tiranti Solid LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Pump Demi Bold LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Quixley LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"La Bamba LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Rage Italic LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Ruach LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Westwood LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Milano LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Victorian LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Academy Engraved LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Orange LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"John Handy LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Jokerman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:ZWAdobeF; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:536885895 0 0 0 511 0;} @font-face {font-family:"Euro Sign"; panose-1:2 11 6 3 2 2 1 2 1 1; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 2 0 0 1 0;} @font-face {font-family:"Lucida Bright"; panose-1:2 4 6 3 7 5 5 2 4 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:CourierNewPS-BoldMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:CourierNewPSMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:SymbolMT; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"MS Gothic"; mso-font-charset:128; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:1 134676480 16 0 131072 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

فصل دوم

Mohsen_mahyar@yahoo.com

C # اصول زبان

آنچه که در این فصل یاد خواهید گرفت:

NET. لازم است یک توسعه دهنده از ویژگی های دیگر ،#C علاوه بر عناصر اصلی یک برنامه :#C - مروری بر برنامه

همچون توضیحات و قراردادهای نامگذاری پیشنهاد شده آگاه باشد.

برای نمایش اعداد، کاراکتر و FCL - انواع داده ی اولیه 1: انواع داده ی اولیه همان انواع داده پایه ای تعریف شده بوسیله

تاریخ ها است.

گرامر عملگرهای سنتی را برای انجام عملیات ریاضی و شرطی به کار می برد. #C : - عملگرها

- نوع شمارشی: نوع شمارشی یک روش مناسب برای تخصیص توصیف است که م یتواند برای ارجاع به یک مجموعه

اصیل مقادیر استفاده شود.

از نوع مقداری یا ارجاعی هستند. فهم تفاوت مابین این دو #C - انواع داده مقداری و ارجاعی: همه انواع داده ای در

نوع داده مهم است و اینکه چگونه کارایی برنامه را تحت تاثیر قرار م یدهند.

تعریف کردند، که هدف طراحی #C یک استاندارد پیشنهاد شده برای زبان برنامه نویسی ECMA در سپتامبر 2000 ، گروه کاری

334ECMA- این زبان را تولید یک زبان برنامه نویسی آسان، پیشرفته، همه منظوره و شی گرا بیان کرد. استاندارد تعریف شده

است. آن یک زبان برای ارتقاء قدرت نرم افزار با کنترل ++C است که یک زبان مرتب با گرامر زبان جاوا و قوانینی از

محدوده ی آرایه، کنترل نوع داده قوی 2 و ممانعت از متغیرهای مقداردهی اولیه نشده طراحی شده است.

را نشان می دهد. انواع داده ی مقداری و #C را به شما معرفی می کند و بخش های اصلی یک برنامه #C این فصل اصول زبان

ارجاعی را مقایسه می کند و گرامر اپراتورها و دستورات برنامه را شرح می دهد.

برنامه نویس حرف های با این مفاهیم آشنا است. با این وجود، بخش انواع داده مقداری و ارجاعی توجه بیشتری لازم دارد. فهم

اختلاف در نحوه ی اداره ی انواع داده مقداری و ارجاعی روی طراحی برنامه شما تاثیرگذار خواهد بود.

1 Primitive

2 Strong Type cheking

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

36

#C -1-2 چیدمان یک برنامه

را نشان می دهد. #C 1 بعضی از ویژگی های یک برنامه - شکل 2

1- شکل 2

که Apparel است که منطق برنامه را در بر دارد و یک کلاس myApp 1 شامل یک کلاس بنام - کد موجود در شکل 2

نامگذاری می کند. سپس myApparel را ایجاد کرده و آن را Apparel داده هایی را در بر می گیرد. این برنامه یک نمونه از

در کنسول استفاده می شود. مهمترین ویژگی های Price و FabType این شی برای چاپ مقادیر اعضای کلاس بنام های

مورد توجه بصورت زیر هستند:

همه انواع داده ای System را مشخص می کند. همانطور که می دانید فضای نامی System فضای نامی using -1 دستور

به کامپایلر می گوید زمان رفع ارجا عها این فضای نامی را جستجو کنند، که using پایه را شامل می شود. دستور

System.web.UI.WebControls.Label استفاده از اسامی کامل را غیرضروری می کند. برای مثال، به جای

ارجاع کنید. Label می توانید به

-2 همه داده ها و منطق برنامه باید در یک تعریف نوع داده قرار گیرند. همه داده ها و منطق برنامه باید در یک کلاس،

متغیر سراسری خارج از دامنه وجود ندارد. #C در ،VB ساختار، نوع شمارشی، واسط یا نماینده تعبیه شوند. برخلاف

به کلاس های public دسترسی به انواع داده و اعضای آنها به وسیله معرفها 1 کنترل می شود. دراین مثال معرف

دسترسی داشته باشند. Apparel خارجی اجازه م یدهد به دو عضو کلاس

لازم است. این متد به عنوان نقطه ورودی برنامه عمل می کند. آن باید همواره #C برای هر برنامه اجرایی Main () -3 متد

یک نوع داده بازگشتی و Main شده ی overload آن بزرگ باشد. شکلهای M را داشته باشد و حرف static معرف

یک لیست پارامتر ورودی را تعریف میکنند. نمونهی زیر یک مقدار صحیح بر میگرداند.

static int Main()

{

return ٠; // must return an integer value

}

مثال زیر، لیست آرگونهای خط فرمان را به عنوان پارامتر دریافت کرده و یک مقدار صحیح بر میگرداند.

static int Main(string[] args)

{

// loop through arguments

foreach (string myArg in args)

Console.WriteLine(myArg);

return ٠;

1 modifier

#C فصل دوم- اصول

37

}

پارامتر آن یک آرایه ی رشته ای از محتوای خط فرمان است که برای احضار برنامه استفاده می شود. برای مثال، این خط فرمان

را اجرا میکند و دو مقدار از طریق پارامتر بر آن ارسال می کند. MyApparel برنامه

C:\> MyApparel ۵ ۶

می تواند محتویات خط فرمان را بدست آورد. System.Environmenet.CommandLine توجه: خصوصیت

#C -1-1 تذکرات عمومی برنامه نویسی -2

حساسیت به حالت حروف

جایگزین کنید، Class را با class 1- همه متغیرها و کلمات کلید با حساسیت به حالت حروف متمایز می شوند. در شکل 2

کد کامپایل نخواهد شد.

قراردادهای نامگذاری

شما رعایت می شود. علاوه بر ارتقاء سازگاری، رعایت #C قراردادهای نا مگذاری فراهم م یکند که در کد ECMA استاندارد

1 بعضی از توصیه های مهم - سیاست نامگذاری، خطاهای مرتبط با حساسیت به حالت حروف را می تواند کاهش دهد. جدول 2

را خلاصه کرده است.

1- قراردادهای نامگذاری - جدول 2

نوع توضیحات

کلاس • اسم یا عبارت اسمی

شروع نشود. I • سعی کنید با حرف

زیر خط را بکار نبرید.

public const double GramToPound = ثابت ; ۴۵۴٫٠

نوع شمارشی • برای اسامی شمارشی نام واحدی بکار برید.

public enum WarmColor { Orange, Yellow, Brown}

داشته باشد. EventHandler رویداد • متدی که رویدادها را هدایت می کند، باید پیشوند

داشته باشند. EventArgs باید پیشوند Event • کلاس های آرگومان

دارد. Exception استثناء • پسوند

IDisposable . را دارد I واسط • پیشوند

متغیرهای

محلی

نوشته می شوند. Pascal دارند، بصورت public • متغیرهایی که معرف

int myIndex

متد • فعل یا عبارات فعلی را برای نامگذاری استفاده کنید.

فضای اسمی • نباید یک فضای اسمی و کلاس هم نام باشند.

برای دوری از اسامی یکسان از پیشوندها استفاده کنید. برای مثال از نام شرکت به

عنوان پیشوند برای فضاهای نامی پروژه های خود استفاده کنید.

Arshia.GraphicsLib

خصوصیت • اسم یا عبارت اسمی بکار برید.

پارامتر • اسامی با معنی که هدف پارامتر را شرح م یدهند، بکار برید.

استفاده می کنند. Camel استفاده می کنند به غیر از پارامتر و متغیر محلی که از حالت Pascal همه موارد بالا از حالت

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

38

توجه کنید که حالت یک نام م یتواند بصورت زیر بر اساس دو طرح نوشتن حروف بزرگ باشد:

کاراکتر اول هر کلمه بزرگ نوشته می شود. : Pascal -1

به استثناء کلمه ی اول، حرف اول بقیه کلمات بزرگ نوشته می شود. :Camel -2

#C توضیحات در برنامه

توضیح یک خطی ( // ) و توضیحات چند خطی ،Xml سه نوع توضیح تعبیه شده را پشتیبانی می کند: یک نسخه #C کامپایلر

( /* */) که برای بیشتر برنام هنویسان آشنا هستند.

// for a single line

/* for one or more lines

*/

/// <remarks> XML comment describing a class </remarks>

است که یک قطعه کد همچون یک XML با سه خط کج ( /// ) آغاز می شود و معمولا شامل برچسب های XMl یک توضیح

را برای بدست آوردن اطلاعات XML می تواند برچسب های #C . ساختار، یک کلاس یا عضو کلاس را مستندسازی می کند

اضافی و صادر کردن 1 آنها به یک فایل خارجی گسترش دهد.

هشت برچسب اصلی دیگر را تشخیص #C برای شرح دادن یک نوع داده استفاده می شود. کامپایلر <remarks> برچسب

می دهد که به عنصر خاصی از برنامه تخصیص داده شد هاند. این برچسب ها در بالای خطوط کد مربوطه قرار می گیرند.

XML 2-برچسب های - جدول 2

برچسب شرح

یک مثال از نحوه استفاده از ویژگی خاص برنامه مابین برچسب شروع و پایان نشان م یدهد. :<example>

<exception

cref="Excep">

نام استثناء را شامل است . cref خصوصیت

///<exceptioncref="NoParmException">

</exception>

<include

file="myXML">

دیگر مشخص می شود که مستندسازی این کد در آن فایل قرار xml نام یک فایل ،file در خصوصیت

گرفته است .

<param

name="parm١">

نام پارامتر را شامل می شود. name خصوصیت

<permission

cref= "">

بیشتر مواقع دارای مقادیر زیر است:

///<permissioncref="System.Security.PermissionSet">

</permission>

یک توصیف متنی در مورد نوع مقدار برگشتی از یک متد یا خصوصیت را مشخص می کند. <returns>

نیست فراهم می کند. <summary> اطلاعات اضافی در مورد نوع داده ای که در بخش <remarks>

<seealso

cref="price">

نام یک خصوصیت، متد یا هر عضو دیگر قرار می گیرد. cref در خصوصیت

استفاده می شود VS.NET در intellisense توصیف یک کلاس را در بر می گیرد که به وسیله <summary>

1 export

#C فصل دوم- اصول

39

مجزا صادر شوند و سپس به وسیله تکنی کهای XML در حقیقت برای آن است که می توانند به یک فایل XML مقایر توضیحات

استاندارد پردازش شوند. کامپایلر بطور پی شفرض این کار را انجام نمی دهد، باید آن را تنظیم کرد. XML پارس کردن

ایجاد میکند. ConsoleXML.xml بنام XML را کامپایل کرده و یک فایل ConsoleApp.cs خط زیر کد منبع

C:\> csc consoleapp.cs /doc:consoleXML.xml

کدتان خواهید دید. public 1 را کامپایل کنید، هشدار زیر را برای همه اعضای - اگر کد شکل 2

Warning CS١۵٩١: Missing XML comment for publicly visible type ...

1591 را به خط کامپایل اضافه کنید. در این گزینه میتوانیم شمارههای مختلفی را با nowarn:/ برای منع این هشدار گزینه

کاما از هم جدا کنیم.

-2-2 انواع داده اولیه

سه بخش بعدی ویژگیهایی را شرح می دهند که در اکثر زبانهای برنامه نویسی خواهید یافت. متغیرها و انواع داده ها،

برای ساختن #C عملگرها، عبارات و دستورات. این بحث با انواع داده اولیه شروع می شود که اینها انواع دادهای هستهی

کلاسها یا ساختارهای پیچیدهتر هستند. متغیرهای این نوع داده ها، یک مقدار منفرد دارند و اندازه آنها از پیش تعریف

3 یک لیست رسمی از انواع داده اولیه فراهم می کند . - شده است. جدول 2

#C 3-لیست انواع دادهی اولیه در - جدول 2

توصیف داده FCL نوع داده #C نوع داده اولیه

نوع داده ی پایه برای هر نوع داد هی دیگر System.Object object

یک دنباله از کارکترهای یونیکد System.String string

اعداد اعشاری مختصر با 28 رقم معنی دار System.Decimal decimal

نشان داده false یا true یک مقدار که به صورت System.Boolean bool

می شود .

یک کاکتر یونیکد 16 بیتی System.Char char

نوع داده صحیح 8 بیتی بدون علامت System.Byte byte

نوع داده صحیح 8 بیتی علامت دار System.SByte sbyte

عدد صحیح علامت دار 16 بیتی System.Int16 short

عدد صحیح علام تدار 32 بیتی System.Int32 int

عدد صحیح علامت دار 64 بیتی System.Int64 long

عدد صحیح بدون علامت 16 بیتی System.UInt16 ushort

عدد صحیح بدون علامت 32 بیتی System.UInt32 uint

عدد صحیح بدون علامت 64 بیتی System.UInt60 ulong

عدد اعشاری System.Single (single(float

عدد اعشاری با دقت مضاعف System.Double double

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

40

نگاشت شدهاند، که میتوانند به جای همدیگر استفاده شوند. BCL همانطور که جدول نشان می دهد، انواع دادهای اولیه به 1

دستورات زیر را ملاحظه کنید:

System.Int٣٢ age = new System.Int٣٢(١٧);

int age = ١٧;

System.Int٣٢ age = ١٧;

به عنوان نام مستعار 2 برای نوع داده int از کلمه کلیدی #C یکسانی تولید میکنند. نسخه ی کوتاه در IL هر سه دستور، کد

برای همه انواع داده اولیه اسامی مستعار در نظر گرفته است. #C . 32 استفاده می کند System.Int

چند نکته زیر را هنگام کار با انواع داده اولیه بخاطر داشته باشید:

- کلمات کلیدی که انواع داده ی مقداری اولیه را تعیین می کنند، در واقع اسامی مستعار یک ساختار معینی هستند.

32Int اعضای خاصی از این ساختارها برای دستکاری انواع داده اولیه بکار برده م یشوند. برای مثال ساختار

فیلدی که بزرگترین مقدار صحیح 32 بیتی را بر م یگرداند و یک متد که رشته عددی را به یک عدد صحیح تبدیل

می کند، را در بر دارد.

int iMax = int.MaxValue; // Return largest integer

int pVal = int.Parse("١٠٠"); // converts string to int

تبدیل ضمنی را پشتیبانی م یکند. اگر تبدیل یک تبدیل امن باشد، در نتیجه ی حاصله هیچ داد های از #C کامپایلر

دست نمی رود. این زمانی اتفاق می افتد که مقصد تبدیل دقت بالایی نسبت به شی مبداء داشته باشد، که تبدیل

گسترش 3 نام دارد. در تبدیل کاهشی 4 که مقصد دقت کمتری دارد، باید عمل تبدیل به صورت صریح باشد،

قالب بندی برای تبدیل یک مقدار از یک نوع به یک نوع دیگر استفاده م یشود. این عمل با قرار دادن نوع داد هی

مقصد در داخل پرانتزهایی قبل از مقدار مورد نظر انجام می شود.

short i١۶ = ۵٠; // ١۶-bit integer

int i٣٢ = i١۶; // Okay: int has greater precision

i١۶ = i٣٢; // Fails: short is ١۶ bit, int is ٣٢

i١۶ = (short) i٣٢; // Okay since casting used

یک حرف به دنبال مقدار مورد نظر نیاز double ،decimal ،float • مقادیر حرفی 5 تخصیص یافته به انواع داد هی

نیاز دارد. m یا M به decimal و d یا D به double ،f یا F به Float . دارند

• decimal pct = .١۵M; // M is required for literal value

دارد. String بقیه این بخش مروری بر مفیدترین انواع داده اولیه به استثناء

Decimal

یک عدد اعشاری 128 بیتی با دقت بسیار بالا است. دقت آن 28 رقم اعشار است و در محاسبات مالی decimal نوع داده ی

ارائه می دهد. decimal که گرد کردن قابل تحمل نیست، بکار برده می شود. این مثال سه متد برای نوع داده

decimal iRate = ٣٫٩٨٣۴M; // decimal requires M

iRate = decimal.Round(iRate,٢); // Returns ٣٫٩٨

decimal dividend = ۵١٢٫٠M;

decimal divisor = ۵١٫٠M;

decimal p = decimal.Parse("١٠٠٫٠۵");

// Next statement returns remainder = ٢

decimal rem = decimal.Remainder(dividend,divisor);

bool

1 Base Class Library

2 Alias

3 Widening conversion

4 Narroving conversion

5 literal

#C فصل دوم- اصول

41

به یک عدد صحیح ممکن bool هستند. قالب بندی یک مقدار bool تنها مقادیر ممکن یک نوع داد هی true و false

ممکن نیست. bool به 1 یا قال ببندی 1 یا 0 به یک مقدار true نیست. برای مثال تبدیل

bool bt = true;

string bStr = bt.ToString(); // returns "true"

bt = (bool) ١; // fails

Char

16 بیتی را نشان می دهد و به صورت یک عدد صحیح بدون علامت پیاده سازی می شود. یک کاراکتر یونیکد 1 char نوع داده

عملیات انتساب متعددی را می پذیرد: یک مقدار کاراکتری مابین دو علامت تک کوتیشن ( )، یک ،char یک نوع داده

تعدادی متد System.char همانطور که مثال زیر نشان می دهد، ساختار .escape مقدار عددی قالب بندی شده، یک دنباله

مفید فراهم می کند.

myChar = 'B'; // 'B' has an ASCII value of ۶۶

myChar = (char) ۶۶; // Equivalent to 'B'

myChar = '\u٠٠۴٢'; // Unicode escape sequence

myChar = '\x٠٠۴٢'; // Hex escape sequence

myChar = '\t'; // Simple esc sequence:horizontal tab

bool bt;

string pattern = "١٢٣abcd?";

myChar = pattern[٠]; // '١'

bt = char.IsLetter(pattern,٣); // true ('a')

bt = char.IsNumber(pattern,٣); // false

bt = char.IsLower(pattern,٠); // false ('١')

bt = char.IsPunctuation(pattern,٧); // true ('?')

bt = char.IsLetterOrDigit(pattern,١); // true

bt = char.IsNumber(pattern,٢); // true ('٣')

string kstr="K";

char k = char.Parse(kstr);

Byte , sbyte

عدد صحیح 8 بیتی علامتدار با sbyte عدد صحیح بدون علامت با مقداری از 0 تا 255 است و byte یک نوع داده ی

مقداری از 128 - تا 127 است.

byte[] b = {٠x٠٠, ٠x١٢, ٠x٣۴, ٠x۵۶, ٠xAA, ٠x۵۵, ٠xFF};

string s = b[۴].ToString(); // returns ١٧٠

char myChar = (char) b[٣];

long وint و Short

ushort اینها به ترتیب اعداد صحیح علامتدار 16 و 32 و 64 بیتی را نشان می دهند. نسخه های بدون علامت آنها به ترتیب

هستند. ulong و uint و

short i١۶ = ٢٠٠;

i١۶ = ٠xC٨ ; // hex value for ٢٠٠

int i٣٢ = i١۶; // no casting required

double و single

معادل Single نوع داد هی NET.X اینها قالب های 32 بیتی با دقت معمولی و 64 بیتی دقت مضاعف را نمایش م یدهند. در

است. float

38 با 7 رقم اعشار دارد. ^10* 45 تا 3,4 -^10* یک مقدار در محدود هی 1,5 single - نوع داده

308 با 15 الی 16 رقم اعشار دارد. ^10* 324 تا 1,7 -^10* یک مقدار در محدود هی 5 double - نوع داده ی

برمی گردانند. تقسیم 0,0 Nan ، - عملیات ممیز شناور برای نشان دادن اینکه نتیجه ی یک محاسبات تعریف نشده است

است. NaN ، بر 0,0

1 unicode

Mohsen_mahyar@yahoo.com - - C# برنامه نویسی

42

را برای تبدیل یک نوع داد هی ممیز شناور به هر نوع دیگر بکار برید . System.Convert - متد

float xFloat = ٢۴۵۶٧٫۶۶F;

int xInt = Convert.ToInt٣٢(xFloat); // returns ٢۴۵۶٧

int xInt٢ = (int) xFloat;

if(xInt == xInt٢) { } // False

string xStr = Convert.ToString(xFloat);

single zero = ٠;

if (Single.IsNaN(٠ / zero)) { } // True

double xDouble = ١٢۴٫۵۶D;

را برای تبدیل یک رشتة عددی به نوع داد هی مشخص به کار می برند. TryParse و Parse متدهای

short shParse = Int١۶.Parse("١٠٠");

int iParse = Int٣٢.Parse("١٠٠");

long lparse = Int۶۴.Parse("١٠٠");

decimal dParse = decimal.Parse("٩٩٫٩٩");

float sParse = float.Parse("٩٩٫٩٩");

double dbParse = double.Parse("٩٩٫٩٩");

پارس کردن شرطی را فراهم می کند. برای تعیین موفق بودن عمل پارس یک پارامتر بولین بر ،NET در 2,0 TryParse

می گرداند، که روشی برای دوری از کد کنترل رسمی استثناء فراهم م یسازد.

int result;

// parse string and place result in result parameter

bool ok = Int٣٢.TryParse("١٠٠", out result);

bool ok = Int٣٢.TryParse("١٠٠", NumberStyles.Integer, null,out result);

در فرم دوم از این متد، اولین پارامتر یک رشته عددی مورد نظر جهت پارس کردن، پارامتر دوم نوع عدد در رشته را مشخص

می کنند. مقدار بازگشتی در پارامتر چهارم قرار می گیرد.

-3-2 عملگرهای ریاضی، منطق و شرطی

برای عملیات ریاضی، دستکاری بی تها و کنترل شرطی برنامه استفاده می شوند، که باید همه برنامه نویسان با #C عملگرهای

آنها آشنا باشند.

-1-3 عملگرهای ریاضی -2

4 عملگرهای عددی پایه را خلاصه می کند. اولویت این عملگرها در حین ارزیابی یک عبارت در پرانتزها اعمال - جدول 2

می شود. 1 بالاترین سطح اولویت است.

4- جدول 2

عملگر توصیف مثال

(3) +

-

جمع

تفریق

int x = y + ١٠;

(2) *

/

%

ضرب

تقسیم

باقیمانده

int x = ۶٠;

int y = ١۵;

int z = x * y / ٢; // ۴۵٠

y = x % ٢٩ ; // remainder is ٢

(1) ++

--

افزایش / کاهش

پیشوندی/پسوندی

x = ۵;

Console.WriteLine(x++) // x = ۵

Console.WriteLine(++x) // x = ۶

int x = ~١٢٧; // returns - 1) مکمل بیتی ١٢٨ ) ~

#C فصل دوم- اصول

43

(4) <<

>> 

شیفت به راست

شیفت به چپ

byte x = ١٠; // binary ١٠ is ٠١٠١٠

int result = x << ١; // ٢٠ = ١٠١٠٠

result = x >> ٢; // ۵ = ٠٠١٠١

(5) &

(6) |

(7) ^

بیتی And

بیتی Or

بیتی Xor

byte x = ١٢; // ٠٠١١٠٠

byte y = ١١; // ٠٠١٠١١

int result = x & y; //٨ = ٠٠١٠٠٠

result = x ^ y; //٧ = ٠٠٠١١١

عملوندهای این عملگر ها باید صحیح باشند.

را برای رساندن یک عدد به توان بکار م یبرند و متد ()Math.Power عملگر توان ندارد. در عوض، متد #C : توجه

را به توان م یرساند. e ، Math.Exp()

-2-3 عملگرهای شرطی و رابط های -2

عملگرهای رابطه ای برای مقایسه دو مقدار و تعیین رابطة مابین آنها استفاده می شوند. آنها عموماً در ارتباط با عملگرهای

5 خلاصه ای از عملگرهای رابطه ای و شرطی - شرطی، برای ایجاد ساختارهای تصمیمگیری پیچیده استفاده می شوند. جدول 2

را تهیه می کند. #C

5- عملگرهای رابطهای و شرطی - جدول 2

عملگر توصیف مثال

==

=!

مساوی

نامساوی

if (x == y) {...}

=>

=<

کوچکتر

کوچکتر یا مساوی

بزرگتر

بزرگتر یا مساوی

if (x <= y) {...}

&&

||

منطقی And

منطقی Or

if (x == y && y < ٣٠) {...}

باشد، عبارت دوم ارزیابی نمی false اگر عبارت اول

شود.

&

|

!

منطقی And

منطقی Or

نقیض منطقی

if (x== y | y < ٣٠) {...}

همیشه عبارت دوم ارزیابی می شود.

if !(x ==y && y < ٣٠) {...}

باشد، false یا true توجه کنید. در عملگرهای || یا &&، اگر عبارت اول به ترتیب OR/AND به دو شکل عملیات منطقی

دومی ارزیابی نم یگردد. (تکنیک ارزیابی کوتاه)

عملگرهای & و | همواره هر دو عبارت را ارزیابی می کنند. اینها زمانی استفاده می شوند که مقادیر عبارات از یک تابع

برمی گردند و می خواهیم از فراخوانی متدها مطمئن شویم.

برای انتساب شرطی یک مقدار به یک متغیر عملگر ?: را پشتیبانی می کند. همانطور که #C ،5- علاوه بر عملگرهای جدل 2

است. if else این مثال نشان م یدهد آن ساده شده دستور

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

44

string pass;

int grade=٧۴;

If(grade >= ٧٠) pass="pass"; else pass="fail";

// expression ? op١ : op٢

pass = (grade >= ٧٠) ? "pass" : "fail";

باشد، عملگر ?! مقدار اول را بر می گرداند، در غیر این صورت مقدار دوم برگردانده م یشود. true اگر عبارت

#C -4-2 راهنماهای پیش پردازش

خوانده می شوند. آنها می توانند کامپایلر را #C این راهنماها 1، دستوراتی هستند که در مرحله تحلیل حرفی توسط کامپایلر

برای در برگرفتن یا نگرفتن یک تکه کد یا حتی رد عمل کامپایل بر اساس مقادیر راهنماهایی پیش پردازش 2 تذکر دهند.

یک راهنمای پیش پردازش با کارکتر # در ابتدای خط معین می شود. فضاهای خالی قبل و بعد از سمبل # مجاز هستند.

را لیست می کند. #C 6 راهنماهایی از - جدول 2

#C 6- راهنماهای پیش پردازش - جدول 2

توصیف #C سمبل پیش پردازش

define#

undef#

برای تعریف و حذف یک سمبل بکار می رود. با تعریف یک سمبل، در صورتی که در راهنمای

ارزیابی می گردد. true استفاده شود، آن به if#

عمل می کند. #C در if-else شبیه if#

#if

#elif

#else

#endif

شماره ترتیب خط را تغییر می دهد و می تواند تعیین کند منبع این خط کدام فایل است. line#

region#

endregien#

مربوط به IDE برای تعیین یک بلاک کد استفاده می شود که به هنگام کد نویسی در محیط

2005 می توان این بلاک را جمع کرده یا باز کرد. VS

باعث می شود کامپایلر یک خطای مخرب (بزرگ) گزارش دهد. error#

باعث می شود کامپایلر یک هشدار گزارش داده و سپس پردازش را ادامه دهد. warning#

از عمومی ترین کاربردهای راهنماهای پیش پردازش، انجام کامپایل شرطی، اضافه کردن تشخیص ها برای گزارش خطاها و

هشدارها و تعریف ناحی ههای کد است.

-1 کامپایل شرطی -4 -2

می توان تعیین کرد، کدام قسمت از کد در طول کامپایل در گرفته شود. هر کدی که if# با استفاده از راهنماهای مرتبط با

ارزیابی می شود، در هنگام false یا true به if قرار دارند، بر اساس اینکه شرط endif# و دستور if# مابین دستور

کامپایل در برگرفته می شوند یا در برگرفته نم یشوند. این یک ویژگی قدرتمند، اغلب برای اهداف رفع اشکال استفاده

می شوند. حال یک مثال از این مفهوم ارائه م یگردد.

#define DEBUG

using System;

public class MyApp

{

1 Directive

2 Preprocess

#C فصل دوم- اصول

45

public static void Main()

{

#if (DEBUG)

Console.WriteLine("Debug Mode");

#else

Console.WriteLine("Release Mode");

#endif

}

}

قرار گیرند. سمبل کامپایل شرطی دو حالت دارد: تعریف شده یا تعریف cs. بایستی در آغاز فایل define# همه راهنماهای

ارزیابی می شود. کاربرد واضح راهنمای true به (if(DEBUG# تعریف می شود و دستور DEBUG نشده. در این مثال سمبل

2005 را بکار می برید شما می توانید یک تولید برنامه VS هر فایل منبع را مجاز می دارد. اگر Debug کنترل حالت define#

برای هر فایل در پروژه به طور اتوماتیک تعریف می گردد. هیچ DEBUG را تعیین کنید، در نتیجه سمبل Debug بصورت

صریح لازم نیست. define# راهنمای

یک سمبل را تعریف کرد. Define/ نیز می توان با استفاه ازسوییچ #C در خط فرمان کامپایل

csc /Define:DEBUG myproject.cs

در کد منبع نوشته شده باشد. Define DEBUG# کامپایل کردن با این دستور ،معادل این است که دستور

-2 راهنماهای تشخیص -4 -2

راهنماهای تشخیص، پیام های هشدار و خطا می فرستند که شبیه دیگر خطاها و هشدارهای فرمان کامپایل با آنها رفتار

آن را متوقف م یکند. error# ادامه کامپایل را مجاز م یدارد، در حالیکه warning# می شود. راهنمای

#define CLIENT

#define DEBUG

using System;

public class MyApp

{

public static void Main()

{

#if DEBUG && INHOUSE

#warning Debug is on.

#elif DEBUG && CLIENT

#error Debug not allowed in Client Code.

#endif

// Rest of program follows here

تعریف می شوند. DEBUGE و CLIENT در این مثال، کامپایل با یک پیام خطا پایان خواهد داد، چون

ناحیه های کد

هیچ #C راهنماهای ناحیه برای نشانه گذاری قسمتهایی از کد به عنوان ناحیه استفاده می شوند. راهنمای ناحیه برای کامپایلر

تشخیص داده می شوند. VS.NET معنایی ندارند، اما به وسیله

#region

// any C# statements

#endregion

-5-2 نوع داده ی شمارشی

معروف است، یک روش مناسب برای ایجاد یک مجموعه ساختیافته 1 از سمبل ها enum به #C نوع داده شمارشی که در

جهت نمایش مقادیر ثابت پیشنهاد می کند.

گرامر:

1 Structured

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

46

[access modifiers]enum <identifier> [:enum-base]{enum body}

مثال:

enum Fabric :short {

Cotton = ١,

Silk = ٢,

Wool = ۴,

Rayon = ٨,

Other = ١٢٨

}

به یک مقدار خاصی تنظیم نشده باشند، آنها به طور اتوماتیک با دنباله 0و 1و 2و 3و enum توجه: اگر سمب لهای

..... تنظیم م یشوند.

است و اجازه م یدهد فقط کلاسهای internal را تعریف م یکنند. به طور پیش فرض enum معرف های دسترسی، دامنه ی

آن را برای هر کلاسی در هر اسمبلی قابل دسترس می سازد. public داخل آن اسمبلی به آن دسترسی داشته باشند. معرف

نوع داده پایة ثابت ها را بر اساس مقادیر تخصیصیافته به آنها مشخص می کند. آن فقط می تواند enum-base گزینة اختیاری

است. int باشند. به طور پیش فرض ulong یا long ،unit ،int ،ushort ،short ،sbyte ،byte یکی از انواع صحیح

-1 کار با نوع داده شمارشی -5 -2

انواع شمارشی نه تنها خوانایی برنامه را بهتر می کنند، بلکه هنگام تغییر مقدار اصلی، تغییرات کد را نیز کاهش می دهند و

همه ارجاعات به آن مقدار، معتبر می مانند. مزیت دیگر اینکه انواع شمارشی، نوع داده قوی هستند. بدین معنی که هر وقت

به عنوان پارامتر ارسال شود، متد دریافت کننده باید یک پارامتر مطابق با همان نوع داشته باشد. درغیر enum یک نوع

نشان می دهد. Fabric 2 این اهداف را با استفاده از نوع داده شمارشی - اینصورت کامپایلر خطا رخ می دهد. قطعه کد 2

2- قطعه کد 2

static double GetPrice(Fabric fab)

{

switch(fab)

{

case Fabric.Cotton: return(٣٫۵۵);

case Fabric.Silk: return(۵٫۶۵);

case Fabric.Wool: return(۴٫٠۵);

case Fabric.Rayon: return(٣٫٢٠);

case Fabric.Other: return(٢٫۵٠);

default: return(٠٫٠);

}

}

static void Main()

{

Fabric fab = Fabric.Cotton;

int fabNum = (int) fab; // ١

string fabType = fab.ToString(); // "Cotton"

string fabVal = fab.ToString("D"); // "١"

double cost = GetPrice(fab); // ٣٫۵۵

}

نکات:

به یک مقدار صحیح، قال ببندی آن لازم است . enum • برای مقداردهی

fabNum =(int) fab;

می توان مقدار رشت های یک ثابت را بدست آورد. ”D“ و پارامتر ()ToString • با متد

لازم است پارامتر متد از همان نوع اعلان GetPrice به متد Fabric • در هنگام ارسال یک نمونه از نوع شمارشی

شده باشد.

#C فصل دوم- اصول

47

این مثال نشان میدهد که نحوه ی به دست آوردن نام سمبل یا مقدار ثابت نوع شمارشی ساده است. زمانی که نمونه ای از یک

و System.Enum نوع داده شمارشی مشخص باشد، به راحتی می توان اعضاء یک نوع داده شمارشی را به کمک کلاس

به دست آورد. foreach حلقه

System.Enum -2 متدهای -5 -2

هستند. اغلب دو متد System.Enum سه متد مفید ،Enum.Getname و Enum.IsDefined،Enum.Parse متدهای

است و یک نمونه از آن ایجاد می کنند. برای enum اول با هم به کار می روند تا مشخص کنند آیا یک مقدار یا سمبل عضو یک

برای وجود یک مقدار رشته ای در آن Fabric فهم بهتر مطلب، مثال های زیر را در نظر بگیرید. در این مثال نوع شمارشی

یکی از مقادیر آن را چاپ می کند. GetName جستجو م یشود و متد

string fabStr = "Cotton";

// Determine if symbol Cotton exists in Fabric enum

if (Enum.IsDefined(typeof(Fabric),fabStr))

{

// Create enum instance

Fabric fab = (Fabric)Enum.Parse( typeof(Fabric) , fabStr);

// Output from the following statement is: "Silk"

Console.WriteLine("Second value of Fabric Enum is: " + Enum.GetName(typeof(Fabric), ٢));

}

بر می گرداند و یک رشته که سمبل مورد نظر typeof دو پارامتر می گیرد: یک نوع شمارشی که عملگر ISDefined متد

جهت تست را نشان می دهد. شکل دیگر این متد با مقدار عددی برای پارامتر دوم است.

ایجاد fab را می گیرد و یک نمونه از نوع داده ی شمارشی ایجاد می کند. متغیر IsDefined همان پارامترهای Parse متد

مهم است، اگر Parse قبل از کاربرد متد ،enum 2 است. اطمینان از وجود عضو - شده در اینجا معادل همان متغیر قطعه کد 2

آن عضو وجود نداشته باشد یک استثناء روی می دهد.

”Silk“ ای که مقدار آن در پارامتر دوم ارسال میشود بر میگرداند. در این مثال enum یک مقدار رشته ای از GetName متد

برگردانده میشود، چون مقدار ثابت آن 2 است.

های بیتی flag -3 انواع شمارشی و -5 -2

با توانهایی از 2 تصادفی نیست. بیشتر موارد، اعضای نوع شمارشی در عملیات منطقی Fabric تنظیم مقادیر نوع شمارشی

استفاده م یشوند. این مقادیر در نگاشت به مقادیر بیتی منحصر به فرد مفید هستند. ممکن است ترکیبی از این مقادیر را در

کدنویسی تعیین کنید.

Fabric cotWool = Fabric.Cotton | Fabric.Wool;

Console.WriteLine(cotWool.ToString()); // Output: ۵

باشد. می توان این کار را با اضافهکردن صفت Cotton و Wool خروجی در صورتی بامعنی خواهد بود، که آن ترکیبی از

به اعلان نوع شمارشی انجام داد. [flags]

[Flags]

enum Fabric :short {

اعلان نوع شمارشی را بررسی می کند. اگر این صفت موجود باشد، آن نوع شمارشی را به صورت یک ()ToString متد

مجموعه از اعضای نگاشت بیتی در نظر می گیرد. در این مثال نم یتوان یک مقدار سمبلیک معادل 5 پیدا کرد، پس متد

الگوی بیتی “ 101 ” را بکار م یبرد و سمبل هایی که الگوهای بیتی “ 001 ”و” 100 ” دارند را چاپ می کند. خروجی ()ToString

”cotton,wool”. جدید یک لیست جدا شده با کاما است

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

48

-6-2 انواع دادهی مقداری و ارجاعی

2). انواع داده ی ارجاعی شامل کلا سها، - دو نوع داده را پشتیبانی م یکند: انواع مقداری و انواع ارجاعی (شکل 2 CLR

و همچنین byte ،char ،int آرایه ها، واسط ها و نماینده ها هستند. انواع داده ی مقداری شامل انواع داد هی اولیه همچون

و NET. هستند. انواع داده ی ارجاعی و مقداری به وسیله محلشان در سلسله مراتب کلاس struct و enum انواع داده ی

روش تخصیص حافظه متمایز می شوند.

NET. 2- سلسله مراتب کلا سهای - شکل 2

System.ValueType وSystem.Object -1-6 -2

ارث بری می کند. تفاوت این است که انواع داده ی ارجاعی System.Object هر دو نوع داده ی مقداری و ارجاعی از کلاس

ارث بری م یکنند. System.ValueType مستقیما از آن ارثبری می کنند. در حالی انواع داده ی مقداری از کلاس

به عنوان پایه ی همه ی انواع داده، یک مجموعه متد فراهم می کند، که می توانید در هر نوع داده بیابید. System.Object

عضوی از این مجموعه است. همچنین متد های ایجاد یک کپی از یک نوع داده و یک کد درهمسازی ()ToString متد

منحصر به فرد برای یک نوع داده و مقایسه دو نمونه از یک نوع داده نیز وجود دارد.

ارث بری می کند و هیچ عضوی اضافه نم یکند. اما یک سری از متدهای System.Object از System.ValueType

برای مقایسهی ()Equals می کند. برای مثال، متد override ارث بری شده را جهت ایجاد تناسب با انواع داد هی مقداری

ValueType می شود. بنابه تعریف، هم هی انواع داده ی مقداری به صورت ضمنی از کلاس override دو شی همنوع

ارثبری می کنند.

-2-6 تخصیص حافظه برای انواع داده مقداری و ارجاعی -2

برای نیازهای حافظ های آنها م یباشد. در زمان اجرا به انواع ClR تفاوت اصلی انواع داده مقداری و ارجاعی در روش مدیریت

مدیریت شده قرار Heap حافظه تخصیص داده می شود و انواع داده ارجاعی روی یک Stack داده مقداری روی یک

ارجاع داده م یشوند. Stack می گیرند که از

3 نحوه تخصیص حافظه را برای انواع داده ی ارجاعی و مقداری نشان می دهد و اینکه زمان ایجاد یک نمونه از یک - شکل 2

نوع داده ارجاعی و تخصیص آن به یک متغیر دومی چه اتفاقی م یافتد را دنبال کنید.

Apparel myApparel = new Apparel();

Apparel myApparel٢ = myApparel;

#C فصل دوم- اصول

49

2-نحوهی تخصیص حافظه - شکل 3

مدیریت شده به شی مورد نظر حافظه تخصیص م یدهد. Heap در بالای CLR -1

اضافه می شوند. این اطلاعات شامل یک اشارهگر به جدول متد شی و یک Heap -2 اطلاعات سربار شی به

است که برای همزمان سازی دسترسی به شی مابین چند متد استفاده می شود. SyncBlockIndex

آن روی FabType و Price ایجاد می شود و فیلدهای Apparel به عنوان یک نمونه از کلاس myApparel -3 شی

قرار می گیرند. Heap

قرار می گیرد. Stack روی myAparel -4 ارجاع به

قرار می گیرد و یک اشاره گر به Stack 2 ایجاد می شود، آن روی myApparel -5 زمانی که یک متغیر ارجاع جدید

2 به شی یکسانی اشاره می کنند. myApparel و myApparel شی موجود می دهد. هر دو متغیر ارجاعی

ایجاد یک شی ارجاعی به دلیل داشتن چندین مرحله و سربار اضافی مربوط به زمان و منابع، گران هستند. با این وجود،

تنظیم ارجاع های اضافی به یک شی موجود کاملا کارآمد است، چون نیازی به ایجاد یک کپی فیزیکی از یک شی نیست.

عکس آن برای انواع داده مقداری صحیح است.

-3-6 جعبهبندی 1 -2

دارد که مقادیر هر نوع داده ای را می پذیرد. در صورتیکه نوع یک مقدار مشخص نباشد، Object یک نوع داده خاص .NET

بایستی به Object آن یک روش کلی برای ارسال پارامترها و انتساب مقادیر فراهم می کند. با هر چیز منتسب شده به

ذخیره می گردد. دستورات زیر را ملاحظه نمایید: Heap صورت یک نوع داده ارجاعی رفتار شود و روی

int age = ١٧;

object refAge = age;

را به یک نوع داده ی age قرار می دهد. دستور دومی مقدار Stack را ایجاد م یکند و مقدار آن را روی age دستور اول متغیر

Stack قرار می دهد و اشاره گرهای سربار را اضافه می کند و در Heap ارجاعی منتسب می کند. آن دستور مقدار 17 را روی

یک ارجاع به آن اضافه می کند، این عمل را جعبه بندی گویند. تبدیل یک نوع داده ارجاعی به یک نوع داده مقداری "از

جعبه در آوردن 2" گفته می شود و با قالب بندی یک شی به نوع داده اصلی آن انجام می شود. حال شی ایجاد شده در مثال

قبلی را از جعبه در م یآوریم.

int newAge = (int) refAge;

string newAge = (string) refAge; // Fails. InvalidCastException

1 Boxing

2 Unboxing

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

50

توجه داشته باشید مقداری که از جعبه درآورده می شود، باید از همان نوع داده قالب بندی شده باشد. در کل، جعبه بندی

جزئیات را بطور شفاف کنترل می کند. با این وجود، زمان طراحی کد، ذخیرهی مقدار زیادی ClR می تواند صرفنظر شود، چون

را ملاحظه کنید. ArrayList و System.Array از داده های عددی در حافظه را بررسی کنید. برای این منظور کلاس های

هر دو از انواع داده ارجاعی هستند، اما از نظر ذخیره مقادیر داد های ساده کاملا متفاوت عمل می کنند.

همه عناصر را به صورت ArrayList، طراحی شدهاند. در نتیجه Object برای کار روی نوعداده کلی Arraylist متدهای

انواع داده ارجاعی ذخیره میکند. اگر داده ی مورد نظر جهت ذخیره، یک نوع داده ی مقداری باشد، قبل از ذخیره باید

جعبه بندی شود. از طرف دیگر آرایه م یتواند هر دو نوع داده ی مقداری و ارجاعی را نگه دارد. آن با انواع داده ارجاعی همانند

رفتار می کند، ولی انواع داده مقداری را جعب هبندی نمی کند. ArrayList

4 نشان داده شده است، مقادیر - از مقادیر صحیح ایجاد میکند. همانطور که در شکل 2 ArrayList کد زیر یک آرایه و یک

در حافظه کاملا با روش متفاوتی ذخیره م یشوند.

// Create array with four values

int[] ages = {١،٢،٣،۴};

// Place four values in ArrayList

ArrayList ages = new ArrayList();

for (int i=٠; i<۴; i++)

{

ages.add(i); // expects object parameter

}

در حافظه ArrayList و Array 4- مقایسهی - شکل 2

هر مقداری را جعب هبندی می کند. آن سپس سربار ArrayList . ذخیره می کند int متغیر آرایه، مقادیر را به صورت مقادیر

مورد نیاز بوسیله انواع داده ی ارجاعی را اضافه می کند. اگر برنامه کاربردی شما مقدار زیادی داده در حافظه ذخیره م یکند و

2,0 استفاده می کنید، کلاس NET . را نیاز ندارد، آرایه یک پیاده سازی کاراتری است. اگر از ArrayList ویژگی های خاص

را شامل است. ArrayList بهترین انتخاب است، چون جعب هبندی را حذف م یکند و ویژگی های انعطاف پذیر List

آزاد م یشود. در صورتی که حد مشخص Stack نکته : زمانی که یک متغیر از میدان خارج می گردد، حافظه ی آن از روی

کنترل می گردد و بطور NET. به وسیله ی GC . را آزاد م یکند Heap حافظه ی آشغال روی GC ، حافظه سیستم استفاده گردد

اتوماتیک در فاصله های غیرقابل پیش بینی اجرا می گردد.

-7-2 فضاهای نامی

همانطور که می دانید، فضاهای نامی یک روش برای سازمان دهی کلاسهای مرتبط و انواع داده ای دیگر فراهم می کند. برخلاف

یک فایل یا یک قطعه، فضای نامی به جای گروه بندی فیزیکی، یک گروه بندی منطقی انجام می دهد. زمانی که یک کلاس

تعریف می کنند، می توانید آن را در یک تعریف فضای نامی قرار دهید. سپس اگر بخواهید یک کلاس دیگر در فایل دیگری

تعریف کنید که کار مرتبط با آن انجام می دهد، می توانید آن را در همان فضای نامی قرار دهید. ایجاد یک گروه بندی منطقی،

تشخیص کلاس های مورد استفاده را برای توسع هدهندگان دیگر ساده می کند.

#C فصل دوم- اصول

51

namespace CustomerPhoneBookApp

{

using System;

public struct Subscriber

{

// Code for struct here...

}

}

قراردادن یک نوع داده در یک فضای نامی، یک نام طولانی به آن نوع داده می دهد که شامل چندین اسم جدا شده با نقطه

،Subscriber می باشد، که در انتها نام کلاس قرار می گیرد. در مثال قبلی نام کامل ساختار

است. این عمل کاربرد کلاسهای هم نام در فضاهای نامی مختلف را در یک برنامه CustomerPhoneBookApp.Subsciber

بدون هیچ ابهامی مجاز می دارد.

می توانید فضاهای نامی تودرتو را ایجاد کنید و یک ساختار سلسله مراتبی برای انواع داده ای خودتان بسازید.

namespace Arshia

{

namespace ProCSharp

{

namespace Basics

{

class NamespaceExample

{

// Code for the class here...

}

}

}

}

نام هر فضای نامی از نام های فضاهای نامی که آن را در بر می گیرند تشکیل شده است، که با نقطه از هم جدا شد هاند. با نام

بیرونی ترین فضای نامی شروع شده و به نام کوتاه خودش ختم م یشود.

،NamespaceExample است و نام کامل کلاس Arshia.ProCSharp ،ProCSharp پس نام کامل فضای نامی

است. Arshia.ProCSharp.Basics.NameSpaceExample

می توانید در تعاریف فضای نامی خودتان، این قاعده را برای سازمان دهی فضاهای نامی بکار برید. بنابراین کد قبلی م یتواند

بصورت زیر نوشته شود.

namespace Arshia.ProCSharp.Basics

{

class NamespaceExample

{

// Code for the class here...

}

}

توجه: اعلان یک فضای نامی چندبخشی به صورت تو در تو، در داخل فضای اسمی دیگر مجاز نیست.

فضاهای نامی به اسمبلی ها مرتبط نیستند. در یک اسمبلی می توان فضاهای نامی مختلفی تعریف کرد یا در فضاهای نامی

انواع داده ای تعریف کرد که در اسمبلی های مختلفی قرار دارند.

using -1 دستور -7 -2

اختصار نوشتن نام کامل یک کلاس را اجازه می دهد. برای انجام این کار، فضای نامی کلاس را #C ، همانطور که قبلا گفته شد

به برنامه ربط دهید. در ادامه ی فایل می توانید به انواع داده ای موجود در آن فضای نامی using در بالای فایل با کلمه کلیدی

بوسیله نام نوع داده ارجاع کنید.

using System;

using Arshia.ProCSharp;

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

52

شروع می شوند. چون بیشتر کلا سهای مفید تهیه شده توسط using System با دستور #C بطور مجازی همه کدهای منبع

دربرگرفته شده اند. System مایکروسافت در فضای اسمی

یک نوع داده هم نام داشته باشند، شما نام کامل را برای آنها استفاده using اگر در فضاهای نامی ارجاع شده با دستورات

خواهید کرد تا مطمئن شوید کامپایلر کدام نوع داده را دستیابی می کند. برای مثال، فرض کنید کلاسهایی بنام

وجود دارند. Arshia.ProCSharp.OOP و Arshia.ProCSharp.Basic در فضاهای نامی NamesspaceExample

ایجاد کنید و یک نمونه از کلاس Arshia.ProCSharp در فضای نامی Test اگر شما یک کلاس بنام

در این کلاس ایجاد کنید، باید مشخص کنید که کدام یک از دو کلاس بالا را مد نظر دارید. NameSpaceExample

using Arshia.ProCSharp;

class Test

{

public static int Main()

{

Basics.NamespaceExample nSEx = new Basics.NamespaceExample();

// do something with the nSEx variable

return ٠;

}

}

++C در header هیچ عمل پیوند فیزیکی بین فای لها انجام نمی دهد و فضاهای نامی معادل فایل های using دستور

نیستند.

بیشتر سازمان ها مدت زمانی را برای توسعه یک شمای فضای نامی صرف م یکنند تا توسعه دهندگان بتوانند به راحتی

کلاس های مورد نیاز خود را پیدا کنند و از تداخل نامی در کتابخان ههای خود جلوگیری کنند.

-2 اسامی مستعار فضای اسمی -7 -2

انتساب اسامی مستعار به کلا سها و فضاهای نامی است. استفاده از نام طولانی یک فضای ،using کاربرد دیگر کلید کلیدی

می توانید یک نام مستعار به فضای نامی using نامی در برنامه به دفعات زیاد خسته کننده است. با استفاده از دستور ساده

انتساب دهید.

using alias = NamespaceName;

انتساب میدهد و این را برای ایجاد Arshia.ProCSharp.Basic را به فضاینامی Introduction مثال زیر نام مستعار

به کار می برد. به کاربرد توصیف کنندهی 1 نام مستعار فضای نامی (::) توجه کنید. NamespaceExample یک شی از کلاس

در همان میدان تولید شده Introduction آن به اجبار نام مستعار فضای نامی را جستجو می کند. اگر یک کلاس به نام

باشد، تداخل رخ م یدهد. عملگر :: حتی در صورت وجود تداخل، امکان استفاده از آن نام مستعار را فراهم می سازد. کلاس

به GetType استفاده می کند. متد ()GetType دارد که از متد ()GetNamespace یک متد به نام NamespaceExample

دسترسی دارد که نوع کلاس را نشان می دهد. این شی را برای برگرداندن نام فضای نامی کلاس بکار Type یک شی از نوع

می برید.

using System;

using Introduction = Arshia.ProCSharp.Basics;

class Test

{

public static int Main()

{

Introduction::NamespaceExample NSEx =

new Introduction::NamespaceExample();

Console.WriteLine(NSEx.GetNamespace());

return ٠;

}

}

1 Qualifier

#C فصل دوم- اصول

53

namespace Arshia.ProCSharp.Basics

{

class NamespaceExample

{

public string GetNamespace()

{

return this.GetType().Namespace;

}

}

}

I/O -8-2 کنسول

Console بدست آورده باشید. در این قسمت چندین متد ایستای کلاس #C تا اینجا باید یک آشنایی پایه ای از انواع دادهی

مفید هستند. #C را برای خواندن و نوشتن داده استفاده میکنیم، چون این متدها زمان نوشتن برنامههای پایهای

را استفاده می کنید. این متد یک جریان 1 ()Console.ReadLine برای خواندن یک خط متنی از پنجره کنسول، متد

ورودی را از پنجره کنسول خوانده و رشته ورودی را بر میگرداند. همچنین دو متد برای نوشتن کنسول وجود دارد.

Console.Write()

مقدار ارجاعی را به پنجره کنسول م ینویسد.

Console.WriteLine()

همان کار را انجام می دهد، اما یک کاراکتر خط جدید به انتهای خروجی اضافه می کند.

شکلهای متنوع این متدها برای انواع دادهای از پیش تعریف شده وجود دارند. پس در بیشتر موارد، تبدیل مقادیر به رشته ها

قبل از نوشتن آنها لازم نیست. برای مثال، کد زیر به کاربر اجازه می دهد یک خط متنی وارد کند و آن را نمایش میدهد.

string s = Console.ReadLine();

Console.WriteLine(s);

نمایش C زبان printf به شما اجازه می دهد، یک خروجی فرم تدهی شده را همانند تابع ()Console.WriteLine متد

تعدادی پارامتر به آن ارسال می کنید. اولین پارامتر رشته ای است که در آن ،WriteLine دهید. برای استفاده از این رفتار

رشته از نشانه گذارها استفاده می شود. نشانه گذارها محل قرارگیری خروج یها در داخل متن را با {} مشخص می کنند. هر

نشانه گذار یک اندیس با پایة صفر را برای مشخص کردن تعداد پارامترها استفاده می کند. برای مثال { 0} اولین پارامتر لیست

است. کد زیر را ملاحظه کنید.

int i = ١٠;

int j = ٢٠;

Console.WriteLine("{٠} plus {١} equals {٢}", i, j, i + j);

این کد خروجی زیر را نمایش م یدهد.

10 plus 20 equals 30

می توانید یک طول برای مقدار مشخص کنید و متن را با آن طول تنظیم کنید. مقادیر مثبت برای تنظیم راست و مقادیر منفی

طول مقدار است. w اندیس پارامتر و n را به کار می برید که {n,w} برای تنظیم چپ استفاده می شوند. برای این کار فرمت

int i = ٩۴٠;

int j = ٧٣;

Console.WriteLine(" {٠،۴}\n+{١،۴}\n ----\n {٢،۴}", i, j, i + j);

نتیجه به صورت زیر است.

٩۴٠

+ ٧٣

----

1 Stream

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

54

١٠١٣

در نهایت می توانید یک رشته فرمت به همراه دقت (اختیاری) اضافه کنید. لیستی از فرمت بندی های مورد استفاده در انواع

داده ی پیش تعریف شده را به صورت زیر می بینید:

رشته توصیف

فرمت پول محلی C

فرمت دسیمال. یک عدد صحیح را به مبنای 10 بر می گرداند و اگر دقت آن مشخص باشد D

صفرهایی را به آن اضافه می کند.

فرمت علمی (توانی). مشخص کنندة دقت، تعداد ارقام اعشار را مشخص می کند (پیش فرض آن 6 E

حالت سمبل توان را تعیین می کند. (E یا e) است). بزرگی یا کوچکی حرف رشته فرمت

فرمت اعشاری ثابت. مشخص کنندة دقت، ارقام اعشار را کنترل می کند. صفر قابل قبول است. F

را بر اساس حالت مقدار به کار م یبرد. e یا f فرمت کلی. فرمت دهی G

فرمت عدد، عدد را با جدا کننده هزار (کاما) فرمت می کند. برای مثال 320،767،44 N

فرمت درصد P

فرمت هگزا دسیمال. مشخص کنندة دقت برای تعیین تعداد صفرهای اضافی به کار م یرود. X

در بقیه موارد به حالت حروف حساس نیست. اگر م یخواهید یک رشته فرمت را e/E توجه کنید که رشته فرمت به استثناء

بکار برید، بایستی آن را بلافاصله بعد از نشان هگذار مربوط به آن پارامتر قرار دهید و شماره پارامتر و طول مقدار را با کاما از

2C ، هم جدا کنید. برای مثال، جهت فرمت دهی یک مقدار دسیمال به صورت واحد پول محلی کامپیوتر با دقت دو رقم اعشار

را به کار می برید.

decimal i = ٩۴٠٫٢٣m;

decimal j = ٧٣٫٧m;

Console.WriteLine(" {٠،٩:C٢}\n+{١،٩:C٢}\n ---------\n {٢،٩:C٢}", i,j, i + j);

خروجی این کد در ایالت متحده به صورت زیر است.

$٩۴٠٫٢٣

$٧٣٫٧٠

---------

$١،٠١٣٫٩٣

به عنوان نکته نهایی، شما می توانید جهت نگاشت فرمت بندی کاراکترهای جایگزین را به جای رشته های فرمت به کار برید.

به عنوان مثال:

double d = ٠٫٢٣۴;

Console.WriteLine("{٠:#.٠٠}", d);

خروجی . 23 را نشان م یدهد. اگر کاراکتری در آن محل نباشد، سمبل # صرف نظر می شود و صفر ها با کاراکترهای موجود در

آن موقعیت جایگزین می شوند و اگر کاراکتری نباشد، صفر چاپ م یشود.

-9-2 خلاصه

است. #C • انواع دادهی اولیه، پایهی هر نوع داده ی تعریف شده در

یک زبان برنامه نویسی ساده، مدرن و شیگرا و... است. #C •

باید داخل یک کلاس قرار گیرد. #C • هر قطعه کد

#C فصل دوم- اصول

55

است. #C نقطهی ورودی هر برنامهی ()Main • متد

در تعریف متغیرها به حالت حروف حساس است. #C •

نوشته می شوند، با استثناء متغیرهای محلی و پارامترها که با حالت Pascal همهی انواع داده به صورت #C • در

نوشته می شوند. Camel

وجود دارد. //، /* */، /// #C • سه روش برای مشخص کردن توضیحات در

است. FCL نام مستعار یک ساختار داده از #C • هر نوع دادهی پایه در

و...دارند. TryParse ،Parse • هر ساختار داده تعدادی متد مفید همچون

،D به ترتیب حر فهای single و float ،decimal • مقادیر حرفی انتساب داده شده به متغیرهایی از نوع دادهی

را به صورت پسوند مقدار عددی خود استفاده می کنند. M و F

است. C همانند زبان #C • عملگرهای ریاضی، منطقی و رابط های

عملگرهای & و | همواره هر دو عبارت را ارزیابی می کنند. اینها زمانی استفاده م یشوند که مقادیر عبارات از یک

تابع برمی گردند و می خواهیم از فراخوانی متدها مطمئن شویم.

استفاده می شوند. #C • راهنماهای پی شپردازش برای راهنمایی کامپایلر

استفاده کرد. undef# و def# • برای کامپایل شرطی می توان از راهنماهای

یک روش مناسب برای ایجاد یک مجموعه ساختیافته از سمبل ها جهت نمایش مقادیر ثابت پیشنهاد می کند

نوع شمارشی خوانایی برنامه را بالا م یبرد و تغییرات برنامه را راح تتر و منسج متر می سازد.

می توان یک مقدار شمارشی را به نام رشت های آن تبدیل کرد.

مقادیر شمارشی می توانند بصورت ترکیبی استفاده شود، بنابراین مقادیر عددی آنها را توا نهایی از 2 در نظر

می گیرند تا نگاشت بیتی امکا نپذیر باشد.

و انواع Stack • انواع داده ی مقداری و ارجاعی از نظر تخصیص حافظه و مدیریت با هم فرق دارند. انواع مقداری در

مدیریت شده ذخیره می گردند. Heap ارجاعی در

ارث بری می کنند. System.Object و انواع دادهی ارجاعی از System.ValueType • انواع دادهی مقداری از

تبدیل می کند. object • جعبه بندی مقدار هر متغیری را به نوع

را به یک نوع خاص تبدیل می کند. object • از جعبه درآوردن، مقدار یک متغیر از نوع

فضای نامی یک گرو هبندی منطقی از کلا سها و انواع داد های دیگر فراهم می سازد. ممکن است این کلا سها محل

فیزیکی متفاوتی داشته باشند.

در using • در هنگام استفاده ی کلاس، باید نام کامل کلاس را نوشت. ولی در صورت استفاده از کلمه ی کلیدی

ابتدای فایل، می توان فقط به نام کوچک کلاس اشاره کرد.

برای دوری از اسامی طولانی فضاهای نامی، م یتوان از اسامی مستعار برای فضاهای نامی طولانی استفاده کرد و برای

دسترسی به کلا سهای آن فضای نامی بوسیله ی نام مستعار از عملگر :: استفاده می کنند.

Mohsen_mahyar@yahoo.com -C # اصول زبان

آنچه که در این فصل یاد خواهید گرفت:

NET. لازم است یک توسعه دهنده از ویژگی های دیگر ،#C علاوه بر عناصر اصلی یک برنامه :#C - مروری بر برنامه

همچون توضیحات و قراردادهای نامگذاری پیشنهاد شده آگاه باشد.

برای نمایش اعداد، کاراکتر و FCL - انواع داده ی اولیه 1: انواع داده ی اولیه همان انواع داده پایه ای تعریف شده بوسیله

تاریخ ها است.

گرامر عملگرهای سنتی را برای انجام عملیات ریاضی و شرطی به کار می برد. #C : - عملگرها

- نوع شمارشی: نوع شمارشی یک روش مناسب برای تخصیص توصیف است که م یتواند برای ارجاع به یک مجموعه

اصیل مقادیر استفاده شود.

از نوع مقداری یا ارجاعی هستند. فهم تفاوت مابین این دو #C - انواع داده مقداری و ارجاعی: همه انواع داده ای در

نوع داده مهم است و اینکه چگونه کارایی برنامه را تحت تاثیر قرار م یدهند.

تعریف کردند، که هدف طراحی #C یک استاندارد پیشنهاد شده برای زبان برنامه نویسی ECMA در سپتامبر 2000 ، گروه کاری

334ECMA- این زبان را تولید یک زبان برنامه نویسی آسان، پیشرفته، همه منظوره و شی گرا بیان کرد. استاندارد تعریف شده

است. آن یک زبان برای ارتقاء قدرت نرم افزار با کنترل ++C است که یک زبان مرتب با گرامر زبان جاوا و قوانینی از

محدوده ی آرایه، کنترل نوع داده قوی 2 و ممانعت از متغیرهای مقداردهی اولیه نشده طراحی شده است.

را نشان می دهد. انواع داده ی مقداری و #C را به شما معرفی می کند و بخش های اصلی یک برنامه #C این فصل اصول زبان

ارجاعی را مقایسه می کند و گرامر اپراتورها و دستورات برنامه را شرح می دهد.

برنامه نویس حرف های با این مفاهیم آشنا است. با این وجود، بخش انواع داده مقداری و ارجاعی توجه بیشتری لازم دارد. فهم

اختلاف در نحوه ی اداره ی انواع داده مقداری و ارجاعی روی طراحی برنامه شما تاثیرگذار خواهد بود.

1 Primitive

2 Strong Type cheking

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

36

#C -1-2 چیدمان یک برنامه

را نشان می دهد. #C 1 بعضی از ویژگی های یک برنامه - شکل 2

1- شکل 2

که Apparel است که منطق برنامه را در بر دارد و یک کلاس myApp 1 شامل یک کلاس بنام - کد موجود در شکل 2

نامگذاری می کند. سپس myApparel را ایجاد کرده و آن را Apparel داده هایی را در بر می گیرد. این برنامه یک نمونه از

در کنسول استفاده می شود. مهمترین ویژگی های Price و FabType این شی برای چاپ مقادیر اعضای کلاس بنام های

مورد توجه بصورت زیر هستند:

همه انواع داده ای System را مشخص می کند. همانطور که می دانید فضای نامی System فضای نامی using -1 دستور

به کامپایلر می گوید زمان رفع ارجا عها این فضای نامی را جستجو کنند، که using پایه را شامل می شود. دستور

System.web.UI.WebControls.Label استفاده از اسامی کامل را غیرضروری می کند. برای مثال، به جای

ارجاع کنید. Label می توانید به

-2 همه داده ها و منطق برنامه باید در یک تعریف نوع داده قرار گیرند. همه داده ها و منطق برنامه باید در یک کلاس،

متغیر سراسری خارج از دامنه وجود ندارد. #C در ،VB ساختار، نوع شمارشی، واسط یا نماینده تعبیه شوند. برخلاف

به کلاس های public دسترسی به انواع داده و اعضای آنها به وسیله معرفها 1 کنترل می شود. دراین مثال معرف

دسترسی داشته باشند. Apparel خارجی اجازه م یدهد به دو عضو کلاس

لازم است. این متد به عنوان نقطه ورودی برنامه عمل می کند. آن باید همواره #C برای هر برنامه اجرایی Main () -3 متد

یک نوع داده بازگشتی و Main شده ی overload آن بزرگ باشد. شکلهای M را داشته باشد و حرف static معرف

یک لیست پارامتر ورودی را تعریف میکنند. نمونهی زیر یک مقدار صحیح بر میگرداند.

static int Main()

{

return ٠; // must return an integer value

}

مثال زیر، لیست آرگونهای خط فرمان را به عنوان پارامتر دریافت کرده و یک مقدار صحیح بر میگرداند.

static int Main(string[] args)

{

// loop through arguments

foreach (string myArg in args)

Console.WriteLine(myArg);

return ٠;

1 modifier

#C فصل دوم- اصول

37

}

پارامتر آن یک آرایه ی رشته ای از محتوای خط فرمان است که برای احضار برنامه استفاده می شود. برای مثال، این خط فرمان

را اجرا میکند و دو مقدار از طریق پارامتر بر آن ارسال می کند. MyApparel برنامه

C:\> MyApparel ۵ ۶

می تواند محتویات خط فرمان را بدست آورد. System.Environmenet.CommandLine توجه: خصوصیت

#C -1-1 تذکرات عمومی برنامه نویسی -2

حساسیت به حالت حروف

جایگزین کنید، Class را با class 1- همه متغیرها و کلمات کلید با حساسیت به حالت حروف متمایز می شوند. در شکل 2

کد کامپایل نخواهد شد.

قراردادهای نامگذاری

شما رعایت می شود. علاوه بر ارتقاء سازگاری، رعایت #C قراردادهای نا مگذاری فراهم م یکند که در کد ECMA استاندارد

1 بعضی از توصیه های مهم - سیاست نامگذاری، خطاهای مرتبط با حساسیت به حالت حروف را می تواند کاهش دهد. جدول 2

را خلاصه کرده است.

1- قراردادهای نامگذاری - جدول 2

نوع توضیحات

کلاس • اسم یا عبارت اسمی

شروع نشود. I • سعی کنید با حرف

زیر خط را بکار نبرید.

public const double GramToPound = ثابت ; ۴۵۴٫٠

نوع شمارشی • برای اسامی شمارشی نام واحدی بکار برید.

public enum WarmColor { Orange, Yellow, Brown}

داشته باشد. EventHandler رویداد • متدی که رویدادها را هدایت می کند، باید پیشوند

داشته باشند. EventArgs باید پیشوند Event • کلاس های آرگومان

دارد. Exception استثناء • پسوند

IDisposable . را دارد I واسط • پیشوند

متغیرهای

محلی

نوشته می شوند. Pascal دارند، بصورت public • متغیرهایی که معرف

int myIndex

متد • فعل یا عبارات فعلی را برای نامگذاری استفاده کنید.

فضای اسمی • نباید یک فضای اسمی و کلاس هم نام باشند.

برای دوری از اسامی یکسان از پیشوندها استفاده کنید. برای مثال از نام شرکت به

عنوان پیشوند برای فضاهای نامی پروژه های خود استفاده کنید.

Arshia.GraphicsLib

خصوصیت • اسم یا عبارت اسمی بکار برید.

پارامتر • اسامی با معنی که هدف پارامتر را شرح م یدهند، بکار برید.

استفاده می کنند. Camel استفاده می کنند به غیر از پارامتر و متغیر محلی که از حالت Pascal همه موارد بالا از حالت

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

38

توجه کنید که حالت یک نام م یتواند بصورت زیر بر اساس دو طرح نوشتن حروف بزرگ باشد:

کاراکتر اول هر کلمه بزرگ نوشته می شود. : Pascal -1

به استثناء کلمه ی اول، حرف اول بقیه کلمات بزرگ نوشته می شود. :Camel -2

#C توضیحات در برنامه

توضیح یک خطی ( // ) و توضیحات چند خطی ،Xml سه نوع توضیح تعبیه شده را پشتیبانی می کند: یک نسخه #C کامپایلر

( /* */) که برای بیشتر برنام هنویسان آشنا هستند.

// for a single line

/* for one or more lines

*/

/// <remarks> XML comment describing a class </remarks>

است که یک قطعه کد همچون یک XML با سه خط کج ( /// ) آغاز می شود و معمولا شامل برچسب های XMl یک توضیح

را برای بدست آوردن اطلاعات XML می تواند برچسب های #C . ساختار، یک کلاس یا عضو کلاس را مستندسازی می کند

اضافی و صادر کردن 1 آنها به یک فایل خارجی گسترش دهد.

هشت برچسب اصلی دیگر را تشخیص #C برای شرح دادن یک نوع داده استفاده می شود. کامپایلر <remarks> برچسب

می دهد که به عنصر خاصی از برنامه تخصیص داده شد هاند. این برچسب ها در بالای خطوط کد مربوطه قرار می گیرند.

XML 2-برچسب های - جدول 2

برچسب شرح

یک مثال از نحوه استفاده از ویژگی خاص برنامه مابین برچسب شروع و پایان نشان م یدهد. :<example>

<exception

cref="Excep">

نام استثناء را شامل است . cref خصوصیت

///<exceptioncref="NoParmException">

</exception>

<include

file="myXML">

دیگر مشخص می شود که مستندسازی این کد در آن فایل قرار xml نام یک فایل ،file در خصوصیت

گرفته است .

<param

name="parm١">

نام پارامتر را شامل می شود. name خصوصیت

<permission

cref= "">

بیشتر مواقع دارای مقادیر زیر است:

///<permissioncref="System.Security.PermissionSet">

</permission>

یک توصیف متنی در مورد نوع مقدار برگشتی از یک متد یا خصوصیت را مشخص می کند. <returns>

نیست فراهم می کند. <summary> اطلاعات اضافی در مورد نوع داده ای که در بخش <remarks>

<seealso

cref="price">

نام یک خصوصیت، متد یا هر عضو دیگر قرار می گیرد. cref در خصوصیت

استفاده می شود VS.NET در intellisense توصیف یک کلاس را در بر می گیرد که به وسیله <summary>

1 export

#C فصل دوم- اصول

39

مجزا صادر شوند و سپس به وسیله تکنی کهای XML در حقیقت برای آن است که می توانند به یک فایل XML مقایر توضیحات

استاندارد پردازش شوند. کامپایلر بطور پی شفرض این کار را انجام نمی دهد، باید آن را تنظیم کرد. XML پارس کردن

ایجاد میکند. ConsoleXML.xml بنام XML را کامپایل کرده و یک فایل ConsoleApp.cs خط زیر کد منبع

C:\> csc consoleapp.cs /doc:consoleXML.xml

کدتان خواهید دید. public 1 را کامپایل کنید، هشدار زیر را برای همه اعضای - اگر کد شکل 2

Warning CS١۵٩١: Missing XML comment for publicly visible type ...

1591 را به خط کامپایل اضافه کنید. در این گزینه میتوانیم شمارههای مختلفی را با nowarn:/ برای منع این هشدار گزینه

کاما از هم جدا کنیم.

-2-2 انواع داده اولیه

سه بخش بعدی ویژگیهایی را شرح می دهند که در اکثر زبانهای برنامه نویسی خواهید یافت. متغیرها و انواع داده ها،

برای ساختن #C عملگرها، عبارات و دستورات. این بحث با انواع داده اولیه شروع می شود که اینها انواع دادهای هستهی

کلاسها یا ساختارهای پیچیدهتر هستند. متغیرهای این نوع داده ها، یک مقدار منفرد دارند و اندازه آنها از پیش تعریف

3 یک لیست رسمی از انواع داده اولیه فراهم می کند . - شده است. جدول 2

#C 3-لیست انواع دادهی اولیه در - جدول 2

توصیف داده FCL نوع داده #C نوع داده اولیه

نوع داده ی پایه برای هر نوع داد هی دیگر System.Object object

یک دنباله از کارکترهای یونیکد System.String string

اعداد اعشاری مختصر با 28 رقم معنی دار System.Decimal decimal

نشان داده false یا true یک مقدار که به صورت System.Boolean bool

می شود .

یک کاکتر یونیکد 16 بیتی System.Char char

نوع داده صحیح 8 بیتی بدون علامت System.Byte byte

نوع داده صحیح 8 بیتی علامت دار System.SByte sbyte

عدد صحیح علامت دار 16 بیتی System.Int16 short

عدد صحیح علام تدار 32 بیتی System.Int32 int

عدد صحیح علامت دار 64 بیتی System.Int64 long

عدد صحیح بدون علامت 16 بیتی System.UInt16 ushort

عدد صحیح بدون علامت 32 بیتی System.UInt32 uint

عدد صحیح بدون علامت 64 بیتی System.UInt60 ulong

عدد اعشاری System.Single (single(float

عدد اعشاری با دقت مضاعف System.Double double

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

40

نگاشت شدهاند، که میتوانند به جای همدیگر استفاده شوند. BCL همانطور که جدول نشان می دهد، انواع دادهای اولیه به 1

دستورات زیر را ملاحظه کنید:

System.Int٣٢ age = new System.Int٣٢(١٧);

int age = ١٧;

System.Int٣٢ age = ١٧;

به عنوان نام مستعار 2 برای نوع داده int از کلمه کلیدی #C یکسانی تولید میکنند. نسخه ی کوتاه در IL هر سه دستور، کد

برای همه انواع داده اولیه اسامی مستعار در نظر گرفته است. #C . 32 استفاده می کند System.Int

چند نکته زیر را هنگام کار با انواع داده اولیه بخاطر داشته باشید:

- کلمات کلیدی که انواع داده ی مقداری اولیه را تعیین می کنند، در واقع اسامی مستعار یک ساختار معینی هستند.

32Int اعضای خاصی از این ساختارها برای دستکاری انواع داده اولیه بکار برده م یشوند. برای مثال ساختار

فیلدی که بزرگترین مقدار صحیح 32 بیتی را بر م یگرداند و یک متد که رشته عددی را به یک عدد صحیح تبدیل

می کند، را در بر دارد.

int iMax = int.MaxValue; // Return largest integer

int pVal = int.Parse("١٠٠"); // converts string to int

تبدیل ضمنی را پشتیبانی م یکند. اگر تبدیل یک تبدیل امن باشد، در نتیجه ی حاصله هیچ داد های از #C کامپایلر

دست نمی رود. این زمانی اتفاق می افتد که مقصد تبدیل دقت بالایی نسبت به شی مبداء داشته باشد، که تبدیل

گسترش 3 نام دارد. در تبدیل کاهشی 4 که مقصد دقت کمتری دارد، باید عمل تبدیل به صورت صریح باشد،

قالب بندی برای تبدیل یک مقدار از یک نوع به یک نوع دیگر استفاده م یشود. این عمل با قرار دادن نوع داد هی

مقصد در داخل پرانتزهایی قبل از مقدار مورد نظر انجام می شود.

short i١۶ = ۵٠; // ١۶-bit integer

int i٣٢ = i١۶; // Okay: int has greater precision

i١۶ = i٣٢; // Fails: short is ١۶ bit, int is ٣٢

i١۶ = (short) i٣٢; // Okay since casting used

یک حرف به دنبال مقدار مورد نظر نیاز double ،decimal ،float • مقادیر حرفی 5 تخصیص یافته به انواع داد هی

نیاز دارد. m یا M به decimal و d یا D به double ،f یا F به Float . دارند

• decimal pct = .١۵M; // M is required for literal value

دارد. String بقیه این بخش مروری بر مفیدترین انواع داده اولیه به استثناء

Decimal

یک عدد اعشاری 128 بیتی با دقت بسیار بالا است. دقت آن 28 رقم اعشار است و در محاسبات مالی decimal نوع داده ی

ارائه می دهد. decimal که گرد کردن قابل تحمل نیست، بکار برده می شود. این مثال سه متد برای نوع داده

decimal iRate = ٣٫٩٨٣۴M; // decimal requires M

iRate = decimal.Round(iRate,٢); // Returns ٣٫٩٨

decimal dividend = ۵١٢٫٠M;

decimal divisor = ۵١٫٠M;

decimal p = decimal.Parse("١٠٠٫٠۵");

// Next statement returns remainder = ٢

decimal rem = decimal.Remainder(dividend,divisor);

bool

1 Base Class Library

2 Alias

3 Widening conversion

4 Narroving conversion

5 literal

#C فصل دوم- اصول

41

به یک عدد صحیح ممکن bool هستند. قالب بندی یک مقدار bool تنها مقادیر ممکن یک نوع داد هی true و false

ممکن نیست. bool به 1 یا قال ببندی 1 یا 0 به یک مقدار true نیست. برای مثال تبدیل

bool bt = true;

string bStr = bt.ToString(); // returns "true"

bt = (bool) ١; // fails

Char

16 بیتی را نشان می دهد و به صورت یک عدد صحیح بدون علامت پیاده سازی می شود. یک کاراکتر یونیکد 1 char نوع داده

عملیات انتساب متعددی را می پذیرد: یک مقدار کاراکتری مابین دو علامت تک کوتیشن ( )، یک ،char یک نوع داده

تعدادی متد System.char همانطور که مثال زیر نشان می دهد، ساختار .escape مقدار عددی قالب بندی شده، یک دنباله

مفید فراهم می کند.

myChar = 'B'; // 'B' has an ASCII value of ۶۶

myChar = (char) ۶۶; // Equivalent to 'B'

myChar = '\u٠٠۴٢'; // Unicode escape sequence

myChar = '\x٠٠۴٢'; // Hex escape sequence

myChar = '\t'; // Simple esc sequence:horizontal tab

bool bt;

string pattern = "١٢٣abcd?";

myChar = pattern[٠]; // '١'

bt = char.IsLetter(pattern,٣); // true ('a')

bt = char.IsNumber(pattern,٣); // false

bt = char.IsLower(pattern,٠); // false ('١')

bt = char.IsPunctuation(pattern,٧); // true ('?')

bt = char.IsLetterOrDigit(pattern,١); // true

bt = char.IsNumber(pattern,٢); // true ('٣')

string kstr="K";

char k = char.Parse(kstr);

Byte , sbyte

عدد صحیح 8 بیتی علامتدار با sbyte عدد صحیح بدون علامت با مقداری از 0 تا 255 است و byte یک نوع داده ی

مقداری از 128 - تا 127 است.

byte[] b = {٠x٠٠, ٠x١٢, ٠x٣۴, ٠x۵۶, ٠xAA, ٠x۵۵, ٠xFF};

string s = b[۴].ToString(); // returns ١٧٠

char myChar = (char) b[٣];

long وint و Short

ushort اینها به ترتیب اعداد صحیح علامتدار 16 و 32 و 64 بیتی را نشان می دهند. نسخه های بدون علامت آنها به ترتیب

هستند. ulong و uint و

short i١۶ = ٢٠٠;

i١۶ = ٠xC٨ ; // hex value for ٢٠٠

int i٣٢ = i١۶; // no casting required

double و single

معادل Single نوع داد هی NET.X اینها قالب های 32 بیتی با دقت معمولی و 64 بیتی دقت مضاعف را نمایش م یدهند. در

است. float

38 با 7 رقم اعشار دارد. ^10* 45 تا 3,4 -^10* یک مقدار در محدود هی 1,5 single - نوع داده

308 با 15 الی 16 رقم اعشار دارد. ^10* 324 تا 1,7 -^10* یک مقدار در محدود هی 5 double - نوع داده ی

برمی گردانند. تقسیم 0,0 Nan ، - عملیات ممیز شناور برای نشان دادن اینکه نتیجه ی یک محاسبات تعریف نشده است

است. NaN ، بر 0,0

1 unicode

Mohsen_mahyar@yahoo.com - - C# برنامه نویسی

42

را برای تبدیل یک نوع داد هی ممیز شناور به هر نوع دیگر بکار برید . System.Convert - متد

float xFloat = ٢۴۵۶٧٫۶۶F;

int xInt = Convert.ToInt٣٢(xFloat); // returns ٢۴۵۶٧

int xInt٢ = (int) xFloat;

if(xInt == xInt٢) { } // False

string xStr = Convert.ToString(xFloat);

single zero = ٠;

if (Single.IsNaN(٠ / zero)) { } // True

double xDouble = ١٢۴٫۵۶D;

را برای تبدیل یک رشتة عددی به نوع داد هی مشخص به کار می برند. TryParse و Parse متدهای

short shParse = Int١۶.Parse("١٠٠");

int iParse = Int٣٢.Parse("١٠٠");

long lparse = Int۶۴.Parse("١٠٠");

decimal dParse = decimal.Parse("٩٩٫٩٩");

float sParse = float.Parse("٩٩٫٩٩");

double dbParse = double.Parse("٩٩٫٩٩");

پارس کردن شرطی را فراهم می کند. برای تعیین موفق بودن عمل پارس یک پارامتر بولین بر ،NET در 2,0 TryParse

می گرداند، که روشی برای دوری از کد کنترل رسمی استثناء فراهم م یسازد.

int result;

// parse string and place result in result parameter

bool ok = Int٣٢.TryParse("١٠٠", out result);

bool ok = Int٣٢.TryParse("١٠٠", NumberStyles.Integer, null,out result);

در فرم دوم از این متد، اولین پارامتر یک رشته عددی مورد نظر جهت پارس کردن، پارامتر دوم نوع عدد در رشته را مشخص

می کنند. مقدار بازگشتی در پارامتر چهارم قرار می گیرد.

-3-2 عملگرهای ریاضی، منطق و شرطی

برای عملیات ریاضی، دستکاری بی تها و کنترل شرطی برنامه استفاده می شوند، که باید همه برنامه نویسان با #C عملگرهای

آنها آشنا باشند.

-1-3 عملگرهای ریاضی -2

4 عملگرهای عددی پایه را خلاصه می کند. اولویت این عملگرها در حین ارزیابی یک عبارت در پرانتزها اعمال - جدول 2

می شود. 1 بالاترین سطح اولویت است.

4- جدول 2

عملگر توصیف مثال

(3) +

-

جمع

تفریق

int x = y + ١٠;

(2) *

/

%

ضرب

تقسیم

باقیمانده

int x = ۶٠;

int y = ١۵;

int z = x * y / ٢; // ۴۵٠

y = x % ٢٩ ; // remainder is ٢

(1) ++

--

افزایش / کاهش

پیشوندی/پسوندی

x = ۵;

Console.WriteLine(x++) // x = ۵

Console.WriteLine(++x) // x = ۶

int x = ~١٢٧; // returns - 1) مکمل بیتی ١٢٨ ) ~

#C فصل دوم- اصول

43

(4) <<

>> 

شیفت به راست

شیفت به چپ

byte x = ١٠; // binary ١٠ is ٠١٠١٠

int result = x << ١; // ٢٠ = ١٠١٠٠

result = x >> ٢; // ۵ = ٠٠١٠١

(5) &

(6) |

(7) ^

بیتی And

بیتی Or

بیتی Xor

byte x = ١٢; // ٠٠١١٠٠

byte y = ١١; // ٠٠١٠١١

int result = x & y; //٨ = ٠٠١٠٠٠

result = x ^ y; //٧ = ٠٠٠١١١

عملوندهای این عملگر ها باید صحیح باشند.

را برای رساندن یک عدد به توان بکار م یبرند و متد ()Math.Power عملگر توان ندارد. در عوض، متد #C : توجه

را به توان م یرساند. e ، Math.Exp()

-2-3 عملگرهای شرطی و رابط های -2

عملگرهای رابطه ای برای مقایسه دو مقدار و تعیین رابطة مابین آنها استفاده می شوند. آنها عموماً در ارتباط با عملگرهای

5 خلاصه ای از عملگرهای رابطه ای و شرطی - شرطی، برای ایجاد ساختارهای تصمیمگیری پیچیده استفاده می شوند. جدول 2

را تهیه می کند. #C

5- عملگرهای رابطهای و شرطی - جدول 2

عملگر توصیف مثال

==

=!

مساوی

نامساوی

if (x == y) {...}

=>

=<

کوچکتر

کوچکتر یا مساوی

بزرگتر

بزرگتر یا مساوی

if (x <= y) {...}

&&

||

منطقی And

منطقی Or

if (x == y && y < ٣٠) {...}

باشد، عبارت دوم ارزیابی نمی false اگر عبارت اول

شود.

&

|

!

منطقی And

منطقی Or

نقیض منطقی

if (x== y | y < ٣٠) {...}

همیشه عبارت دوم ارزیابی می شود.

if !(x ==y && y < ٣٠) {...}

باشد، false یا true توجه کنید. در عملگرهای || یا &&، اگر عبارت اول به ترتیب OR/AND به دو شکل عملیات منطقی

دومی ارزیابی نم یگردد. (تکنیک ارزیابی کوتاه)

عملگرهای & و | همواره هر دو عبارت را ارزیابی می کنند. اینها زمانی استفاده می شوند که مقادیر عبارات از یک تابع

برمی گردند و می خواهیم از فراخوانی متدها مطمئن شویم.

برای انتساب شرطی یک مقدار به یک متغیر عملگر ?: را پشتیبانی می کند. همانطور که #C ،5- علاوه بر عملگرهای جدل 2

است. if else این مثال نشان م یدهد آن ساده شده دستور

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

44

string pass;

int grade=٧۴;

If(grade >= ٧٠) pass="pass"; else pass="fail";

// expression ? op١ : op٢

pass = (grade >= ٧٠) ? "pass" : "fail";

باشد، عملگر ?! مقدار اول را بر می گرداند، در غیر این صورت مقدار دوم برگردانده م یشود. true اگر عبارت

#C -4-2 راهنماهای پیش پردازش

خوانده می شوند. آنها می توانند کامپایلر را #C این راهنماها 1، دستوراتی هستند که در مرحله تحلیل حرفی توسط کامپایلر

برای در برگرفتن یا نگرفتن یک تکه کد یا حتی رد عمل کامپایل بر اساس مقادیر راهنماهایی پیش پردازش 2 تذکر دهند.

یک راهنمای پیش پردازش با کارکتر # در ابتدای خط معین می شود. فضاهای خالی قبل و بعد از سمبل # مجاز هستند.

را لیست می کند. #C 6 راهنماهایی از - جدول 2

#C 6- راهنماهای پیش پردازش - جدول 2

توصیف #C سمبل پیش پردازش

define#

undef#

برای تعریف و حذف یک سمبل بکار می رود. با تعریف یک سمبل، در صورتی که در راهنمای

ارزیابی می گردد. true استفاده شود، آن به if#

عمل می کند. #C در if-else شبیه if#

#if

#elif

#else

#endif

شماره ترتیب خط را تغییر می دهد و می تواند تعیین کند منبع این خط کدام فایل است. line#

region#

endregien#

مربوط به IDE برای تعیین یک بلاک کد استفاده می شود که به هنگام کد نویسی در محیط

2005 می توان این بلاک را جمع کرده یا باز کرد. VS

باعث می شود کامپایلر یک خطای مخرب (بزرگ) گزارش دهد. error#

باعث می شود کامپایلر یک هشدار گزارش داده و سپس پردازش را ادامه دهد. warning#

از عمومی ترین کاربردهای راهنماهای پیش پردازش، انجام کامپایل شرطی، اضافه کردن تشخیص ها برای گزارش خطاها و

هشدارها و تعریف ناحی ههای کد است.

-1 کامپایل شرطی -4 -2

می توان تعیین کرد، کدام قسمت از کد در طول کامپایل در گرفته شود. هر کدی که if# با استفاده از راهنماهای مرتبط با

ارزیابی می شود، در هنگام false یا true به if قرار دارند، بر اساس اینکه شرط endif# و دستور if# مابین دستور

کامپایل در برگرفته می شوند یا در برگرفته نم یشوند. این یک ویژگی قدرتمند، اغلب برای اهداف رفع اشکال استفاده

می شوند. حال یک مثال از این مفهوم ارائه م یگردد.

#define DEBUG

using System;

public class MyApp

{

1 Directive

2 Preprocess

#C فصل دوم- اصول

45

public static void Main()

{

#if (DEBUG)

Console.WriteLine("Debug Mode");

#else

Console.WriteLine("Release Mode");

#endif

}

}

قرار گیرند. سمبل کامپایل شرطی دو حالت دارد: تعریف شده یا تعریف cs. بایستی در آغاز فایل define# همه راهنماهای

ارزیابی می شود. کاربرد واضح راهنمای true به (if(DEBUG# تعریف می شود و دستور DEBUG نشده. در این مثال سمبل

2005 را بکار می برید شما می توانید یک تولید برنامه VS هر فایل منبع را مجاز می دارد. اگر Debug کنترل حالت define#

برای هر فایل در پروژه به طور اتوماتیک تعریف می گردد. هیچ DEBUG را تعیین کنید، در نتیجه سمبل Debug بصورت

صریح لازم نیست. define# راهنمای

یک سمبل را تعریف کرد. Define/ نیز می توان با استفاه ازسوییچ #C در خط فرمان کامپایل

csc /Define:DEBUG myproject.cs

در کد منبع نوشته شده باشد. Define DEBUG# کامپایل کردن با این دستور ،معادل این است که دستور

-2 راهنماهای تشخیص -4 -2

راهنماهای تشخیص، پیام های هشدار و خطا می فرستند که شبیه دیگر خطاها و هشدارهای فرمان کامپایل با آنها رفتار

آن را متوقف م یکند. error# ادامه کامپایل را مجاز م یدارد، در حالیکه warning# می شود. راهنمای

#define CLIENT

#define DEBUG

using System;

public class MyApp

{

public static void Main()

{

#if DEBUG && INHOUSE

#warning Debug is on.

#elif DEBUG && CLIENT

#error Debug not allowed in Client Code.

#endif

// Rest of program follows here

تعریف می شوند. DEBUGE و CLIENT در این مثال، کامپایل با یک پیام خطا پایان خواهد داد، چون

ناحیه های کد

هیچ #C راهنماهای ناحیه برای نشانه گذاری قسمتهایی از کد به عنوان ناحیه استفاده می شوند. راهنمای ناحیه برای کامپایلر

تشخیص داده می شوند. VS.NET معنایی ندارند، اما به وسیله

#region

// any C# statements

#endregion

-5-2 نوع داده ی شمارشی

معروف است، یک روش مناسب برای ایجاد یک مجموعه ساختیافته 1 از سمبل ها enum به #C نوع داده شمارشی که در

جهت نمایش مقادیر ثابت پیشنهاد می کند.

گرامر:

1 Structured

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

46

[access modifiers]enum <identifier> [:enum-base]{enum body}

مثال:

enum Fabric :short {

Cotton = ١,

Silk = ٢,

Wool = ۴,

Rayon = ٨,

Other = ١٢٨

}

به یک مقدار خاصی تنظیم نشده باشند، آنها به طور اتوماتیک با دنباله 0و 1و 2و 3و enum توجه: اگر سمب لهای

..... تنظیم م یشوند.

است و اجازه م یدهد فقط کلاسهای internal را تعریف م یکنند. به طور پیش فرض enum معرف های دسترسی، دامنه ی

آن را برای هر کلاسی در هر اسمبلی قابل دسترس می سازد. public داخل آن اسمبلی به آن دسترسی داشته باشند. معرف

نوع داده پایة ثابت ها را بر اساس مقادیر تخصیصیافته به آنها مشخص می کند. آن فقط می تواند enum-base گزینة اختیاری

است. int باشند. به طور پیش فرض ulong یا long ،unit ،int ،ushort ،short ،sbyte ،byte یکی از انواع صحیح

-1 کار با نوع داده شمارشی -5 -2

انواع شمارشی نه تنها خوانایی برنامه را بهتر می کنند، بلکه هنگام تغییر مقدار اصلی، تغییرات کد را نیز کاهش می دهند و

همه ارجاعات به آن مقدار، معتبر می مانند. مزیت دیگر اینکه انواع شمارشی، نوع داده قوی هستند. بدین معنی که هر وقت

به عنوان پارامتر ارسال شود، متد دریافت کننده باید یک پارامتر مطابق با همان نوع داشته باشد. درغیر enum یک نوع

نشان می دهد. Fabric 2 این اهداف را با استفاده از نوع داده شمارشی - اینصورت کامپایلر خطا رخ می دهد. قطعه کد 2

2- قطعه کد 2

static double GetPrice(Fabric fab)

{

switch(fab)

{

case Fabric.Cotton: return(٣٫۵۵);

case Fabric.Silk: return(۵٫۶۵);

case Fabric.Wool: return(۴٫٠۵);

case Fabric.Rayon: return(٣٫٢٠);

case Fabric.Other: return(٢٫۵٠);

default: return(٠٫٠);

}

}

static void Main()

{

Fabric fab = Fabric.Cotton;

int fabNum = (int) fab; // ١

string fabType = fab.ToString(); // "Cotton"

string fabVal = fab.ToString("D"); // "١"

double cost = GetPrice(fab); // ٣٫۵۵

}

نکات:

به یک مقدار صحیح، قال ببندی آن لازم است . enum • برای مقداردهی

fabNum =(int) fab;

می توان مقدار رشت های یک ثابت را بدست آورد. ”D“ و پارامتر ()ToString • با متد

لازم است پارامتر متد از همان نوع اعلان GetPrice به متد Fabric • در هنگام ارسال یک نمونه از نوع شمارشی

شده باشد.

#C فصل دوم- اصول

47

این مثال نشان میدهد که نحوه ی به دست آوردن نام سمبل یا مقدار ثابت نوع شمارشی ساده است. زمانی که نمونه ای از یک

و System.Enum نوع داده شمارشی مشخص باشد، به راحتی می توان اعضاء یک نوع داده شمارشی را به کمک کلاس

به دست آورد. foreach حلقه

System.Enum -2 متدهای -5 -2

هستند. اغلب دو متد System.Enum سه متد مفید ،Enum.Getname و Enum.IsDefined،Enum.Parse متدهای

است و یک نمونه از آن ایجاد می کنند. برای enum اول با هم به کار می روند تا مشخص کنند آیا یک مقدار یا سمبل عضو یک

برای وجود یک مقدار رشته ای در آن Fabric فهم بهتر مطلب، مثال های زیر را در نظر بگیرید. در این مثال نوع شمارشی

یکی از مقادیر آن را چاپ می کند. GetName جستجو م یشود و متد

string fabStr = "Cotton";

// Determine if symbol Cotton exists in Fabric enum

if (Enum.IsDefined(typeof(Fabric),fabStr))

{

// Create enum instance

Fabric fab = (Fabric)Enum.Parse( typeof(Fabric) , fabStr);

// Output from the following statement is: "Silk"

Console.WriteLine("Second value of Fabric Enum is: " + Enum.GetName(typeof(Fabric), ٢));

}

بر می گرداند و یک رشته که سمبل مورد نظر typeof دو پارامتر می گیرد: یک نوع شمارشی که عملگر ISDefined متد

جهت تست را نشان می دهد. شکل دیگر این متد با مقدار عددی برای پارامتر دوم است.

ایجاد fab را می گیرد و یک نمونه از نوع داده ی شمارشی ایجاد می کند. متغیر IsDefined همان پارامترهای Parse متد

مهم است، اگر Parse قبل از کاربرد متد ،enum 2 است. اطمینان از وجود عضو - شده در اینجا معادل همان متغیر قطعه کد 2

آن عضو وجود نداشته باشد یک استثناء روی می دهد.

”Silk“ ای که مقدار آن در پارامتر دوم ارسال میشود بر میگرداند. در این مثال enum یک مقدار رشته ای از GetName متد

برگردانده میشود، چون مقدار ثابت آن 2 است.

های بیتی flag -3 انواع شمارشی و -5 -2

با توانهایی از 2 تصادفی نیست. بیشتر موارد، اعضای نوع شمارشی در عملیات منطقی Fabric تنظیم مقادیر نوع شمارشی

استفاده م یشوند. این مقادیر در نگاشت به مقادیر بیتی منحصر به فرد مفید هستند. ممکن است ترکیبی از این مقادیر را در

کدنویسی تعیین کنید.

Fabric cotWool = Fabric.Cotton | Fabric.Wool;

Console.WriteLine(cotWool.ToString()); // Output: ۵

باشد. می توان این کار را با اضافهکردن صفت Cotton و Wool خروجی در صورتی بامعنی خواهد بود، که آن ترکیبی از

به اعلان نوع شمارشی انجام داد. [flags]

[Flags]

enum Fabric :short {

اعلان نوع شمارشی را بررسی می کند. اگر این صفت موجود باشد، آن نوع شمارشی را به صورت یک ()ToString متد

مجموعه از اعضای نگاشت بیتی در نظر می گیرد. در این مثال نم یتوان یک مقدار سمبلیک معادل 5 پیدا کرد، پس متد

الگوی بیتی “ 101 ” را بکار م یبرد و سمبل هایی که الگوهای بیتی “ 001 ”و” 100 ” دارند را چاپ می کند. خروجی ()ToString

”cotton,wool”. جدید یک لیست جدا شده با کاما است

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

48

-6-2 انواع دادهی مقداری و ارجاعی

2). انواع داده ی ارجاعی شامل کلا سها، - دو نوع داده را پشتیبانی م یکند: انواع مقداری و انواع ارجاعی (شکل 2 CLR

و همچنین byte ،char ،int آرایه ها، واسط ها و نماینده ها هستند. انواع داده ی مقداری شامل انواع داد هی اولیه همچون

و NET. هستند. انواع داده ی ارجاعی و مقداری به وسیله محلشان در سلسله مراتب کلاس struct و enum انواع داده ی

روش تخصیص حافظه متمایز می شوند.

NET. 2- سلسله مراتب کلا سهای - شکل 2

System.ValueType وSystem.Object -1-6 -2

ارث بری می کند. تفاوت این است که انواع داده ی ارجاعی System.Object هر دو نوع داده ی مقداری و ارجاعی از کلاس

ارث بری م یکنند. System.ValueType مستقیما از آن ارثبری می کنند. در حالی انواع داده ی مقداری از کلاس

به عنوان پایه ی همه ی انواع داده، یک مجموعه متد فراهم می کند، که می توانید در هر نوع داده بیابید. System.Object

عضوی از این مجموعه است. همچنین متد های ایجاد یک کپی از یک نوع داده و یک کد درهمسازی ()ToString متد

منحصر به فرد برای یک نوع داده و مقایسه دو نمونه از یک نوع داده نیز وجود دارد.

ارث بری می کند و هیچ عضوی اضافه نم یکند. اما یک سری از متدهای System.Object از System.ValueType

برای مقایسهی ()Equals می کند. برای مثال، متد override ارث بری شده را جهت ایجاد تناسب با انواع داد هی مقداری

ValueType می شود. بنابه تعریف، هم هی انواع داده ی مقداری به صورت ضمنی از کلاس override دو شی همنوع

ارثبری می کنند.

-2-6 تخصیص حافظه برای انواع داده مقداری و ارجاعی -2

برای نیازهای حافظ های آنها م یباشد. در زمان اجرا به انواع ClR تفاوت اصلی انواع داده مقداری و ارجاعی در روش مدیریت

مدیریت شده قرار Heap حافظه تخصیص داده می شود و انواع داده ارجاعی روی یک Stack داده مقداری روی یک

ارجاع داده م یشوند. Stack می گیرند که از

3 نحوه تخصیص حافظه را برای انواع داده ی ارجاعی و مقداری نشان می دهد و اینکه زمان ایجاد یک نمونه از یک - شکل 2

نوع داده ارجاعی و تخصیص آن به یک متغیر دومی چه اتفاقی م یافتد را دنبال کنید.

Apparel myApparel = new Apparel();

Apparel myApparel٢ = myApparel;

#C فصل دوم- اصول

49

2-نحوهی تخصیص حافظه - شکل 3

مدیریت شده به شی مورد نظر حافظه تخصیص م یدهد. Heap در بالای CLR -1

اضافه می شوند. این اطلاعات شامل یک اشارهگر به جدول متد شی و یک Heap -2 اطلاعات سربار شی به

است که برای همزمان سازی دسترسی به شی مابین چند متد استفاده می شود. SyncBlockIndex

آن روی FabType و Price ایجاد می شود و فیلدهای Apparel به عنوان یک نمونه از کلاس myApparel -3 شی

قرار می گیرند. Heap

قرار می گیرد. Stack روی myAparel -4 ارجاع به

قرار می گیرد و یک اشاره گر به Stack 2 ایجاد می شود، آن روی myApparel -5 زمانی که یک متغیر ارجاع جدید

2 به شی یکسانی اشاره می کنند. myApparel و myApparel شی موجود می دهد. هر دو متغیر ارجاعی

ایجاد یک شی ارجاعی به دلیل داشتن چندین مرحله و سربار اضافی مربوط به زمان و منابع، گران هستند. با این وجود،

تنظیم ارجاع های اضافی به یک شی موجود کاملا کارآمد است، چون نیازی به ایجاد یک کپی فیزیکی از یک شی نیست.

عکس آن برای انواع داده مقداری صحیح است.

-3-6 جعبهبندی 1 -2

دارد که مقادیر هر نوع داده ای را می پذیرد. در صورتیکه نوع یک مقدار مشخص نباشد، Object یک نوع داده خاص .NET

بایستی به Object آن یک روش کلی برای ارسال پارامترها و انتساب مقادیر فراهم می کند. با هر چیز منتسب شده به

ذخیره می گردد. دستورات زیر را ملاحظه نمایید: Heap صورت یک نوع داده ارجاعی رفتار شود و روی

int age = ١٧;

object refAge = age;

را به یک نوع داده ی age قرار می دهد. دستور دومی مقدار Stack را ایجاد م یکند و مقدار آن را روی age دستور اول متغیر

Stack قرار می دهد و اشاره گرهای سربار را اضافه می کند و در Heap ارجاعی منتسب می کند. آن دستور مقدار 17 را روی

یک ارجاع به آن اضافه می کند، این عمل را جعبه بندی گویند. تبدیل یک نوع داده ارجاعی به یک نوع داده مقداری "از

جعبه در آوردن 2" گفته می شود و با قالب بندی یک شی به نوع داده اصلی آن انجام می شود. حال شی ایجاد شده در مثال

قبلی را از جعبه در م یآوریم.

int newAge = (int) refAge;

string newAge = (string) refAge; // Fails. InvalidCastException

1 Boxing

2 Unboxing

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

50

توجه داشته باشید مقداری که از جعبه درآورده می شود، باید از همان نوع داده قالب بندی شده باشد. در کل، جعبه بندی

جزئیات را بطور شفاف کنترل می کند. با این وجود، زمان طراحی کد، ذخیرهی مقدار زیادی ClR می تواند صرفنظر شود، چون

را ملاحظه کنید. ArrayList و System.Array از داده های عددی در حافظه را بررسی کنید. برای این منظور کلاس های

هر دو از انواع داده ارجاعی هستند، اما از نظر ذخیره مقادیر داد های ساده کاملا متفاوت عمل می کنند.

همه عناصر را به صورت ArrayList، طراحی شدهاند. در نتیجه Object برای کار روی نوعداده کلی Arraylist متدهای

انواع داده ارجاعی ذخیره میکند. اگر داده ی مورد نظر جهت ذخیره، یک نوع داده ی مقداری باشد، قبل از ذخیره باید

جعبه بندی شود. از طرف دیگر آرایه م یتواند هر دو نوع داده ی مقداری و ارجاعی را نگه دارد. آن با انواع داده ارجاعی همانند

رفتار می کند، ولی انواع داده مقداری را جعب هبندی نمی کند. ArrayList

4 نشان داده شده است، مقادیر - از مقادیر صحیح ایجاد میکند. همانطور که در شکل 2 ArrayList کد زیر یک آرایه و یک

در حافظه کاملا با روش متفاوتی ذخیره م یشوند.

// Create array with four values

int[] ages = {١،٢،٣،۴};

// Place four values in ArrayList

ArrayList ages = new ArrayList();

for (int i=٠; i<۴; i++)

{

ages.add(i); // expects object parameter

}

در حافظه ArrayList و Array 4- مقایسهی - شکل 2

هر مقداری را جعب هبندی می کند. آن سپس سربار ArrayList . ذخیره می کند int متغیر آرایه، مقادیر را به صورت مقادیر

مورد نیاز بوسیله انواع داده ی ارجاعی را اضافه می کند. اگر برنامه کاربردی شما مقدار زیادی داده در حافظه ذخیره م یکند و

2,0 استفاده می کنید، کلاس NET . را نیاز ندارد، آرایه یک پیاده سازی کاراتری است. اگر از ArrayList ویژگی های خاص

را شامل است. ArrayList بهترین انتخاب است، چون جعب هبندی را حذف م یکند و ویژگی های انعطاف پذیر List

آزاد م یشود. در صورتی که حد مشخص Stack نکته : زمانی که یک متغیر از میدان خارج می گردد، حافظه ی آن از روی

کنترل می گردد و بطور NET. به وسیله ی GC . را آزاد م یکند Heap حافظه ی آشغال روی GC ، حافظه سیستم استفاده گردد

اتوماتیک در فاصله های غیرقابل پیش بینی اجرا می گردد.

-7-2 فضاهای نامی

همانطور که می دانید، فضاهای نامی یک روش برای سازمان دهی کلاسهای مرتبط و انواع داده ای دیگر فراهم می کند. برخلاف

یک فایل یا یک قطعه، فضای نامی به جای گروه بندی فیزیکی، یک گروه بندی منطقی انجام می دهد. زمانی که یک کلاس

تعریف می کنند، می توانید آن را در یک تعریف فضای نامی قرار دهید. سپس اگر بخواهید یک کلاس دیگر در فایل دیگری

تعریف کنید که کار مرتبط با آن انجام می دهد، می توانید آن را در همان فضای نامی قرار دهید. ایجاد یک گروه بندی منطقی،

تشخیص کلاس های مورد استفاده را برای توسع هدهندگان دیگر ساده می کند.

#C فصل دوم- اصول

51

namespace CustomerPhoneBookApp

{

using System;

public struct Subscriber

{

// Code for struct here...

}

}

قراردادن یک نوع داده در یک فضای نامی، یک نام طولانی به آن نوع داده می دهد که شامل چندین اسم جدا شده با نقطه

،Subscriber می باشد، که در انتها نام کلاس قرار می گیرد. در مثال قبلی نام کامل ساختار

است. این عمل کاربرد کلاسهای هم نام در فضاهای نامی مختلف را در یک برنامه CustomerPhoneBookApp.Subsciber

بدون هیچ ابهامی مجاز می دارد.

می توانید فضاهای نامی تودرتو را ایجاد کنید و یک ساختار سلسله مراتبی برای انواع داده ای خودتان بسازید.

namespace Arshia

{

namespace ProCSharp

{

namespace Basics

{

class NamespaceExample

{

// Code for the class here...

}

}

}

}

نام هر فضای نامی از نام های فضاهای نامی که آن را در بر می گیرند تشکیل شده است، که با نقطه از هم جدا شد هاند. با نام

بیرونی ترین فضای نامی شروع شده و به نام کوتاه خودش ختم م یشود.

،NamespaceExample است و نام کامل کلاس Arshia.ProCSharp ،ProCSharp پس نام کامل فضای نامی

است. Arshia.ProCSharp.Basics.NameSpaceExample

می توانید در تعاریف فضای نامی خودتان، این قاعده را برای سازمان دهی فضاهای نامی بکار برید. بنابراین کد قبلی م یتواند

بصورت زیر نوشته شود.

namespace Arshia.ProCSharp.Basics

{

class NamespaceExample

{

// Code for the class here...

}

}

توجه: اعلان یک فضای نامی چندبخشی به صورت تو در تو، در داخل فضای اسمی دیگر مجاز نیست.

فضاهای نامی به اسمبلی ها مرتبط نیستند. در یک اسمبلی می توان فضاهای نامی مختلفی تعریف کرد یا در فضاهای نامی

انواع داده ای تعریف کرد که در اسمبلی های مختلفی قرار دارند.

using -1 دستور -7 -2

اختصار نوشتن نام کامل یک کلاس را اجازه می دهد. برای انجام این کار، فضای نامی کلاس را #C ، همانطور که قبلا گفته شد

به برنامه ربط دهید. در ادامه ی فایل می توانید به انواع داده ای موجود در آن فضای نامی using در بالای فایل با کلمه کلیدی

بوسیله نام نوع داده ارجاع کنید.

using System;

using Arshia.ProCSharp;

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

52

شروع می شوند. چون بیشتر کلا سهای مفید تهیه شده توسط using System با دستور #C بطور مجازی همه کدهای منبع

دربرگرفته شده اند. System مایکروسافت در فضای اسمی

یک نوع داده هم نام داشته باشند، شما نام کامل را برای آنها استفاده using اگر در فضاهای نامی ارجاع شده با دستورات

خواهید کرد تا مطمئن شوید کامپایلر کدام نوع داده را دستیابی می کند. برای مثال، فرض کنید کلاسهایی بنام

وجود دارند. Arshia.ProCSharp.OOP و Arshia.ProCSharp.Basic در فضاهای نامی NamesspaceExample

ایجاد کنید و یک نمونه از کلاس Arshia.ProCSharp در فضای نامی Test اگر شما یک کلاس بنام

در این کلاس ایجاد کنید، باید مشخص کنید که کدام یک از دو کلاس بالا را مد نظر دارید. NameSpaceExample

using Arshia.ProCSharp;

class Test

{

public static int Main()

{

Basics.NamespaceExample nSEx = new Basics.NamespaceExample();

// do something with the nSEx variable

return ٠;

}

}

++C در header هیچ عمل پیوند فیزیکی بین فای لها انجام نمی دهد و فضاهای نامی معادل فایل های using دستور

نیستند.

بیشتر سازمان ها مدت زمانی را برای توسعه یک شمای فضای نامی صرف م یکنند تا توسعه دهندگان بتوانند به راحتی

کلاس های مورد نیاز خود را پیدا کنند و از تداخل نامی در کتابخان ههای خود جلوگیری کنند.

-2 اسامی مستعار فضای اسمی -7 -2

انتساب اسامی مستعار به کلا سها و فضاهای نامی است. استفاده از نام طولانی یک فضای ،using کاربرد دیگر کلید کلیدی

می توانید یک نام مستعار به فضای نامی using نامی در برنامه به دفعات زیاد خسته کننده است. با استفاده از دستور ساده

انتساب دهید.

using alias = NamespaceName;

انتساب میدهد و این را برای ایجاد Arshia.ProCSharp.Basic را به فضاینامی Introduction مثال زیر نام مستعار

به کار می برد. به کاربرد توصیف کنندهی 1 نام مستعار فضای نامی (::) توجه کنید. NamespaceExample یک شی از کلاس

در همان میدان تولید شده Introduction آن به اجبار نام مستعار فضای نامی را جستجو می کند. اگر یک کلاس به نام

باشد، تداخل رخ م یدهد. عملگر :: حتی در صورت وجود تداخل، امکان استفاده از آن نام مستعار را فراهم می سازد. کلاس

به GetType استفاده می کند. متد ()GetType دارد که از متد ()GetNamespace یک متد به نام NamespaceExample

دسترسی دارد که نوع کلاس را نشان می دهد. این شی را برای برگرداندن نام فضای نامی کلاس بکار Type یک شی از نوع

می برید.

using System;

using Introduction = Arshia.ProCSharp.Basics;

class Test

{

public static int Main()

{

Introduction::NamespaceExample NSEx =

new Introduction::NamespaceExample();

Console.WriteLine(NSEx.GetNamespace());

return ٠;

}

}

1 Qualifier

#C فصل دوم- اصول

53

namespace Arshia.ProCSharp.Basics

{

class NamespaceExample

{

public string GetNamespace()

{

return this.GetType().Namespace;

}

}

}

I/O -8-2 کنسول

Console بدست آورده باشید. در این قسمت چندین متد ایستای کلاس #C تا اینجا باید یک آشنایی پایه ای از انواع دادهی

مفید هستند. #C را برای خواندن و نوشتن داده استفاده میکنیم، چون این متدها زمان نوشتن برنامههای پایهای

را استفاده می کنید. این متد یک جریان 1 ()Console.ReadLine برای خواندن یک خط متنی از پنجره کنسول، متد

ورودی را از پنجره کنسول خوانده و رشته ورودی را بر میگرداند. همچنین دو متد برای نوشتن کنسول وجود دارد.

Console.Write()

مقدار ارجاعی را به پنجره کنسول م ینویسد.

Console.WriteLine()

همان کار را انجام می دهد، اما یک کاراکتر خط جدید به انتهای خروجی اضافه می کند.

شکلهای متنوع این متدها برای انواع دادهای از پیش تعریف شده وجود دارند. پس در بیشتر موارد، تبدیل مقادیر به رشته ها

قبل از نوشتن آنها لازم نیست. برای مثال، کد زیر به کاربر اجازه می دهد یک خط متنی وارد کند و آن را نمایش میدهد.

string s = Console.ReadLine();

Console.WriteLine(s);

نمایش C زبان printf به شما اجازه می دهد، یک خروجی فرم تدهی شده را همانند تابع ()Console.WriteLine متد

تعدادی پارامتر به آن ارسال می کنید. اولین پارامتر رشته ای است که در آن ،WriteLine دهید. برای استفاده از این رفتار

رشته از نشانه گذارها استفاده می شود. نشانه گذارها محل قرارگیری خروج یها در داخل متن را با {} مشخص می کنند. هر

نشانه گذار یک اندیس با پایة صفر را برای مشخص کردن تعداد پارامترها استفاده می کند. برای مثال { 0} اولین پارامتر لیست

است. کد زیر را ملاحظه کنید.

int i = ١٠;

int j = ٢٠;

Console.WriteLine("{٠} plus {١} equals {٢}", i, j, i + j);

این کد خروجی زیر را نمایش م یدهد.

10 plus 20 equals 30

می توانید یک طول برای مقدار مشخص کنید و متن را با آن طول تنظیم کنید. مقادیر مثبت برای تنظیم راست و مقادیر منفی

طول مقدار است. w اندیس پارامتر و n را به کار می برید که {n,w} برای تنظیم چپ استفاده می شوند. برای این کار فرمت

int i = ٩۴٠;

int j = ٧٣;

Console.WriteLine(" {٠،۴}\n+{١،۴}\n ----\n {٢،۴}", i, j, i + j);

نتیجه به صورت زیر است.

٩۴٠

+ ٧٣

----

1 Stream

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

54

١٠١٣

در نهایت می توانید یک رشته فرمت به همراه دقت (اختیاری) اضافه کنید. لیستی از فرمت بندی های مورد استفاده در انواع

داده ی پیش تعریف شده را به صورت زیر می بینید:

رشته توصیف

فرمت پول محلی C

فرمت دسیمال. یک عدد صحیح را به مبنای 10 بر می گرداند و اگر دقت آن مشخص باشد D

صفرهایی را به آن اضافه می کند.

فرمت علمی (توانی). مشخص کنندة دقت، تعداد ارقام اعشار را مشخص می کند (پیش فرض آن 6 E

حالت سمبل توان را تعیین می کند. (E یا e) است). بزرگی یا کوچکی حرف رشته فرمت

فرمت اعشاری ثابت. مشخص کنندة دقت، ارقام اعشار را کنترل می کند. صفر قابل قبول است. F

را بر اساس حالت مقدار به کار م یبرد. e یا f فرمت کلی. فرمت دهی G

فرمت عدد، عدد را با جدا کننده هزار (کاما) فرمت می کند. برای مثال 320،767،44 N

فرمت درصد P

فرمت هگزا دسیمال. مشخص کنندة دقت برای تعیین تعداد صفرهای اضافی به کار م یرود. X

در بقیه موارد به حالت حروف حساس نیست. اگر م یخواهید یک رشته فرمت را e/E توجه کنید که رشته فرمت به استثناء

بکار برید، بایستی آن را بلافاصله بعد از نشان هگذار مربوط به آن پارامتر قرار دهید و شماره پارامتر و طول مقدار را با کاما از

2C ، هم جدا کنید. برای مثال، جهت فرمت دهی یک مقدار دسیمال به صورت واحد پول محلی کامپیوتر با دقت دو رقم اعشار

را به کار می برید.

decimal i = ٩۴٠٫٢٣m;

decimal j = ٧٣٫٧m;

Console.WriteLine(" {٠،٩:C٢}\n+{١،٩:C٢}\n ---------\n {٢،٩:C٢}", i,j, i + j);

خروجی این کد در ایالت متحده به صورت زیر است.

$٩۴٠٫٢٣

$٧٣٫٧٠

---------

$١،٠١٣٫٩٣

به عنوان نکته نهایی، شما می توانید جهت نگاشت فرمت بندی کاراکترهای جایگزین را به جای رشته های فرمت به کار برید.

به عنوان مثال:

double d = ٠٫٢٣۴;

Console.WriteLine("{٠:#.٠٠}", d);

خروجی . 23 را نشان م یدهد. اگر کاراکتری در آن محل نباشد، سمبل # صرف نظر می شود و صفر ها با کاراکترهای موجود در

آن موقعیت جایگزین می شوند و اگر کاراکتری نباشد، صفر چاپ م یشود.

-9-2 خلاصه

است. #C • انواع دادهی اولیه، پایهی هر نوع داده ی تعریف شده در

یک زبان برنامه نویسی ساده، مدرن و شیگرا و... است. #C •

باید داخل یک کلاس قرار گیرد. #C • هر قطعه کد

#C فصل دوم- اصول

55

است. #C نقطهی ورودی هر برنامهی ()Main • متد

در تعریف متغیرها به حالت حروف حساس است. #C •

نوشته می شوند، با استثناء متغیرهای محلی و پارامترها که با حالت Pascal همهی انواع داده به صورت #C • در

نوشته می شوند. Camel

وجود دارد. //، /* */، /// #C • سه روش برای مشخص کردن توضیحات در

است. FCL نام مستعار یک ساختار داده از #C • هر نوع دادهی پایه در

و...دارند. TryParse ،Parse • هر ساختار داده تعدادی متد مفید همچون

،D به ترتیب حر فهای single و float ،decimal • مقادیر حرفی انتساب داده شده به متغیرهایی از نوع دادهی

را به صورت پسوند مقدار عددی خود استفاده می کنند. M و F

است. C همانند زبان #C • عملگرهای ریاضی، منطقی و رابط های

عملگرهای & و | همواره هر دو عبارت را ارزیابی می کنند. اینها زمانی استفاده م یشوند که مقادیر عبارات از یک

تابع برمی گردند و می خواهیم از فراخوانی متدها مطمئن شویم.

استفاده می شوند. #C • راهنماهای پی شپردازش برای راهنمایی کامپایلر

استفاده کرد. undef# و def# • برای کامپایل شرطی می توان از راهنماهای

یک روش مناسب برای ایجاد یک مجموعه ساختیافته از سمبل ها جهت نمایش مقادیر ثابت پیشنهاد می کند

نوع شمارشی خوانایی برنامه را بالا م یبرد و تغییرات برنامه را راح تتر و منسج متر می سازد.

می توان یک مقدار شمارشی را به نام رشت های آن تبدیل کرد.

مقادیر شمارشی می توانند بصورت ترکیبی استفاده شود، بنابراین مقادیر عددی آنها را توا نهایی از 2 در نظر

می گیرند تا نگاشت بیتی امکا نپذیر باشد.

و انواع Stack • انواع داده ی مقداری و ارجاعی از نظر تخصیص حافظه و مدیریت با هم فرق دارند. انواع مقداری در

مدیریت شده ذخیره می گردند. Heap ارجاعی در

ارث بری می کنند. System.Object و انواع دادهی ارجاعی از System.ValueType • انواع دادهی مقداری از

تبدیل می کند. object • جعبه بندی مقدار هر متغیری را به نوع

را به یک نوع خاص تبدیل می کند. object • از جعبه درآوردن، مقدار یک متغیر از نوع

فضای نامی یک گرو هبندی منطقی از کلا سها و انواع داد های دیگر فراهم می سازد. ممکن است این کلا سها محل

فیزیکی متفاوتی داشته باشند.

در using • در هنگام استفاده ی کلاس، باید نام کامل کلاس را نوشت. ولی در صورت استفاده از کلمه ی کلیدی

ابتدای فایل، می توان فقط به نام کوچک کلاس اشاره کرد.

برای دوری از اسامی طولانی فضاهای نامی، م یتوان از اسامی مستعار برای فضاهای نامی طولانی استفاده کرد و برای

دسترسی به کلا سهای آن فضای نامی بوسیله ی نام مستعار از عملگر :: استفاده می کنند.

Mohsen_mahyar@yahoo.com -C # اصول زبان

آنچه که در این فصل یاد خواهید گرفت:

NET. لازم است یک توسعه دهنده از ویژگی های دیگر ،#C علاوه بر عناصر اصلی یک برنامه :#C - مروری بر برنامه

همچون توضیحات و قراردادهای نامگذاری پیشنهاد شده آگاه باشد.

برای نمایش اعداد، کاراکتر و FCL - انواع داده ی اولیه 1: انواع داده ی اولیه همان انواع داده پایه ای تعریف شده بوسیله

تاریخ ها است.

گرامر عملگرهای سنتی را برای انجام عملیات ریاضی و شرطی به کار می برد. #C : - عملگرها

- نوع شمارشی: نوع شمارشی یک روش مناسب برای تخصیص توصیف است که م یتواند برای ارجاع به یک مجموعه

اصیل مقادیر استفاده شود.

از نوع مقداری یا ارجاعی هستند. فهم تفاوت مابین این دو #C - انواع داده مقداری و ارجاعی: همه انواع داده ای در

نوع داده مهم است و اینکه چگونه کارایی برنامه را تحت تاثیر قرار م یدهند.

تعریف کردند، که هدف طراحی #C یک استاندارد پیشنهاد شده برای زبان برنامه نویسی ECMA در سپتامبر 2000 ، گروه کاری

334ECMA- این زبان را تولید یک زبان برنامه نویسی آسان، پیشرفته، همه منظوره و شی گرا بیان کرد. استاندارد تعریف شده

است. آن یک زبان برای ارتقاء قدرت نرم افزار با کنترل ++C است که یک زبان مرتب با گرامر زبان جاوا و قوانینی از

محدوده ی آرایه، کنترل نوع داده قوی 2 و ممانعت از متغیرهای مقداردهی اولیه نشده طراحی شده است.

را نشان می دهد. انواع داده ی مقداری و #C را به شما معرفی می کند و بخش های اصلی یک برنامه #C این فصل اصول زبان

ارجاعی را مقایسه می کند و گرامر اپراتورها و دستورات برنامه را شرح می دهد.

برنامه نویس حرف های با این مفاهیم آشنا است. با این وجود، بخش انواع داده مقداری و ارجاعی توجه بیشتری لازم دارد. فهم

اختلاف در نحوه ی اداره ی انواع داده مقداری و ارجاعی روی طراحی برنامه شما تاثیرگذار خواهد بود.

1 Primitive

2 Strong Type cheking

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

36

#C -1-2 چیدمان یک برنامه

را نشان می دهد. #C 1 بعضی از ویژگی های یک برنامه - شکل 2

1- شکل 2

که Apparel است که منطق برنامه را در بر دارد و یک کلاس myApp 1 شامل یک کلاس بنام - کد موجود در شکل 2

نامگذاری می کند. سپس myApparel را ایجاد کرده و آن را Apparel داده هایی را در بر می گیرد. این برنامه یک نمونه از

در کنسول استفاده می شود. مهمترین ویژگی های Price و FabType این شی برای چاپ مقادیر اعضای کلاس بنام های

مورد توجه بصورت زیر هستند:

همه انواع داده ای System را مشخص می کند. همانطور که می دانید فضای نامی System فضای نامی using -1 دستور

به کامپایلر می گوید زمان رفع ارجا عها این فضای نامی را جستجو کنند، که using پایه را شامل می شود. دستور

System.web.UI.WebControls.Label استفاده از اسامی کامل را غیرضروری می کند. برای مثال، به جای

ارجاع کنید. Label می توانید به

-2 همه داده ها و منطق برنامه باید در یک تعریف نوع داده قرار گیرند. همه داده ها و منطق برنامه باید در یک کلاس،

متغیر سراسری خارج از دامنه وجود ندارد. #C در ،VB ساختار، نوع شمارشی، واسط یا نماینده تعبیه شوند. برخلاف

به کلاس های public دسترسی به انواع داده و اعضای آنها به وسیله معرفها 1 کنترل می شود. دراین مثال معرف

دسترسی داشته باشند. Apparel خارجی اجازه م یدهد به دو عضو کلاس

لازم است. این متد به عنوان نقطه ورودی برنامه عمل می کند. آن باید همواره #C برای هر برنامه اجرایی Main () -3 متد

یک نوع داده بازگشتی و Main شده ی overload آن بزرگ باشد. شکلهای M را داشته باشد و حرف static معرف

یک لیست پارامتر ورودی را تعریف میکنند. نمونهی زیر یک مقدار صحیح بر میگرداند.

static int Main()

{

return ٠; // must return an integer value

}

مثال زیر، لیست آرگونهای خط فرمان را به عنوان پارامتر دریافت کرده و یک مقدار صحیح بر میگرداند.

static int Main(string[] args)

{

// loop through arguments

foreach (string myArg in args)

Console.WriteLine(myArg);

return ٠;

1 modifier

#C فصل دوم- اصول

37

}

پارامتر آن یک آرایه ی رشته ای از محتوای خط فرمان است که برای احضار برنامه استفاده می شود. برای مثال، این خط فرمان

را اجرا میکند و دو مقدار از طریق پارامتر بر آن ارسال می کند. MyApparel برنامه

C:\> MyApparel ۵ ۶

می تواند محتویات خط فرمان را بدست آورد. System.Environmenet.CommandLine توجه: خصوصیت

#C -1-1 تذکرات عمومی برنامه نویسی -2

حساسیت به حالت حروف

جایگزین کنید، Class را با class 1- همه متغیرها و کلمات کلید با حساسیت به حالت حروف متمایز می شوند. در شکل 2

کد کامپایل نخواهد شد.

قراردادهای نامگذاری

شما رعایت می شود. علاوه بر ارتقاء سازگاری، رعایت #C قراردادهای نا مگذاری فراهم م یکند که در کد ECMA استاندارد

1 بعضی از توصیه های مهم - سیاست نامگذاری، خطاهای مرتبط با حساسیت به حالت حروف را می تواند کاهش دهد. جدول 2

را خلاصه کرده است.

1- قراردادهای نامگذاری - جدول 2

نوع توضیحات

کلاس • اسم یا عبارت اسمی

شروع نشود. I • سعی کنید با حرف

زیر خط را بکار نبرید.

public const double GramToPound = ثابت ; ۴۵۴٫٠

نوع شمارشی • برای اسامی شمارشی نام واحدی بکار برید.

public enum WarmColor { Orange, Yellow, Brown}

داشته باشد. EventHandler رویداد • متدی که رویدادها را هدایت می کند، باید پیشوند

داشته باشند. EventArgs باید پیشوند Event • کلاس های آرگومان

دارد. Exception استثناء • پسوند

IDisposable . را دارد I واسط • پیشوند

متغیرهای

محلی

نوشته می شوند. Pascal دارند، بصورت public • متغیرهایی که معرف

int myIndex

متد • فعل یا عبارات فعلی را برای نامگذاری استفاده کنید.

فضای اسمی • نباید یک فضای اسمی و کلاس هم نام باشند.

برای دوری از اسامی یکسان از پیشوندها استفاده کنید. برای مثال از نام شرکت به

عنوان پیشوند برای فضاهای نامی پروژه های خود استفاده کنید.

Arshia.GraphicsLib

خصوصیت • اسم یا عبارت اسمی بکار برید.

پارامتر • اسامی با معنی که هدف پارامتر را شرح م یدهند، بکار برید.

استفاده می کنند. Camel استفاده می کنند به غیر از پارامتر و متغیر محلی که از حالت Pascal همه موارد بالا از حالت

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

38

توجه کنید که حالت یک نام م یتواند بصورت زیر بر اساس دو طرح نوشتن حروف بزرگ باشد:

کاراکتر اول هر کلمه بزرگ نوشته می شود. : Pascal -1

به استثناء کلمه ی اول، حرف اول بقیه کلمات بزرگ نوشته می شود. :Camel -2

#C توضیحات در برنامه

توضیح یک خطی ( // ) و توضیحات چند خطی ،Xml سه نوع توضیح تعبیه شده را پشتیبانی می کند: یک نسخه #C کامپایلر

( /* */) که برای بیشتر برنام هنویسان آشنا هستند.

// for a single line

/* for one or more lines

*/

/// <remarks> XML comment describing a class </remarks>

است که یک قطعه کد همچون یک XML با سه خط کج ( /// ) آغاز می شود و معمولا شامل برچسب های XMl یک توضیح

را برای بدست آوردن اطلاعات XML می تواند برچسب های #C . ساختار، یک کلاس یا عضو کلاس را مستندسازی می کند

اضافی و صادر کردن 1 آنها به یک فایل خارجی گسترش دهد.

هشت برچسب اصلی دیگر را تشخیص #C برای شرح دادن یک نوع داده استفاده می شود. کامپایلر <remarks> برچسب

می دهد که به عنصر خاصی از برنامه تخصیص داده شد هاند. این برچسب ها در بالای خطوط کد مربوطه قرار می گیرند.

XML 2-برچسب های - جدول 2

برچسب شرح

یک مثال از نحوه استفاده از ویژگی خاص برنامه مابین برچسب شروع و پایان نشان م یدهد. :<example>

<exception

cref="Excep">

نام استثناء را شامل است . cref خصوصیت

///<exceptioncref="NoParmException">

</exception>

<include

file="myXML">

دیگر مشخص می شود که مستندسازی این کد در آن فایل قرار xml نام یک فایل ،file در خصوصیت

گرفته است .

<param

name="parm١">

نام پارامتر را شامل می شود. name خصوصیت

<permission

cref= "">

بیشتر مواقع دارای مقادیر زیر است:

///<permissioncref="System.Security.PermissionSet">

</permission>

یک توصیف متنی در مورد نوع مقدار برگشتی از یک متد یا خصوصیت را مشخص می کند. <returns>

نیست فراهم می کند. <summary> اطلاعات اضافی در مورد نوع داده ای که در بخش <remarks>

<seealso

cref="price">

نام یک خصوصیت، متد یا هر عضو دیگر قرار می گیرد. cref در خصوصیت

استفاده می شود VS.NET در intellisense توصیف یک کلاس را در بر می گیرد که به وسیله <summary>

1 export

#C فصل دوم- اصول

39

مجزا صادر شوند و سپس به وسیله تکنی کهای XML در حقیقت برای آن است که می توانند به یک فایل XML مقایر توضیحات

استاندارد پردازش شوند. کامپایلر بطور پی شفرض این کار را انجام نمی دهد، باید آن را تنظیم کرد. XML پارس کردن

ایجاد میکند. ConsoleXML.xml بنام XML را کامپایل کرده و یک فایل ConsoleApp.cs خط زیر کد منبع

C:\> csc consoleapp.cs /doc:consoleXML.xml

کدتان خواهید دید. public 1 را کامپایل کنید، هشدار زیر را برای همه اعضای - اگر کد شکل 2

Warning CS١۵٩١: Missing XML comment for publicly visible type ...

1591 را به خط کامپایل اضافه کنید. در این گزینه میتوانیم شمارههای مختلفی را با nowarn:/ برای منع این هشدار گزینه

کاما از هم جدا کنیم.

-2-2 انواع داده اولیه

سه بخش بعدی ویژگیهایی را شرح می دهند که در اکثر زبانهای برنامه نویسی خواهید یافت. متغیرها و انواع داده ها،

برای ساختن #C عملگرها، عبارات و دستورات. این بحث با انواع داده اولیه شروع می شود که اینها انواع دادهای هستهی

کلاسها یا ساختارهای پیچیدهتر هستند. متغیرهای این نوع داده ها، یک مقدار منفرد دارند و اندازه آنها از پیش تعریف

3 یک لیست رسمی از انواع داده اولیه فراهم می کند . - شده است. جدول 2

#C 3-لیست انواع دادهی اولیه در - جدول 2

توصیف داده FCL نوع داده #C نوع داده اولیه

نوع داده ی پایه برای هر نوع داد هی دیگر System.Object object

یک دنباله از کارکترهای یونیکد System.String string

اعداد اعشاری مختصر با 28 رقم معنی دار System.Decimal decimal

نشان داده false یا true یک مقدار که به صورت System.Boolean bool

می شود .

یک کاکتر یونیکد 16 بیتی System.Char char

نوع داده صحیح 8 بیتی بدون علامت System.Byte byte

نوع داده صحیح 8 بیتی علامت دار System.SByte sbyte

عدد صحیح علامت دار 16 بیتی System.Int16 short

عدد صحیح علام تدار 32 بیتی System.Int32 int

عدد صحیح علامت دار 64 بیتی System.Int64 long

عدد صحیح بدون علامت 16 بیتی System.UInt16 ushort

عدد صحیح بدون علامت 32 بیتی System.UInt32 uint

عدد صحیح بدون علامت 64 بیتی System.UInt60 ulong

عدد اعشاری System.Single (single(float

عدد اعشاری با دقت مضاعف System.Double double

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

40

نگاشت شدهاند، که میتوانند به جای همدیگر استفاده شوند. BCL همانطور که جدول نشان می دهد، انواع دادهای اولیه به 1

دستورات زیر را ملاحظه کنید:

System.Int٣٢ age = new System.Int٣٢(١٧);

int age = ١٧;

System.Int٣٢ age = ١٧;

به عنوان نام مستعار 2 برای نوع داده int از کلمه کلیدی #C یکسانی تولید میکنند. نسخه ی کوتاه در IL هر سه دستور، کد

برای همه انواع داده اولیه اسامی مستعار در نظر گرفته است. #C . 32 استفاده می کند System.Int

چند نکته زیر را هنگام کار با انواع داده اولیه بخاطر داشته باشید:

- کلمات کلیدی که انواع داده ی مقداری اولیه را تعیین می کنند، در واقع اسامی مستعار یک ساختار معینی هستند.

32Int اعضای خاصی از این ساختارها برای دستکاری انواع داده اولیه بکار برده م یشوند. برای مثال ساختار

فیلدی که بزرگترین مقدار صحیح 32 بیتی را بر م یگرداند و یک متد که رشته عددی را به یک عدد صحیح تبدیل

می کند، را در بر دارد.

int iMax = int.MaxValue; // Return largest integer

int pVal = int.Parse("١٠٠"); // converts string to int

تبدیل ضمنی را پشتیبانی م یکند. اگر تبدیل یک تبدیل امن باشد، در نتیجه ی حاصله هیچ داد های از #C کامپایلر

دست نمی رود. این زمانی اتفاق می افتد که مقصد تبدیل دقت بالایی نسبت به شی مبداء داشته باشد، که تبدیل

گسترش 3 نام دارد. در تبدیل کاهشی 4 که مقصد دقت کمتری دارد، باید عمل تبدیل به صورت صریح باشد،

قالب بندی برای تبدیل یک مقدار از یک نوع به یک نوع دیگر استفاده م یشود. این عمل با قرار دادن نوع داد هی

مقصد در داخل پرانتزهایی قبل از مقدار مورد نظر انجام می شود.

short i١۶ = ۵٠; // ١۶-bit integer

int i٣٢ = i١۶; // Okay: int has greater precision

i١۶ = i٣٢; // Fails: short is ١۶ bit, int is ٣٢

i١۶ = (short) i٣٢; // Okay since casting used

یک حرف به دنبال مقدار مورد نظر نیاز double ،decimal ،float • مقادیر حرفی 5 تخصیص یافته به انواع داد هی

نیاز دارد. m یا M به decimal و d یا D به double ،f یا F به Float . دارند

• decimal pct = .١۵M; // M is required for literal value

دارد. String بقیه این بخش مروری بر مفیدترین انواع داده اولیه به استثناء

Decimal

یک عدد اعشاری 128 بیتی با دقت بسیار بالا است. دقت آن 28 رقم اعشار است و در محاسبات مالی decimal نوع داده ی

ارائه می دهد. decimal که گرد کردن قابل تحمل نیست، بکار برده می شود. این مثال سه متد برای نوع داده

decimal iRate = ٣٫٩٨٣۴M; // decimal requires M

iRate = decimal.Round(iRate,٢); // Returns ٣٫٩٨

decimal dividend = ۵١٢٫٠M;

decimal divisor = ۵١٫٠M;

decimal p = decimal.Parse("١٠٠٫٠۵");

// Next statement returns remainder = ٢

decimal rem = decimal.Remainder(dividend,divisor);

bool

1 Base Class Library

2 Alias

3 Widening conversion

4 Narroving conversion

5 literal

#C فصل دوم- اصول

41

به یک عدد صحیح ممکن bool هستند. قالب بندی یک مقدار bool تنها مقادیر ممکن یک نوع داد هی true و false

ممکن نیست. bool به 1 یا قال ببندی 1 یا 0 به یک مقدار true نیست. برای مثال تبدیل

bool bt = true;

string bStr = bt.ToString(); // returns "true"

bt = (bool) ١; // fails

Char

16 بیتی را نشان می دهد و به صورت یک عدد صحیح بدون علامت پیاده سازی می شود. یک کاراکتر یونیکد 1 char نوع داده

عملیات انتساب متعددی را می پذیرد: یک مقدار کاراکتری مابین دو علامت تک کوتیشن ( )، یک ،char یک نوع داده

تعدادی متد System.char همانطور که مثال زیر نشان می دهد، ساختار .escape مقدار عددی قالب بندی شده، یک دنباله

مفید فراهم می کند.

myChar = 'B'; // 'B' has an ASCII value of ۶۶

myChar = (char) ۶۶; // Equivalent to 'B'

myChar = '\u٠٠۴٢'; // Unicode escape sequence

myChar = '\x٠٠۴٢'; // Hex escape sequence

myChar = '\t'; // Simple esc sequence:horizontal tab

bool bt;

string pattern = "١٢٣abcd?";

myChar = pattern[٠]; // '١'

bt = char.IsLetter(pattern,٣); // true ('a')

bt = char.IsNumber(pattern,٣); // false

bt = char.IsLower(pattern,٠); // false ('١')

bt = char.IsPunctuation(pattern,٧); // true ('?')

bt = char.IsLetterOrDigit(pattern,١); // true

bt = char.IsNumber(pattern,٢); // true ('٣')

string kstr="K";

char k = char.Parse(kstr);

Byte , sbyte

عدد صحیح 8 بیتی علامتدار با sbyte عدد صحیح بدون علامت با مقداری از 0 تا 255 است و byte یک نوع داده ی

مقداری از 128 - تا 127 است.

byte[] b = {٠x٠٠, ٠x١٢, ٠x٣۴, ٠x۵۶, ٠xAA, ٠x۵۵, ٠xFF};

string s = b[۴].ToString(); // returns ١٧٠

char myChar = (char) b[٣];

long وint و Short

ushort اینها به ترتیب اعداد صحیح علامتدار 16 و 32 و 64 بیتی را نشان می دهند. نسخه های بدون علامت آنها به ترتیب

هستند. ulong و uint و

short i١۶ = ٢٠٠;

i١۶ = ٠xC٨ ; // hex value for ٢٠٠

int i٣٢ = i١۶; // no casting required

double و single

معادل Single نوع داد هی NET.X اینها قالب های 32 بیتی با دقت معمولی و 64 بیتی دقت مضاعف را نمایش م یدهند. در

است. float

38 با 7 رقم اعشار دارد. ^10* 45 تا 3,4 -^10* یک مقدار در محدود هی 1,5 single - نوع داده

308 با 15 الی 16 رقم اعشار دارد. ^10* 324 تا 1,7 -^10* یک مقدار در محدود هی 5 double - نوع داده ی

برمی گردانند. تقسیم 0,0 Nan ، - عملیات ممیز شناور برای نشان دادن اینکه نتیجه ی یک محاسبات تعریف نشده است

است. NaN ، بر 0,0

1 unicode

Mohsen_mahyar@yahoo.com - - C# برنامه نویسی

42

را برای تبدیل یک نوع داد هی ممیز شناور به هر نوع دیگر بکار برید . System.Convert - متد

float xFloat = ٢۴۵۶٧٫۶۶F;

int xInt = Convert.ToInt٣٢(xFloat); // returns ٢۴۵۶٧

int xInt٢ = (int) xFloat;

if(xInt == xInt٢) { } // False

string xStr = Convert.ToString(xFloat);

single zero = ٠;

if (Single.IsNaN(٠ / zero)) { } // True

double xDouble = ١٢۴٫۵۶D;

را برای تبدیل یک رشتة عددی به نوع داد هی مشخص به کار می برند. TryParse و Parse متدهای

short shParse = Int١۶.Parse("١٠٠");

int iParse = Int٣٢.Parse("١٠٠");

long lparse = Int۶۴.Parse("١٠٠");

decimal dParse = decimal.Parse("٩٩٫٩٩");

float sParse = float.Parse("٩٩٫٩٩");

double dbParse = double.Parse("٩٩٫٩٩");

پارس کردن شرطی را فراهم می کند. برای تعیین موفق بودن عمل پارس یک پارامتر بولین بر ،NET در 2,0 TryParse

می گرداند، که روشی برای دوری از کد کنترل رسمی استثناء فراهم م یسازد.

int result;

// parse string and place result in result parameter

bool ok = Int٣٢.TryParse("١٠٠", out result);

bool ok = Int٣٢.TryParse("١٠٠", NumberStyles.Integer, null,out result);

در فرم دوم از این متد، اولین پارامتر یک رشته عددی مورد نظر جهت پارس کردن، پارامتر دوم نوع عدد در رشته را مشخص

می کنند. مقدار بازگشتی در پارامتر چهارم قرار می گیرد.

-3-2 عملگرهای ریاضی، منطق و شرطی

برای عملیات ریاضی، دستکاری بی تها و کنترل شرطی برنامه استفاده می شوند، که باید همه برنامه نویسان با #C عملگرهای

آنها آشنا باشند.

-1-3 عملگرهای ریاضی -2

4 عملگرهای عددی پایه را خلاصه می کند. اولویت این عملگرها در حین ارزیابی یک عبارت در پرانتزها اعمال - جدول 2

می شود. 1 بالاترین سطح اولویت است.

4- جدول 2

عملگر توصیف مثال

(3) +

-

جمع

تفریق

int x = y + ١٠;

(2) *

/

%

ضرب

تقسیم

باقیمانده

int x = ۶٠;

int y = ١۵;

int z = x * y / ٢; // ۴۵٠

y = x % ٢٩ ; // remainder is ٢

(1) ++

--

افزایش / کاهش

پیشوندی/پسوندی

x = ۵;

Console.WriteLine(x++) // x = ۵

Console.WriteLine(++x) // x = ۶

int x = ~١٢٧; // returns - 1) مکمل بیتی ١٢٨ ) ~

#C فصل دوم- اصول

43

(4) <<

>> 

شیفت به راست

شیفت به چپ

byte x = ١٠; // binary ١٠ is ٠١٠١٠

int result = x << ١; // ٢٠ = ١٠١٠٠

result = x >> ٢; // ۵ = ٠٠١٠١

(5) &

(6) |

(7) ^

بیتی And

بیتی Or

بیتی Xor

byte x = ١٢; // ٠٠١١٠٠

byte y = ١١; // ٠٠١٠١١

int result = x & y; //٨ = ٠٠١٠٠٠

result = x ^ y; //٧ = ٠٠٠١١١

عملوندهای این عملگر ها باید صحیح باشند.

را برای رساندن یک عدد به توان بکار م یبرند و متد ()Math.Power عملگر توان ندارد. در عوض، متد #C : توجه

را به توان م یرساند. e ، Math.Exp()

-2-3 عملگرهای شرطی و رابط های -2

عملگرهای رابطه ای برای مقایسه دو مقدار و تعیین رابطة مابین آنها استفاده می شوند. آنها عموماً در ارتباط با عملگرهای

5 خلاصه ای از عملگرهای رابطه ای و شرطی - شرطی، برای ایجاد ساختارهای تصمیمگیری پیچیده استفاده می شوند. جدول 2

را تهیه می کند. #C

5- عملگرهای رابطهای و شرطی - جدول 2

عملگر توصیف مثال

==

=!

مساوی

نامساوی

if (x == y) {...}

=>

=<

کوچکتر

کوچکتر یا مساوی

بزرگتر

بزرگتر یا مساوی

if (x <= y) {...}

&&

||

منطقی And

منطقی Or

if (x == y && y < ٣٠) {...}

باشد، عبارت دوم ارزیابی نمی false اگر عبارت اول

شود.

&

|

!

منطقی And

منطقی Or

نقیض منطقی

if (x== y | y < ٣٠) {...}

همیشه عبارت دوم ارزیابی می شود.

if !(x ==y && y < ٣٠) {...}

باشد، false یا true توجه کنید. در عملگرهای || یا &&، اگر عبارت اول به ترتیب OR/AND به دو شکل عملیات منطقی

دومی ارزیابی نم یگردد. (تکنیک ارزیابی کوتاه)

عملگرهای & و | همواره هر دو عبارت را ارزیابی می کنند. اینها زمانی استفاده می شوند که مقادیر عبارات از یک تابع

برمی گردند و می خواهیم از فراخوانی متدها مطمئن شویم.

برای انتساب شرطی یک مقدار به یک متغیر عملگر ?: را پشتیبانی می کند. همانطور که #C ،5- علاوه بر عملگرهای جدل 2

است. if else این مثال نشان م یدهد آن ساده شده دستور

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

44

string pass;

int grade=٧۴;

If(grade >= ٧٠) pass="pass"; else pass="fail";

// expression ? op١ : op٢

pass = (grade >= ٧٠) ? "pass" : "fail";

باشد، عملگر ?! مقدار اول را بر می گرداند، در غیر این صورت مقدار دوم برگردانده م یشود. true اگر عبارت

#C -4-2 راهنماهای پیش پردازش

خوانده می شوند. آنها می توانند کامپایلر را #C این راهنماها 1، دستوراتی هستند که در مرحله تحلیل حرفی توسط کامپایلر

برای در برگرفتن یا نگرفتن یک تکه کد یا حتی رد عمل کامپایل بر اساس مقادیر راهنماهایی پیش پردازش 2 تذکر دهند.

یک راهنمای پیش پردازش با کارکتر # در ابتدای خط معین می شود. فضاهای خالی قبل و بعد از سمبل # مجاز هستند.

را لیست می کند. #C 6 راهنماهایی از - جدول 2

#C 6- راهنماهای پیش پردازش - جدول 2

توصیف #C سمبل پیش پردازش

define#

undef#

برای تعریف و حذف یک سمبل بکار می رود. با تعریف یک سمبل، در صورتی که در راهنمای

ارزیابی می گردد. true استفاده شود، آن به if#

عمل می کند. #C در if-else شبیه if#

#if

#elif

#else

#endif

شماره ترتیب خط را تغییر می دهد و می تواند تعیین کند منبع این خط کدام فایل است. line#

region#

endregien#

مربوط به IDE برای تعیین یک بلاک کد استفاده می شود که به هنگام کد نویسی در محیط

2005 می توان این بلاک را جمع کرده یا باز کرد. VS

باعث می شود کامپایلر یک خطای مخرب (بزرگ) گزارش دهد. error#

باعث می شود کامپایلر یک هشدار گزارش داده و سپس پردازش را ادامه دهد. warning#

از عمومی ترین کاربردهای راهنماهای پیش پردازش، انجام کامپایل شرطی، اضافه کردن تشخیص ها برای گزارش خطاها و

هشدارها و تعریف ناحی ههای کد است.

-1 کامپایل شرطی -4 -2

می توان تعیین کرد، کدام قسمت از کد در طول کامپایل در گرفته شود. هر کدی که if# با استفاده از راهنماهای مرتبط با

ارزیابی می شود، در هنگام false یا true به if قرار دارند، بر اساس اینکه شرط endif# و دستور if# مابین دستور

کامپایل در برگرفته می شوند یا در برگرفته نم یشوند. این یک ویژگی قدرتمند، اغلب برای اهداف رفع اشکال استفاده

می شوند. حال یک مثال از این مفهوم ارائه م یگردد.

#define DEBUG

using System;

public class MyApp

{

1 Directive

2 Preprocess

#C فصل دوم- اصول

45

public static void Main()

{

#if (DEBUG)

Console.WriteLine("Debug Mode");

#else

Console.WriteLine("Release Mode");

#endif

}

}

قرار گیرند. سمبل کامپایل شرطی دو حالت دارد: تعریف شده یا تعریف cs. بایستی در آغاز فایل define# همه راهنماهای

ارزیابی می شود. کاربرد واضح راهنمای true به (if(DEBUG# تعریف می شود و دستور DEBUG نشده. در این مثال سمبل

2005 را بکار می برید شما می توانید یک تولید برنامه VS هر فایل منبع را مجاز می دارد. اگر Debug کنترل حالت define#

برای هر فایل در پروژه به طور اتوماتیک تعریف می گردد. هیچ DEBUG را تعیین کنید، در نتیجه سمبل Debug بصورت

صریح لازم نیست. define# راهنمای

یک سمبل را تعریف کرد. Define/ نیز می توان با استفاه ازسوییچ #C در خط فرمان کامپایل

csc /Define:DEBUG myproject.cs

در کد منبع نوشته شده باشد. Define DEBUG# کامپایل کردن با این دستور ،معادل این است که دستور

-2 راهنماهای تشخیص -4 -2

راهنماهای تشخیص، پیام های هشدار و خطا می فرستند که شبیه دیگر خطاها و هشدارهای فرمان کامپایل با آنها رفتار

آن را متوقف م یکند. error# ادامه کامپایل را مجاز م یدارد، در حالیکه warning# می شود. راهنمای

#define CLIENT

#define DEBUG

using System;

public class MyApp

{

public static void Main()

{

#if DEBUG && INHOUSE

#warning Debug is on.

#elif DEBUG && CLIENT

#error Debug not allowed in Client Code.

#endif

// Rest of program follows here

تعریف می شوند. DEBUGE و CLIENT در این مثال، کامپایل با یک پیام خطا پایان خواهد داد، چون

ناحیه های کد

هیچ #C راهنماهای ناحیه برای نشانه گذاری قسمتهایی از کد به عنوان ناحیه استفاده می شوند. راهنمای ناحیه برای کامپایلر

تشخیص داده می شوند. VS.NET معنایی ندارند، اما به وسیله

#region

// any C# statements

#endregion

-5-2 نوع داده ی شمارشی

معروف است، یک روش مناسب برای ایجاد یک مجموعه ساختیافته 1 از سمبل ها enum به #C نوع داده شمارشی که در

جهت نمایش مقادیر ثابت پیشنهاد می کند.

گرامر:

1 Structured

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

46

[access modifiers]enum <identifier> [:enum-base]{enum body}

مثال:

enum Fabric :short {

Cotton = ١,

Silk = ٢,

Wool = ۴,

Rayon = ٨,

Other = ١٢٨

}

به یک مقدار خاصی تنظیم نشده باشند، آنها به طور اتوماتیک با دنباله 0و 1و 2و 3و enum توجه: اگر سمب لهای

..... تنظیم م یشوند.

است و اجازه م یدهد فقط کلاسهای internal را تعریف م یکنند. به طور پیش فرض enum معرف های دسترسی، دامنه ی

آن را برای هر کلاسی در هر اسمبلی قابل دسترس می سازد. public داخل آن اسمبلی به آن دسترسی داشته باشند. معرف

نوع داده پایة ثابت ها را بر اساس مقادیر تخصیصیافته به آنها مشخص می کند. آن فقط می تواند enum-base گزینة اختیاری

است. int باشند. به طور پیش فرض ulong یا long ،unit ،int ،ushort ،short ،sbyte ،byte یکی از انواع صحیح

-1 کار با نوع داده شمارشی -5 -2

انواع شمارشی نه تنها خوانایی برنامه را بهتر می کنند، بلکه هنگام تغییر مقدار اصلی، تغییرات کد را نیز کاهش می دهند و

همه ارجاعات به آن مقدار، معتبر می مانند. مزیت دیگر اینکه انواع شمارشی، نوع داده قوی هستند. بدین معنی که هر وقت

به عنوان پارامتر ارسال شود، متد دریافت کننده باید یک پارامتر مطابق با همان نوع داشته باشد. درغیر enum یک نوع

نشان می دهد. Fabric 2 این اهداف را با استفاده از نوع داده شمارشی - اینصورت کامپایلر خطا رخ می دهد. قطعه کد 2

2- قطعه کد 2

static double GetPrice(Fabric fab)

{

switch(fab)

{

case Fabric.Cotton: return(٣٫۵۵);

case Fabric.Silk: return(۵٫۶۵);

case Fabric.Wool: return(۴٫٠۵);

case Fabric.Rayon: return(٣٫٢٠);

case Fabric.Other: return(٢٫۵٠);

default: return(٠٫٠);

}

}

static void Main()

{

Fabric fab = Fabric.Cotton;

int fabNum = (int) fab; // ١

string fabType = fab.ToString(); // "Cotton"

string fabVal = fab.ToString("D"); // "١"

double cost = GetPrice(fab); // ٣٫۵۵

}

نکات:

به یک مقدار صحیح، قال ببندی آن لازم است . enum • برای مقداردهی

fabNum =(int) fab;

می توان مقدار رشت های یک ثابت را بدست آورد. ”D“ و پارامتر ()ToString • با متد

لازم است پارامتر متد از همان نوع اعلان GetPrice به متد Fabric • در هنگام ارسال یک نمونه از نوع شمارشی

شده باشد.

#C فصل دوم- اصول

47

این مثال نشان میدهد که نحوه ی به دست آوردن نام سمبل یا مقدار ثابت نوع شمارشی ساده است. زمانی که نمونه ای از یک

و System.Enum نوع داده شمارشی مشخص باشد، به راحتی می توان اعضاء یک نوع داده شمارشی را به کمک کلاس

به دست آورد. foreach حلقه

System.Enum -2 متدهای -5 -2

هستند. اغلب دو متد System.Enum سه متد مفید ،Enum.Getname و Enum.IsDefined،Enum.Parse متدهای

است و یک نمونه از آن ایجاد می کنند. برای enum اول با هم به کار می روند تا مشخص کنند آیا یک مقدار یا سمبل عضو یک

برای وجود یک مقدار رشته ای در آن Fabric فهم بهتر مطلب، مثال های زیر را در نظر بگیرید. در این مثال نوع شمارشی

یکی از مقادیر آن را چاپ می کند. GetName جستجو م یشود و متد

string fabStr = "Cotton";

// Determine if symbol Cotton exists in Fabric enum

if (Enum.IsDefined(typeof(Fabric),fabStr))

{

// Create enum instance

Fabric fab = (Fabric)Enum.Parse( typeof(Fabric) , fabStr);

// Output from the following statement is: "Silk"

Console.WriteLine("Second value of Fabric Enum is: " + Enum.GetName(typeof(Fabric), ٢));

}

بر می گرداند و یک رشته که سمبل مورد نظر typeof دو پارامتر می گیرد: یک نوع شمارشی که عملگر ISDefined متد

جهت تست را نشان می دهد. شکل دیگر این متد با مقدار عددی برای پارامتر دوم است.

ایجاد fab را می گیرد و یک نمونه از نوع داده ی شمارشی ایجاد می کند. متغیر IsDefined همان پارامترهای Parse متد

مهم است، اگر Parse قبل از کاربرد متد ،enum 2 است. اطمینان از وجود عضو - شده در اینجا معادل همان متغیر قطعه کد 2

آن عضو وجود نداشته باشد یک استثناء روی می دهد.

”Silk“ ای که مقدار آن در پارامتر دوم ارسال میشود بر میگرداند. در این مثال enum یک مقدار رشته ای از GetName متد

برگردانده میشود، چون مقدار ثابت آن 2 است.

های بیتی flag -3 انواع شمارشی و -5 -2

با توانهایی از 2 تصادفی نیست. بیشتر موارد، اعضای نوع شمارشی در عملیات منطقی Fabric تنظیم مقادیر نوع شمارشی

استفاده م یشوند. این مقادیر در نگاشت به مقادیر بیتی منحصر به فرد مفید هستند. ممکن است ترکیبی از این مقادیر را در

کدنویسی تعیین کنید.

Fabric cotWool = Fabric.Cotton | Fabric.Wool;

Console.WriteLine(cotWool.ToString()); // Output: ۵

باشد. می توان این کار را با اضافهکردن صفت Cotton و Wool خروجی در صورتی بامعنی خواهد بود، که آن ترکیبی از

به اعلان نوع شمارشی انجام داد. [flags]

[Flags]

enum Fabric :short {

اعلان نوع شمارشی را بررسی می کند. اگر این صفت موجود باشد، آن نوع شمارشی را به صورت یک ()ToString متد

مجموعه از اعضای نگاشت بیتی در نظر می گیرد. در این مثال نم یتوان یک مقدار سمبلیک معادل 5 پیدا کرد، پس متد

الگوی بیتی “ 101 ” را بکار م یبرد و سمبل هایی که الگوهای بیتی “ 001 ”و” 100 ” دارند را چاپ می کند. خروجی ()ToString

”cotton,wool”. جدید یک لیست جدا شده با کاما است

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

48

-6-2 انواع دادهی مقداری و ارجاعی

2). انواع داده ی ارجاعی شامل کلا سها، - دو نوع داده را پشتیبانی م یکند: انواع مقداری و انواع ارجاعی (شکل 2 CLR

و همچنین byte ،char ،int آرایه ها، واسط ها و نماینده ها هستند. انواع داده ی مقداری شامل انواع داد هی اولیه همچون

و NET. هستند. انواع داده ی ارجاعی و مقداری به وسیله محلشان در سلسله مراتب کلاس struct و enum انواع داده ی

روش تخصیص حافظه متمایز می شوند.

NET. 2- سلسله مراتب کلا سهای - شکل 2

System.ValueType وSystem.Object -1-6 -2

ارث بری می کند. تفاوت این است که انواع داده ی ارجاعی System.Object هر دو نوع داده ی مقداری و ارجاعی از کلاس

ارث بری م یکنند. System.ValueType مستقیما از آن ارثبری می کنند. در حالی انواع داده ی مقداری از کلاس

به عنوان پایه ی همه ی انواع داده، یک مجموعه متد فراهم می کند، که می توانید در هر نوع داده بیابید. System.Object

عضوی از این مجموعه است. همچنین متد های ایجاد یک کپی از یک نوع داده و یک کد درهمسازی ()ToString متد

منحصر به فرد برای یک نوع داده و مقایسه دو نمونه از یک نوع داده نیز وجود دارد.

ارث بری می کند و هیچ عضوی اضافه نم یکند. اما یک سری از متدهای System.Object از System.ValueType

برای مقایسهی ()Equals می کند. برای مثال، متد override ارث بری شده را جهت ایجاد تناسب با انواع داد هی مقداری

ValueType می شود. بنابه تعریف، هم هی انواع داده ی مقداری به صورت ضمنی از کلاس override دو شی همنوع

ارثبری می کنند.

-2-6 تخصیص حافظه برای انواع داده مقداری و ارجاعی -2

برای نیازهای حافظ های آنها م یباشد. در زمان اجرا به انواع ClR تفاوت اصلی انواع داده مقداری و ارجاعی در روش مدیریت

مدیریت شده قرار Heap حافظه تخصیص داده می شود و انواع داده ارجاعی روی یک Stack داده مقداری روی یک

ارجاع داده م یشوند. Stack می گیرند که از

3 نحوه تخصیص حافظه را برای انواع داده ی ارجاعی و مقداری نشان می دهد و اینکه زمان ایجاد یک نمونه از یک - شکل 2

نوع داده ارجاعی و تخصیص آن به یک متغیر دومی چه اتفاقی م یافتد را دنبال کنید.

Apparel myApparel = new Apparel();

Apparel myApparel٢ = myApparel;

#C فصل دوم- اصول

49

2-نحوهی تخصیص حافظه - شکل 3

مدیریت شده به شی مورد نظر حافظه تخصیص م یدهد. Heap در بالای CLR -1

اضافه می شوند. این اطلاعات شامل یک اشارهگر به جدول متد شی و یک Heap -2 اطلاعات سربار شی به

است که برای همزمان سازی دسترسی به شی مابین چند متد استفاده می شود. SyncBlockIndex

آن روی FabType و Price ایجاد می شود و فیلدهای Apparel به عنوان یک نمونه از کلاس myApparel -3 شی

قرار می گیرند. Heap

قرار می گیرد. Stack روی myAparel -4 ارجاع به

قرار می گیرد و یک اشاره گر به Stack 2 ایجاد می شود، آن روی myApparel -5 زمانی که یک متغیر ارجاع جدید

2 به شی یکسانی اشاره می کنند. myApparel و myApparel شی موجود می دهد. هر دو متغیر ارجاعی

ایجاد یک شی ارجاعی به دلیل داشتن چندین مرحله و سربار اضافی مربوط به زمان و منابع، گران هستند. با این وجود،

تنظیم ارجاع های اضافی به یک شی موجود کاملا کارآمد است، چون نیازی به ایجاد یک کپی فیزیکی از یک شی نیست.

عکس آن برای انواع داده مقداری صحیح است.

-3-6 جعبهبندی 1 -2

دارد که مقادیر هر نوع داده ای را می پذیرد. در صورتیکه نوع یک مقدار مشخص نباشد، Object یک نوع داده خاص .NET

بایستی به Object آن یک روش کلی برای ارسال پارامترها و انتساب مقادیر فراهم می کند. با هر چیز منتسب شده به

ذخیره می گردد. دستورات زیر را ملاحظه نمایید: Heap صورت یک نوع داده ارجاعی رفتار شود و روی

int age = ١٧;

object refAge = age;

را به یک نوع داده ی age قرار می دهد. دستور دومی مقدار Stack را ایجاد م یکند و مقدار آن را روی age دستور اول متغیر

Stack قرار می دهد و اشاره گرهای سربار را اضافه می کند و در Heap ارجاعی منتسب می کند. آن دستور مقدار 17 را روی

یک ارجاع به آن اضافه می کند، این عمل را جعبه بندی گویند. تبدیل یک نوع داده ارجاعی به یک نوع داده مقداری "از

جعبه در آوردن 2" گفته می شود و با قالب بندی یک شی به نوع داده اصلی آن انجام می شود. حال شی ایجاد شده در مثال

قبلی را از جعبه در م یآوریم.

int newAge = (int) refAge;

string newAge = (string) refAge; // Fails. InvalidCastException

1 Boxing

2 Unboxing

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

50

توجه داشته باشید مقداری که از جعبه درآورده می شود، باید از همان نوع داده قالب بندی شده باشد. در کل، جعبه بندی

جزئیات را بطور شفاف کنترل می کند. با این وجود، زمان طراحی کد، ذخیرهی مقدار زیادی ClR می تواند صرفنظر شود، چون

را ملاحظه کنید. ArrayList و System.Array از داده های عددی در حافظه را بررسی کنید. برای این منظور کلاس های

هر دو از انواع داده ارجاعی هستند، اما از نظر ذخیره مقادیر داد های ساده کاملا متفاوت عمل می کنند.

همه عناصر را به صورت ArrayList، طراحی شدهاند. در نتیجه Object برای کار روی نوعداده کلی Arraylist متدهای

انواع داده ارجاعی ذخیره میکند. اگر داده ی مورد نظر جهت ذخیره، یک نوع داده ی مقداری باشد، قبل از ذخیره باید

جعبه بندی شود. از طرف دیگر آرایه م یتواند هر دو نوع داده ی مقداری و ارجاعی را نگه دارد. آن با انواع داده ارجاعی همانند

رفتار می کند، ولی انواع داده مقداری را جعب هبندی نمی کند. ArrayList

4 نشان داده شده است، مقادیر - از مقادیر صحیح ایجاد میکند. همانطور که در شکل 2 ArrayList کد زیر یک آرایه و یک

در حافظه کاملا با روش متفاوتی ذخیره م یشوند.

// Create array with four values

int[] ages = {١،٢،٣،۴};

// Place four values in ArrayList

ArrayList ages = new ArrayList();

for (int i=٠; i<۴; i++)

{

ages.add(i); // expects object parameter

}

در حافظه ArrayList و Array 4- مقایسهی - شکل 2

هر مقداری را جعب هبندی می کند. آن سپس سربار ArrayList . ذخیره می کند int متغیر آرایه، مقادیر را به صورت مقادیر

مورد نیاز بوسیله انواع داده ی ارجاعی را اضافه می کند. اگر برنامه کاربردی شما مقدار زیادی داده در حافظه ذخیره م یکند و

2,0 استفاده می کنید، کلاس NET . را نیاز ندارد، آرایه یک پیاده سازی کاراتری است. اگر از ArrayList ویژگی های خاص

را شامل است. ArrayList بهترین انتخاب است، چون جعب هبندی را حذف م یکند و ویژگی های انعطاف پذیر List

آزاد م یشود. در صورتی که حد مشخص Stack نکته : زمانی که یک متغیر از میدان خارج می گردد، حافظه ی آن از روی

کنترل می گردد و بطور NET. به وسیله ی GC . را آزاد م یکند Heap حافظه ی آشغال روی GC ، حافظه سیستم استفاده گردد

اتوماتیک در فاصله های غیرقابل پیش بینی اجرا می گردد.

-7-2 فضاهای نامی

همانطور که می دانید، فضاهای نامی یک روش برای سازمان دهی کلاسهای مرتبط و انواع داده ای دیگر فراهم می کند. برخلاف

یک فایل یا یک قطعه، فضای نامی به جای گروه بندی فیزیکی، یک گروه بندی منطقی انجام می دهد. زمانی که یک کلاس

تعریف می کنند، می توانید آن را در یک تعریف فضای نامی قرار دهید. سپس اگر بخواهید یک کلاس دیگر در فایل دیگری

تعریف کنید که کار مرتبط با آن انجام می دهد، می توانید آن را در همان فضای نامی قرار دهید. ایجاد یک گروه بندی منطقی،

تشخیص کلاس های مورد استفاده را برای توسع هدهندگان دیگر ساده می کند.

#C فصل دوم- اصول

51

namespace CustomerPhoneBookApp

{

using System;

public struct Subscriber

{

// Code for struct here...

}

}

قراردادن یک نوع داده در یک فضای نامی، یک نام طولانی به آن نوع داده می دهد که شامل چندین اسم جدا شده با نقطه

،Subscriber می باشد، که در انتها نام کلاس قرار می گیرد. در مثال قبلی نام کامل ساختار

است. این عمل کاربرد کلاسهای هم نام در فضاهای نامی مختلف را در یک برنامه CustomerPhoneBookApp.Subsciber

بدون هیچ ابهامی مجاز می دارد.

می توانید فضاهای نامی تودرتو را ایجاد کنید و یک ساختار سلسله مراتبی برای انواع داده ای خودتان بسازید.

namespace Arshia

{

namespace ProCSharp

{

namespace Basics

{

class NamespaceExample

{

// Code for the class here...

}

}

}

}

نام هر فضای نامی از نام های فضاهای نامی که آن را در بر می گیرند تشکیل شده است، که با نقطه از هم جدا شد هاند. با نام

بیرونی ترین فضای نامی شروع شده و به نام کوتاه خودش ختم م یشود.

،NamespaceExample است و نام کامل کلاس Arshia.ProCSharp ،ProCSharp پس نام کامل فضای نامی

است. Arshia.ProCSharp.Basics.NameSpaceExample

می توانید در تعاریف فضای نامی خودتان، این قاعده را برای سازمان دهی فضاهای نامی بکار برید. بنابراین کد قبلی م یتواند

بصورت زیر نوشته شود.

namespace Arshia.ProCSharp.Basics

{

class NamespaceExample

{

// Code for the class here...

}

}

توجه: اعلان یک فضای نامی چندبخشی به صورت تو در تو، در داخل فضای اسمی دیگر مجاز نیست.

فضاهای نامی به اسمبلی ها مرتبط نیستند. در یک اسمبلی می توان فضاهای نامی مختلفی تعریف کرد یا در فضاهای نامی

انواع داده ای تعریف کرد که در اسمبلی های مختلفی قرار دارند.

using -1 دستور -7 -2

اختصار نوشتن نام کامل یک کلاس را اجازه می دهد. برای انجام این کار، فضای نامی کلاس را #C ، همانطور که قبلا گفته شد

به برنامه ربط دهید. در ادامه ی فایل می توانید به انواع داده ای موجود در آن فضای نامی using در بالای فایل با کلمه کلیدی

بوسیله نام نوع داده ارجاع کنید.

using System;

using Arshia.ProCSharp;

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

52

شروع می شوند. چون بیشتر کلا سهای مفید تهیه شده توسط using System با دستور #C بطور مجازی همه کدهای منبع

دربرگرفته شده اند. System مایکروسافت در فضای اسمی

یک نوع داده هم نام داشته باشند، شما نام کامل را برای آنها استفاده using اگر در فضاهای نامی ارجاع شده با دستورات

خواهید کرد تا مطمئن شوید کامپایلر کدام نوع داده را دستیابی می کند. برای مثال، فرض کنید کلاسهایی بنام

وجود دارند. Arshia.ProCSharp.OOP و Arshia.ProCSharp.Basic در فضاهای نامی NamesspaceExample

ایجاد کنید و یک نمونه از کلاس Arshia.ProCSharp در فضای نامی Test اگر شما یک کلاس بنام

در این کلاس ایجاد کنید، باید مشخص کنید که کدام یک از دو کلاس بالا را مد نظر دارید. NameSpaceExample

using Arshia.ProCSharp;

class Test

{

public static int Main()

{

Basics.NamespaceExample nSEx = new Basics.NamespaceExample();

// do something with the nSEx variable

return ٠;

}

}

++C در header هیچ عمل پیوند فیزیکی بین فای لها انجام نمی دهد و فضاهای نامی معادل فایل های using دستور

نیستند.

بیشتر سازمان ها مدت زمانی را برای توسعه یک شمای فضای نامی صرف م یکنند تا توسعه دهندگان بتوانند به راحتی

کلاس های مورد نیاز خود را پیدا کنند و از تداخل نامی در کتابخان ههای خود جلوگیری کنند.

-2 اسامی مستعار فضای اسمی -7 -2

انتساب اسامی مستعار به کلا سها و فضاهای نامی است. استفاده از نام طولانی یک فضای ،using کاربرد دیگر کلید کلیدی

می توانید یک نام مستعار به فضای نامی using نامی در برنامه به دفعات زیاد خسته کننده است. با استفاده از دستور ساده

انتساب دهید.

using alias = NamespaceName;

انتساب میدهد و این را برای ایجاد Arshia.ProCSharp.Basic را به فضاینامی Introduction مثال زیر نام مستعار

به کار می برد. به کاربرد توصیف کنندهی 1 نام مستعار فضای نامی (::) توجه کنید. NamespaceExample یک شی از کلاس

در همان میدان تولید شده Introduction آن به اجبار نام مستعار فضای نامی را جستجو می کند. اگر یک کلاس به نام

باشد، تداخل رخ م یدهد. عملگر :: حتی در صورت وجود تداخل، امکان استفاده از آن نام مستعار را فراهم می سازد. کلاس

به GetType استفاده می کند. متد ()GetType دارد که از متد ()GetNamespace یک متد به نام NamespaceExample

دسترسی دارد که نوع کلاس را نشان می دهد. این شی را برای برگرداندن نام فضای نامی کلاس بکار Type یک شی از نوع

می برید.

using System;

using Introduction = Arshia.ProCSharp.Basics;

class Test

{

public static int Main()

{

Introduction::NamespaceExample NSEx =

new Introduction::NamespaceExample();

Console.WriteLine(NSEx.GetNamespace());

return ٠;

}

}

1 Qualifier

#C فصل دوم- اصول

53

namespace Arshia.ProCSharp.Basics

{

class NamespaceExample

{

public string GetNamespace()

{

return this.GetType().Namespace;

}

}

}

I/O -8-2 کنسول

Console بدست آورده باشید. در این قسمت چندین متد ایستای کلاس #C تا اینجا باید یک آشنایی پایه ای از انواع دادهی

مفید هستند. #C را برای خواندن و نوشتن داده استفاده میکنیم، چون این متدها زمان نوشتن برنامههای پایهای

را استفاده می کنید. این متد یک جریان 1 ()Console.ReadLine برای خواندن یک خط متنی از پنجره کنسول، متد

ورودی را از پنجره کنسول خوانده و رشته ورودی را بر میگرداند. همچنین دو متد برای نوشتن کنسول وجود دارد.

Console.Write()

مقدار ارجاعی را به پنجره کنسول م ینویسد.

Console.WriteLine()

همان کار را انجام می دهد، اما یک کاراکتر خط جدید به انتهای خروجی اضافه می کند.

شکلهای متنوع این متدها برای انواع دادهای از پیش تعریف شده وجود دارند. پس در بیشتر موارد، تبدیل مقادیر به رشته ها

قبل از نوشتن آنها لازم نیست. برای مثال، کد زیر به کاربر اجازه می دهد یک خط متنی وارد کند و آن را نمایش میدهد.

string s = Console.ReadLine();

Console.WriteLine(s);

نمایش C زبان printf به شما اجازه می دهد، یک خروجی فرم تدهی شده را همانند تابع ()Console.WriteLine متد

تعدادی پارامتر به آن ارسال می کنید. اولین پارامتر رشته ای است که در آن ،WriteLine دهید. برای استفاده از این رفتار

رشته از نشانه گذارها استفاده می شود. نشانه گذارها محل قرارگیری خروج یها در داخل متن را با {} مشخص می کنند. هر

نشانه گذار یک اندیس با پایة صفر را برای مشخص کردن تعداد پارامترها استفاده می کند. برای مثال { 0} اولین پارامتر لیست

است. کد زیر را ملاحظه کنید.

int i = ١٠;

int j = ٢٠;

Console.WriteLine("{٠} plus {١} equals {٢}", i, j, i + j);

این کد خروجی زیر را نمایش م یدهد.

10 plus 20 equals 30

می توانید یک طول برای مقدار مشخص کنید و متن را با آن طول تنظیم کنید. مقادیر مثبت برای تنظیم راست و مقادیر منفی

طول مقدار است. w اندیس پارامتر و n را به کار می برید که {n,w} برای تنظیم چپ استفاده می شوند. برای این کار فرمت

int i = ٩۴٠;

int j = ٧٣;

Console.WriteLine(" {٠،۴}\n+{١،۴}\n ----\n {٢،۴}", i, j, i + j);

نتیجه به صورت زیر است.

٩۴٠

+ ٧٣

----

1 Stream

Mohsen_mahyar@yahoo.com - - C# برنامهنویسی

54

١٠١٣

در نهایت می توانید یک رشته فرمت به همراه دقت (اختیاری) اضافه کنید. لیستی از فرمت بندی های مورد استفاده در انواع

داده ی پیش تعریف شده را به صورت زیر می بینید:

رشته توصیف

فرمت پول محلی C

فرمت دسیمال. یک عدد صحیح را به مبنای 10 بر می گرداند و اگر دقت آن مشخص باشد D

صفرهایی را به آن اضافه می کند.

فرمت علمی (توانی). مشخص کنندة دقت، تعداد ارقام اعشار را مشخص می کند (پیش فرض آن 6 E

حالت سمبل توان را تعیین می کند. (E یا e) است). بزرگی یا کوچکی حرف رشته فرمت

فرمت اعشاری ثابت. مشخص کنندة دقت، ارقام اعشار را کنترل می کند. صفر قابل قبول است. F

را بر اساس حالت مقدار به کار م یبرد. e یا f فرمت کلی. فرمت دهی G

فرمت عدد، عدد را با جدا کننده هزار (کاما) فرمت می کند. برای مثال 320،767،44 N

فرمت درصد P

فرمت هگزا دسیمال. مشخص کنندة دقت برای تعیین تعداد صفرهای اضافی به کار م یرود. X

در بقیه موارد به حالت حروف حساس نیست. اگر م یخواهید یک رشته فرمت را e/E توجه کنید که رشته فرمت به استثناء

بکار برید، بایستی آن را بلافاصله بعد از نشان هگذار مربوط به آن پارامتر قرار دهید و شماره پارامتر و طول مقدار را با کاما از

2C ، هم جدا کنید. برای مثال، جهت فرمت دهی یک مقدار دسیمال به صورت واحد پول محلی کامپیوتر با دقت دو رقم اعشار

را به کار می برید.

decimal i = ٩۴٠٫٢٣m;

decimal j = ٧٣٫٧m;

Console.WriteLine(" {٠،٩:C٢}\n+{١،٩:C٢}\n ---------\n {٢،٩:C٢}", i,j, i + j);

خروجی این کد در ایالت متحده به صورت زیر است.

$٩۴٠٫٢٣

$٧٣٫٧٠

---------

$١،٠١٣٫٩٣

به عنوان نکته نهایی، شما می توانید جهت نگاشت فرمت بندی کاراکترهای جایگزین را به جای رشته های فرمت به کار برید.

به عنوان مثال:

double d = ٠٫٢٣۴;

Console.WriteLine("{٠:#.٠٠}", d);

خروجی . 23 را نشان م یدهد. اگر کاراکتری در آن محل نباشد، سمبل # صرف نظر می شود و صفر ها با کاراکترهای موجود در

آن موقعیت جایگزین می شوند و اگر کاراکتری نباشد، صفر چاپ م یشود.

-9-2 خلاصه

است. #C • انواع دادهی اولیه، پایهی هر نوع داده ی تعریف شده در

یک زبان برنامه نویسی ساده، مدرن و شیگرا و... است. #C •

باید داخل یک کلاس قرار گیرد. #C • هر قطعه کد

#C فصل دوم- اصول

55

است. #C نقطهی ورودی هر برنامهی ()Main • متد

در تعریف متغیرها به حالت حروف حساس است. #C •

نوشته می شوند، با استثناء متغیرهای محلی و پارامترها که با حالت Pascal همهی انواع داده به صورت #C • در

نوشته می شوند. Camel

وجود دارد. //، /* */، /// #C • سه روش برای مشخص کردن توضیحات در

است. FCL نام مستعار یک ساختار داده از #C • هر نوع دادهی پایه در

و...دارند. TryParse ،Parse • هر ساختار داده تعدادی متد مفید همچون

،D به ترتیب حر فهای single و float ،decimal • مقادیر حرفی انتساب داده شده به متغیرهایی از نوع دادهی

را به صورت پسوند مقدار عددی خود استفاده می کنند. M و F

است. C همانند زبان #C • عملگرهای ریاضی، منطقی و رابط های

عملگرهای & و | همواره هر دو عبارت را ارزیابی می کنند. اینها زمانی استفاده م یشوند که مقادیر عبارات از یک

تابع برمی گردند و می خواهیم از فراخوانی متدها مطمئن شویم.

استفاده می شوند. #C • راهنماهای پی شپردازش برای راهنمایی کامپایلر

استفاده کرد. undef# و def# • برای کامپایل شرطی می توان از راهنماهای

یک روش مناسب برای ایجاد یک مجموعه ساختیافته از سمبل ها جهت نمایش مقادیر ثابت پیشنهاد می کند

نوع شمارشی خوانایی برنامه را بالا م یبرد و تغییرات برنامه را راح تتر و منسج متر می سازد.

می توان یک مقدار شمارشی را به نام رشت های آن تبدیل کرد.

مقادیر شمارشی می توانند بصورت ترکیبی استفاده شود، بنابراین مقادیر عددی آنها را توا نهایی از 2 در نظر

می گیرند تا نگاشت بیتی امکا نپذیر باشد.

و انواع Stack • انواع داده ی مقداری و ارجاعی از نظر تخصیص حافظه و مدیریت با هم فرق دارند. انواع مقداری در

مدیریت شده ذخیره می گردند. Heap ارجاعی در

ارث بری می کنند. System.Object و انواع دادهی ارجاعی از System.ValueType • انواع دادهی مقداری از

تبدیل می کند. object • جعبه بندی مقدار هر متغیری را به نوع

را به یک نوع خاص تبدیل می کند. object • از جعبه درآوردن، مقدار یک متغیر از نوع

فضای نامی یک گرو هبندی منطقی از کلا سها و انواع داد های دیگر فراهم می سازد. ممکن است این کلا سها محل

فیزیکی متفاوتی داشته باشند.

در using • در هنگام استفاده ی کلاس، باید نام کامل کلاس را نوشت. ولی در صورت استفاده از کلمه ی کلیدی

ابتدای فایل، می توان فقط به نام کوچک کلاس اشاره کرد.

برای دوری از اسامی طولانی فضاهای نامی، م یتوان از اسامی مستعار برای فضاهای نامی طولانی استفاده کرد و برای

دسترسی به کلا سهای آن فضای نامی بوسیله ی نام مستعار از عملگر :: استفاده می کنند.

Mohsen_mahyar@yahoo.com -

   + MOHSEN GHASEMI - ۱۱:۳٧ ‎ب.ظ ; ۱۳۸٩/٤/۳