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

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

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

[AttributeUsage(AttributeTargets.All)] public class RemarkAttribute : Attribute {

string pri_remark; // Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ свойства Remark

// Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, public string Supplement;

public RemarkAttribute(string comment) { pri_remark = comment;

Supplement = "ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚";

}

public string Remark { get {

return pri_remark;

}

}

}

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠΎΠ»Π΅ Supplement инициализируСтся Π² конструкторС символьной строкой "ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚". Π”Ρ€ΡƒΠ³ΠΎΠ³ΠΎ способа ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² конструкторС Π½Π΅ сущСствуСт. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»Π΅ Supplement являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ Π² классС RemarkAttribute, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

[RemarkAttribute("Π’ этом классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.",

Supplement = "Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация.")] class UseAttrib {

// ...

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π·ΠΎΠ² конструктора класса RemarkAttribute. Π’ этом конструкторС ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, указываСтся ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π° Π·Π° Π½ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ слСдуСт ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Supplement, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присваиваСтся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ скобка, ), Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² конструкто-, Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ инициализируСтся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ конструктора. Π­Ρ‚ΠΎΡ‚ синтаксис ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ: ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² конструкторС, Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ β€” Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС ΠΈ вмСстС с присваиваСмыми ΠΈΠΌ значСниями.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ дСмонстрируСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ поля Supplement Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°.

using System;

using System.Reflection;

[AttributeUsage(AttributeTargets.All)] public class RemarkAttribute : Attribute {

string pri_remark; // Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ свойства Remark

public string Supplement; // это ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

public RemarkAttribute(string comment) { pri_remark = comment;

Supplement = "ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚";

}

public string Remark { get {

return pri_remark;

}

}

}

[RemarkAttribute("Π’ этом классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.",

Supplement = "Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация.")] class UseAttrib {

// ...

}

class NamedParamDemo { static void Main() {

Type t = typeof(UseAttrib);

Console.Write("Атрибуты Π² классС " + t.Name + ": "); object[] attribs = t.GetCustomAttributes(false); foreach(object ΠΎ in attribs) {

Console.WriteLine (o);

}

// Π˜Π·Π²Π»Π΅Ρ‡ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ RemarkAttribute.

Type tRemAtt = typeof(RemarkAttribute);

RemarkAttribute ra = (RemarkAttribute)

Attribute.GetCustomAttribute(t, tRemAtt);

Console.Write("ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ");

Console.WriteLine(ra.Remark);

Console.Write("Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: ") ;

Console.WriteLine(ra.Supplement);

}

}

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Атрибуты Π² классС UseAttrib: RemarkAttribute ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ этом классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ вопросу, слСдуСт особо ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ pri_remark нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ

Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎ Π² классС RemarkAttribute. Бвойство Remark Ρ‚Π°ΠΊΠΆΠ΅ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. Напомним, Ρ‡Ρ‚ΠΎ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ поля ΠΈ свойства.

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ ΠΈ доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния свойство ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ автоматичСски Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠΎΠ΅ свойство Priority Ρ‚ΠΈΠΏΠ° int вводится Π² класс RemarkAttribute.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойство Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°.

using System;

using System.Reflection;

[AttributeUsage(AttributeTargets.All)] public class RemarkAttribute : Attribute {

string pri_remark; // Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ свойства Remark

public string Supplement; // это ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

public RemarkAttribute(string comment) { pri_remark = comment;

Supplement = "ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚";

Priority = 1;

}

public string Remark { get {

return pri_remark;

}

}

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойство Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, public int Priority { get; set; }

}

[RemarkAttribute("Π’ этом классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.",

Supplement = " Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация.",

Priority = 10)] class UseAttrib {

// ...

}

class NamedParamDemo { static void Main() {

Type t = typeof(UseAttrib);

Console.Write("Атрибуты Π² классС " + t.Name + ": ");

object[] attribs = t.GetCustomAttributes(false); foreach(object ΠΎ in attribs) {

Console.WriteLine(o);

// Π˜Π·Π²Π»Π΅Ρ‡ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ RemarkAttribute.

Type tRemAtt = typeof(RemarkAttribute);

RemarkAttribute ra = (RemarkAttribute)

Attribute.GetCustomAttribute(t, tRemAtt);

Console.Write("ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ") ;

Console.WriteLine(ra.Remark);

Console.Write("Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: ") ;

Console.WriteLine(ra.Supplement);

Console.WriteLine("ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚: " + ra.Priority);

}

}

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

Атрибуты Π² классС UseAttrib: RemarkAttribute ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ этом классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация.

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚: 10

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π° сСбя Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ порядок указания Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ классом UseAttrib, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

[RemarkAttribute("Π’ этом классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.",

Supplement = " Π­Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация.",

Priority = 10)] class UseAttrib {

// ...

}

Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Supplement ΠΈ Priority Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ порядкС. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ ΠΈΡ… указания ΠΌΠΎΠΆΠ½ΠΎ свободно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π½Π΅ мСняя сами Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

И послСднСС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° (ΠΊΠ°ΠΊ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· встроСнных простых Ρ‚ΠΈΠΏΠΎΠ², object, Π’ΡƒΡ€Π΅, пСрСчислСниСм ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌ массивом ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· этих Ρ‚ΠΈΠΏΠΎΠ².

ВстроСнныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

Π’ C# прСдусмотрСно нСсколько встроСнных Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π½ΠΎ Ρ‚Ρ€ΠΈ ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅ΡŽΡ‚ особоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² самых Ρ€Π°Π·Π½Ρ‹Ρ… ситуациях. Π­Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ AttributeUsage, Conditional ΠΈ Obsolete, рассматриваСмыС Π΄Π°Π»Π΅Π΅ ΠΏΠΎ порядку.

Атрибут AttributeUsage

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ AttributeUsage опрСдСляСт Ρ‚ΠΈΠΏΡ‹ элСмСнтов, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. AttributeUsage β€” это, ΠΏΠΎ сущСству, Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ класса System. AttributeUsageAttribute. Π£ Π½Π΅Π³ΠΎ имССтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ конструктор:

AttributeUsage(AttributeTargets validOn)

Π³Π΄Π΅ validOn ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько элСмСнтов, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ AttributeTargets β€” пСрСчислСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ значСния.

АН

Assembly

Class

Constructor

Delegate

Enum

Event

Field

GenericParameter

Interface

Method

Module

Parameter

Property

ReturnValue

Struct

Π”Π²Π° этих значСния ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π˜Π›Π˜. НапримСр, для указания Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, примСняСмого Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ полям ΠΈ свойствам, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния.

AttributeTargets.Field I AttributeTargets.Property

Π’ классС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° AttributeUsage ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ… являСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ AllowMultiple, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истинно, Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ элСмСнту Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Inherited, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истинно, Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ наслСдуСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ классами, Π° ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½ Π½Π΅ наслСдуСтся. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ AllowMultiple ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π»ΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (false), Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Inherited β€” истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (true).

Π’ классС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° AttributeUsage опрСдСляСтся Ρ‚Π°ΠΊΠΆΠ΅ доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния свойство ValidOn. Оно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° AttributeTargets, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ Ρ‚ΠΈΠΏΡ‹ элСмСнтов, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AttributeTargets .All.