Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0 ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство - 2011Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 125

Автор Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚

Π’ классС InternalTest ΠΏΠΎΠ»Π΅ Ρ… ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ internal. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ Ρ… доступно Π² самой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄ класса InternalDemo, ΠΎΠ½ΠΎ нСдоступно Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ГЛАВА 17 Π”инамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ², рСфлСксия ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

I

Π’ этой Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ эффСктивных срСдства: динамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ², рСфлСксия ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. ДинамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ² прСдставляСт собой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. РСфлСксия β€” это срСдство для получСния свСдСний ΠΎ Ρ‚ΠΈΠΏΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти свСдСния, ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π²ΠΎ врСмя выполнСния. Π­Ρ‚ΠΎ довольно эффСктивноС срСдство, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ динамичСски, Ρ‚.Π΅. Π² процСссС Π΅Π΅ выполнСния. Атрибут описываСт характСристики ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘#. Атрибуты ΠΌΠΎΠΆΠ½ΠΎ, Π² частности, ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ для классов, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΠΎΠ»Π΅ΠΉ. Π’ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для получСния свСдСний ΠΎ Π½ΠΈΡ…. Для этой Ρ†Π΅Π»ΠΈ Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ динамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ² ΠΈ рСфлСксия.

ДинамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ²

ДинамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ² (RTTI) позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Она оказываСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΠΎ Ρ†Π΅Π»ΠΎΠΌΡƒ ряду ΠΏΡ€ΠΈΡ‡ΠΈΠ½. Π’ частности, ΠΏΠΎ ссылкС Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ½ΠΎ довольно Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, доступного ΠΏΠΎ этой ссылкС. ДинамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ² позволяСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅, насколько ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ исход привСдСния Ρ‚ΠΈΠΏΠΎΠ², прСдотвращая ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π² связи с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, динамичСская идСнтификация Ρ‚ΠΈΠΏΠΎΠ² являСтся Π³Π»Π°Π²Π½ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ рСфлСксии.

Для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ динамичСской ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π² C# прСдусмотрСны Ρ‚Ρ€ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слова: is, as ΠΈ typeof. КаТдоС ΠΈΠ· этих ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов рассматриваСтся Π΄Π°Π»Π΅Π΅ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π΅Π³ΠΎ общая Ρ„ΠΎΡ€ΠΌΠ°:

Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ i s Ρ‚ΠΈΠΏ

Π³Π΄Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ провСряСтся. Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ совмСстимый ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ‚ΠΈΠΏ, ΠΊΠ°ΠΊ ΠΈ провСряСмый Ρ‚ΠΈΠΏ, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ получаСтся истинным, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” Π»ΠΎΠΆΠ½Ρ‹ΠΌ. Π’Π°ΠΊ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ истинным, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ провСряСмый Ρ‚ΠΈΠΏ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅. Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ i s ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ совмСстимыС, Ссли ΠΎΠ½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ Ссли прСдусмотрСно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ссылок, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ распаковка.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is.

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is. using System;

class A {} class Π’ : A {}

class Usels {

static void Main() {

A a = new A();

Π’ b = new Π’(); if (a is A)

Console.WriteLine("Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ A"); if(b is A)

Console.WriteLine ("b совмСстим с А, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ А"); if(a is Π’)

Console.WriteLine("НС выводится, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π’");

if(b is Π’)

Console.WriteLine("Π’ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Π’"); if(a is object)

Console.WriteLine("Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ object");

}

}

Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΊΠΎΠ΄Π°.

Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ А

b совмСстим с А, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ А b ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Π’ Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ object

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ i s Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пояснСний, Π½ΠΎ Π΄Π²Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ всС ΠΆΠ΅ Ρ€Π°Π·ΡŠΡΡΠ½ΠΈΡ‚ΡŒ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π°.

if (b is А)

Console.WriteLine("b совмСстим с А, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ А");

Условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if выполняСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ b являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° Π’, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ°-А. Но ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ нСсправСдливо. Π’Π°ΠΊ, Ссли Π² строкС ΠΊΠΎΠ΄Π°

if(a is Π’)

Console.WriteLine("НС выводится, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π’");

условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ i f Π½Π΅ выполняСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π° являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° А, Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π’. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π° Π½Π΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ Π’.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° as

