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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПолноС руководство. Π‘# 4.0Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 114

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

Помимо ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² доступа public, private ΠΈ protected, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡ…ΡΡ Π² прСдставлСнных Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² C# прСдусмотрСн Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal. Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ опрСдСляСт Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Ρ‡Π»Π΅Π½Π° Π²ΠΎ всСхфайлах сборки ΠΈ Π΅Π³ΠΎ Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ сборки. ΠŸΡ€ΠΎΡ‰Π΅ говоря, ΠΎ Ρ‡Π»Π΅Π½Π΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΌ ΠΊΠ°ΠΊ internal, извСстно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² самой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½ΠΎ Π½Π΅ Π·Π° Π΅Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ.ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ для создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊ классам ΠΈ ΠΈΡ… Ρ‡Π»Π΅Π½Π°ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ΠΊ структурам ΠΈ Ρ‡Π»Π΅Π½Π°ΠΌ структур. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ internal Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… интСрфСйсов ΠΈ пСрСчислСний.

Из ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² protected ΠΈ internal ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ спарСнный ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа protected internal. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ доступа protected internal ΠΌΠΎΠΆΠ΅Ρ‚Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‡Π»Π΅Π½ΠΎΠ² класса. Π§Π»Π΅Π½, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ protected internal,доступСн лишь Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… собствСнной сборки ΠΈΠ»ΠΈ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ примСнСния ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° доступа internal.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal.using System;class InternalTest { internal int x;}class InternalDemo { static void Main() { InternalTest ob = new InternalTest(); ob.x = 10; // доступно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ находится Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π΅ Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ob.x: " + ob.x); }}

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

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

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

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

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

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

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

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is.// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° is.using System;class A {}class Π’ : A {}class UseIs { 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

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ is Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пояснСний,Π½ΠΎ Π΄Π²Π° ΠΈΠ· Π½ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ всС ΠΆΠ΅ Ρ€Π°Π·ΡŠΡΡΠ½ΠΈΡ‚ΡŒ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π°.if(b is A) Console.WriteLine("b совмСстим с А, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ А");

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

условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if Π½Π΅ выполняСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π° являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° А, Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π’. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π° Π½Π΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ Π’.ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° 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 ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ лишь ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ². Но Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ трСбуСтся информация ΠΎ самом Ρ‚ΠΈΠΏΠ΅. Для этой Ρ†Π΅Π»ΠΈ Π²Π‘# прСдусмотрСн ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ typeof. Он ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса System.Π’ΡƒΡ€Π΅ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ характСристики ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° общая Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° typeof:typeof(Ρ‚ΠΈΠΏ)