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

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

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

#pragma warning disable прСдупрСТдСния

#pragma warning restore прСдупрСТдСния


Π³Π΄Π΅ прСдупрСТдСния ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ раздСляСмый запятыми список Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. Для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ прСдупрСТдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опция disable, Π° для Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ β€” опция restore.

НапримСр, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ #pragma запрСщаСтся Π²Ρ‹Π΄Π°Ρ‡Π° прСдупрСТдСния β„–168, ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ пСрСмСнная объявлСна, Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.


#pragma warning disable 168


Π’Ρ‚ΠΎΡ€ΠΎΠΉ для Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #pragma являСтся опция checksum. Она слуТит для формирования ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ASP.NET. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π΅Π΅ общая Ρ„ΠΎΡ€ΠΌΠ°:


#pragma checksum "имя_Ρ„Π°ΠΉΠ»Π°" "{GUID}" "ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ_сумма"


Π³Π΄Π΅ имя_Ρ„Π°ΠΉΠ»Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°; GUID β€” глобально ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связано имя_Ρ„Π°ΠΉΠ»Π°; ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ_сумма β€” ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ число, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму. Π£ этой ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число Ρ†ΠΈΡ„Ρ€.


Π‘Π±ΠΎΡ€ΠΊΠΈ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal

Π‘Π±ΠΎΡ€ΠΊΠ° являСтся Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ программирования Π½Π° Π‘#. Она прСдставляСт собой ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащих всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ свСдСния ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π΅Π΅ вСрсии. Π‘Π±ΠΎΡ€ΠΊΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ основу срСды .NET. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ для Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ взаимодСйствия ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΌΠ΅ΠΆΡŠΡΠ·Ρ‹ΠΊΠΎΠ²ΠΎΠΉ возмоТности взаимодСйствия ΠΈ управлСния вСрсиями. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сборки ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Π‘Π±ΠΎΡ€ΠΊΠ° состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» прСдставляСт собой Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ сборки. ДСкларация содСрТит свСдСния ΠΎ самой сборкС. К этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ относится, Π² частности, имя сборки, Π½ΠΎΠΌΠ΅Ρ€ Π΅Π΅ вСрсии, свСдСния ΠΎ соотвСтствии Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΡƒΠ»ΡŒΡ‚ΡƒΡ€Π½ΠΎΠΉ срСды (язык ΠΈ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ стандарты). Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Π΄Π΅Π» сборки содСрТит ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠΎΠ², Ρ‚.Π΅. свСдСния ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π‘Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… прСимущСств ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠΎΠ² ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΡŠΡΠ·Ρ‹ΠΊΠΎΠ²ΠΎΠΉ возмоТности взаимодСйствия. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» сборки содСрТит ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ MSIL (Microsoft Intermediate Language β€” ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΠΈ Microsoft). И Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» сборки содСрТит рСсурсы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ.

ΠŸΡ€Π°Π²Π΄Π°, ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° C# сборки ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ автоматичСски, трСбуя ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ лишь ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… усилий. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ исполняСмый Ρ„Π°ΠΉΠ», создаваСмый Π²ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘#, Π½Π° самом Π΄Π΅Π»Π΅ прСдставляСт собой сборку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ исполняСмый ΠΊΠΎΠ΄ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° компилируСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Π‘#, сборка получаСтся автоматичСски.

Π£ сборок имССтся ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… особСнностСй, ΠΈ с Π½ΠΈΠΌΠΈ связано Π½Π΅ΠΌΠ°Π»ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… вопросов программирования, Π½ΠΎ, ΠΊ соТалСнию, ΠΈΡ… обсуТдСниС Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ этой ΠΊΠ½ΠΈΠ³ΠΈ. Π’Π΅Π΄ΡŒ сборки ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ процСсса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π² срСдС .NET, Π½ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ относятся ΠΊ срСдствам языка Π‘#. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² C# имССтся ΠΎΠ΄Π½ΠΎ срСдство, нСпосрСдствСнно связанноС со сборкой. Π­Ρ‚ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal, рассматриваСмый Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.


ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа internal

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

Для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ динамичСской ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π² C# прСдусмотрСны Ρ‚Ρ€ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слова: 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");

  }

}


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