Иногда ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² трСбуСтся произвСсти Π²ΠΎ врСмя выполнСния, Π½ΠΎ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ссли исход этого прСобразования окаТСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ². Для этой Ρ†Π΅Π»ΠΈ слуТит ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ as, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ as Ρ‚ΠΈΠΏ

Π³Π΄Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΠΎΠ΅ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Если исход Ρ‚Π°ΠΊΠΎΠ³ΠΎ прСобразования оказываСтся ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Ρ‚ΠΎ возвращаСтся ссылка Π½Π° Ρ‚ΠΈΠΏ, Π° ΠΈΠ½Π°Ρ‡Π΅ β€” пустая ссылка. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ as ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для прСобразования ссылок, идСнтичности, ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ, распаковки.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ as ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ is. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ is ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдотвращСния Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ привСдСния Ρ‚ΠΈΠΏΠΎΠ².

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ is для прСдотвращСния Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ привСдСния Ρ‚ΠΈΠΏΠΎΠ².

using System;

class А {} class Π’ : А {}

class CheckCast {

static void Main() {

A a = new A();

Π’ b = new Π’ ();

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ привСсти Π° ΠΊ Ρ‚ΠΈΠΏΡƒ Π’. if(a is Π’) // Ссли Π΄Π°, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) Π°;

else // Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = null;

if(b==null)

Console.WriteLine("ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) HE допустимо."); else

Console.WriteLine("ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) допустимо.");

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) НЕ допустимо.

Как слСдуСт ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π° Π½Π΅ совмСстим с Ρ‚ΠΈΠΏΠΎΠΌ Π’, ΠΈ поэтому Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΈΠΏΡƒ Π’ Π½Π΅ допустимо ΠΈ прСдотвращаСтся Π² условном ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ if. Но Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ приходится Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² Π΄Π²Π° этапа. Π‘Π½Π°Ρ‡Π°Π»Π° трСбуСтся ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² обоснованности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ привСдСния Ρ‚ΠΈΠΏΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π΅. Оба этапа ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° as, ΠΊΠ°ΠΊ дСмонстрируСт привСдСнная Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° as.

using System;

class A {} class Π’ : A {}

class CheckCast {    ,

static void Main() {

A a = new A();

Π’ b = new Π’();

b = a as Π’; // Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ if(b==null)

Console.WriteLine("ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) НЕ допустимо."); else

Console.WriteLine("ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) допустимо.");

}

}

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² b = (Π’) НЕ допустимо.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ as сначала провСряСтся ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ привСдСния Ρ‚ΠΈΠΏΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ выполняСтся сама опСрация привСдСния Ρ‚ΠΈΠΏΠΎΠ², Ссли ΠΎΠ½Π° допустима.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° typeof

НСсмотря Π½Π° всю свою ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡ‚ΡŒ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ as ΠΈ is ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ лишь ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ². Но Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ трСбуСтся информация ΠΎ самом Ρ‚ΠΈΠΏΠ΅. Для этой Ρ†Π΅Π»ΠΈ Π² C# прСдусмотрСн ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ typeof. Он ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса System. Π’ΡƒΡ€Π΅ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ характСристики ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° общая Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° typeof:

typeof(Ρ‚ΠΈΠΏ)

Π³Π΄Π΅ Ρ‚ΠΈΠΏ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ Ρ‚ΠΈΠΏ, инкапсулируСтся Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ класса Π’ΡƒΡ€Π΅.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Π’ΡƒΡ€Π΅ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π½Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ свойства, поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² классС Π’ΡƒΡ€Π΅. Класс Π’ΡƒΡ€Π΅ довольно ΠΎΠ±ΡˆΠΈΡ€Π΅Π½ ΠΈ содСрТит Π½Π΅ΠΌΠ°Π»ΠΎ Ρ‡Π»Π΅Π½ΠΎΠ², поэтому Π΅Π³ΠΎ рассмотрСниС придСтся ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°, посвящСнного рСфлСксии. Но Π² качСствС ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ ввСдСния Π² этот класс Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Π΅Π³ΠΎ свойства: FullName, IsClass ΠΈ IsAbstract. Для получСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΈΠΏΠ° слуТит свойство FullName. Бвойство IsClass Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли Ρ‚ΠΈΠΏ относится ΠΊ классу. А свойство IsAbstract Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли класс являСтся абстрактным.

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° typeof.