Рекомендації по розробці бібліотеки класів

Для підтримки широкого діапазону функціональних можливостей
керована середовище. NET Framework надає розробникам можливість
удосконалювати модель програмування. Завданням рекомендацій щодо
розробці бібліотек для. NET Framework є підтримка
сумісності та передбачуваності відкритих членів API разом з
забезпеченням можливості Web і міжмовної інтеграції. Наполегливо
рекомендується дотримуватися цих рекомендацій при розробці класів і
компонентів, що розширюють можливості. NET Framework. Несумісна
розробка несприятливо впливає на продуктивність розробника.
Інструментальні засоби розробки і доповнення можуть перетворити
деякі з цих рекомендацій у розпорядчі правила де факто і
зменшити кількість несогласующихся компонентів. Несогласующихся
компоненти будуть функціонувати, але не на повну їх потужність.

 

Рекомендації покликані допомогти розробникам бібліотеки класів вирішити
проблему вибору між різними рішеннями. Можливі ситуації, в яких
для створення хорошої бібліотеки вам буде потрібно знехтувати цими
рекомендаціями розробки. Такі випадки мають бути рідкісні, і важливо,
щоб те чи інше рішення було строго обгрунтовано. У цьому розділі
представлені рекомендації щодо присвоюванню імен та використання типів у
. NET Framework, а також рекомендації щодо реалізації загальних схем
розробки.

Взаємозв'язок між Загальною системою типів і Загальномовні специфікацією

Загальна система типів – це модель, яка визначає правила, яким
слід загальномовне середовище виконання при оголошенні, використанні і
управлінні типами. Загальна система типів встановлює оболонку, яка
робить можливою міжмовну інтеграцію, безпеку типів і
високопродуктивне виконання коду. Це сировина, з якої створюються
бібліотеки класів.

 

Загальномовне специфікація (CLS) визначає ряд програмно
контрольованих правил, які регулюють взаємодію типів,
створених на різних мовах програмування. Орієнтація на CLS –
прекрасний спосіб забезпечення можливості міжмовного взаємодії.
Розробники керованої бібліотеки класів можуть використовувати CLS,
щоб гарантувати можливість роботи їх API з різними мовами
програмування. Зверніть увагу, що хоча CLS і сприяє
розробці хорошої бібліотеки, вона не гарантує її. Більш докладно
дивіться в розділі MSDN Writing CLS-Compliant Code.

 

При виборі того, які властивості включати до бібліотеки класів, ви
повинні дотримуватися двох основоположним принципам по відношенню до CLS:

  1. Визначте чи сприяє властивість того, щоб тип розробки
    API, відповідав керованого простору.

    Щоб забезпечити можливість писати будь-яку керовану бібліотеку,
    CLS повинна бути досить багатою. Однак, якщо ви забезпечуєте
    безліч способів вирішення однієї і тієї ж задачі, користувачі вашої
    бібліотеки класів можуть заплутатися при виборі шляху розробки і
    використання. Наприклад, пропонуючи одночасно безпечні і
    небезпечні структурні компоненти ви ставите користувача перед
    вибором, які з них використовувати. Тому, CLS сприяє
    коректному використання, пропонуючи лише структурні компоненти з
    безпечними типами.

     

  2. Визначте чи викликає розкриття можливості складності у
    компілятора

    Всім мовам програмування знадобитися деяка модифікація
    для того, щоб націлити їх на час виконання і загальну систему
    типів. Однак, щоб зробити мову CLS-сумісним, розробникам не
    знадобитися робити велику кількість додатково роботи. Мета
    CLS – бути наскільки можливо маленькою, пропонуючи багатий вибір
    типів даних і властивостей.

Рекомендації по присвоюванню імен

Послідовна схема привласнення імен є одним з найбільш
важливих елементів передбачуваності і ясності у керованій бібліотеці
класів. Широке використання і розуміння цих принципів має
усунути багато хто з найбільш часто виникаючих питань користувачів. У
цьому розділі представлені принципи присвоєння імен для типів. NET
Framework. Для кожного типу також необхідно звернути увагу на
деякі загальні правила, що стосуються застосування заголовних букв,
чутливості до регістру і вибору слова.

Застосування великих літер

При використанні великих літер в ідентифікаторах користуйтеся
наступними трьома угодами.

Pascal нотація

Перша літера в ідентифікаторі і перша буква кожного наступного
з'єднаного слова великі. Ви можете використовувати стиль Pascal для
ідентифікаторів, що складаються з трьох і більше символів. Наприклад:

BackColor

Camel нотація

Перша літера ідентифікатора в нижньому регістрі, а перша літера кожного
подальшого з'єднаного слова прописна. Наприклад:

backColor

Врехней регістр

Всі букви ідентифікатора великі. Використовуйте нотацію тільки для
ідентифікаторів, що складаються з двох і менше літер. Наприклад:

System.IO
System.Web.UI

Ви також повинні використовувати заголовні букви в ідентифікаторах для
того, щоб зберігати сумісність з існуючими символьними схемами,
в яких символи верхнього регістру часто використовуються для перерахувань
і постійних значень. Загалом, ці символи не повинні бути видимими поза
збірки, що використовує їх.

У наступній таблиці зібрані правила застосування заголовних букв і
наведені приклади різних типів ідентифікаторів.

 

Ідентифікатор Регістр Приклад
Class Pascal AppDomain
Enum type Pascal ErrorLevel
Enum values Pascal FatalError
Event Pascal ValueChange
Exception class Pascal WebException
Примітка: завжди закінчується суфіксом Exception.
Read-only Static field Pascal RedValue
Interface Pascal IDisposable
Примітка: завжди починається з префікса I.
Method Pascal ToString
Namespace Pascal System.Drawing
Parameter Camel typeName
Property Pascal BackColor
Protected instance field Camel redValue
Примітка: Рідко використовується. У властивості
переважніше застосовувати protected instance field.
Public instance field Pascal RedValue
Примітка: Рідко використовується. У властивості
переважніше застосовувати public instance field.

Чутливість до регістру

Щоб уникнути плутанини і гарантувати можливість міжмовного
взаємодії, дотримуйтесь цих правил, що стосуються використання
чутливості до регістру:

Абревіатури

Щоб уникнути плутанини і гарантувати можливість міжмовного
взаємодії, при використанні абревіатур дотримуйтесь правил:

Вибір слова

Уникайте використання імен класів, які дублюють загальноприйняті
простору імен. NET Framework. Наприклад, не використовуйте як
імен класів наступні імена: System, Collections, Forms або UI. Список
імен, що використовуються в. NET Framework, наведений у розділі Class Library.

Крім того, уникайте використання ідентифікаторів, яка конфліктує з
наступними ключовими словами:

 

AddHandler AddressOf Alias And Ansi
As Assembly Auto Base Boolean
ByRef Byte ByVal Call Case
Catch CBool CByte CChar Cdate
CDec CDbl Char CInt Class
CLng CObj Const CShort CSng
CStr CType Date Decimal Declare
Default Delegate Dim Do Double
Each Else ElseIf End Enum
Erase Error Event Exit ExternalSource
False Finalize Finally Float For
Friend Function Get GetType Goto
Handles If Implements Imports In
Inherits Integer Interface Is Let
Lib Like Long Loop Me
Mod Module MustInherit MustOverride MyBase
MyClass Namespace New Next Not
Nothing NotInheritable NotOverridable Object On
Option Optional Or Overloads Overridable
Overrides ParamArray Preserve Private Property
Protected Public RaiseEvent ReadOnly ReDim
Region REM RemoveHandler Resume Return
Select Set Shadows Shared Short
Single Static Step Stop String
Structure Sub SyncLock Then Throw
To True Try TypeOf Unicode
Until volatile When While With
WithEvents WriteOnly Xor eval extends
instanceof package Var    

Попередження плутанину з іменами типів

Різні мови програмування використовують різні терміни для
позначення фундаментальних керованих типів. Розробники бібліотеки
класів повинні уникати використання термінології, специфічної для
конкретної мови. Для запобігання плутанини з іменами типів,
дотримуйтесь правил, наведених в цьому розділі.

Використовуйте імена, що описують значення типу, а не тип. У рідкісних
випадках, коли тип параметра не має семантичного значення,
використовуйте загальне ім'я. Наприклад, клас, що підтримує запис різних
типів даних у потік, може мати такі методи.

void Write(double value);
void Write(float value);
void Write(long value);
void Write(int value);
void Write(short value);

Не створюйте мова-специфічні імена методів, як у наступному
прикладі.

void Write(double doubleValue);
void Write(float floatValue);
void Write(long longValue);
void Write(int intValue);
void Write(short shortValue);

У надзвичайно рідкісних випадках, коли необхідно створити метод з
унікальним ім'ям для кожного основного типу даних, використовуйте
універсальні імена типів. У наступній таблиці наведено основні імена
типів даних та їх універсальні заміщення.

 

Ім'я типу C # Ім'я типу Visual Basic Ім'я типу JScript Ім'я типу Visual C + + Ilasm.exe уявлення Універсальне ім'я типу
sbyte SByte sByte char int8 SByte
byte Byte byte unsigned char unsigned int8 Byte
short Short short short int16 Int16
ushort UInt16 ushort unsigned short unsigned int16 UInt16
int Integer int int int32 Int32
uint UInt32 uint unsigned int unsigned int32 UInt32
long Long long __int64 int64 Int64
ulong UInt64 ulong unsigned __int64 unsigned int64 UInt64
float Single float float float32 Single
double Double double double float64 Double
bool Boolean boolean bool bool Boolean
char Char char wchar_t Char Char
string String string String string String
object Object object Object object Object

Наприклад, клас, що підтримує читання різних типів даних з
потоку, може мати такі методи.

double ReadDouble();
float ReadSingle();
long ReadInt64();
int ReadInt32();
short ReadInt16();

Використання імен з попереднього прикладу більш переважно, ніж
використання наступних мова-специфічних імен:

double ReadDouble();
float ReadFloat();
long ReadLong();
int ReadInt();
short ReadShort();

Рекомендації по присвоюванню імені простору імен

Загальним правилом при присвоєнні імен просторів імен є
використання поєднання імені компанії, назви технології, feature і
design (необов'язково).

CompanyName.TechnologyName[.Feature][.Design]

Наприклад:

Microsoft.Media
Microsoft.Media.Design

Використання імені компанії або іншої твердо усталеним марки в
як префікс в імені простору імен оберігає від можливості
появи двох просторів імен з однаковими іменами. Наприклад,
Microsoft.Office – префікс, відповідний класам Office Automation,
поставляється компанією Microsoft.

Використовуйте незмінне, впізнаване назва технології на другому
рівні ієрархічного імені. Використовуйте ієрархію організації, як
основу для ієрархії простору імен. Додайте до імені простору
імен, що містить типи, які забезпечують функціональність часу
розробки для основного простору імен, суфікс. Design. Наприклад,
простір імен System.Windows.Forms.Design містить дизайнери і
класи, використовувані для розробки додатків, заснованих на
System.Windows.Forms.

Вкладені простору імен повинні мати залежність від типів
містить їх простору імен. Наприклад, класи в
System.Web.UI.Design залежать від класів у System.Web.UI. Однак класи в
System.Web.UI не залежать від класів у System.UI.Design.

Ви повинні використовувати Pascal нотацію для просторів імен і
окремі логічні компоненти з точками, наприклад, як
Microsoft.Office.PowerPoint. Якщо ваша торгова марка використовує
нетрадиційну нотацію, використовуйте цю нотацію, навіть якщо вона
відхиляється від запропонованого до використання Pascal нотації. Наприклад,
простору імен NeXT.WebObjects і ee.cummings ілюструють
відповідні відхилення від правил Pascal нотації.

Використовуйте імена простору імен в множині, якщо це
семантично підходить. Наприклад, краще використовувати ім'я
System.Collections, ніж System.Collection. Винятком з цього правила
є імена торгових марок і абревіатури. Наприклад, краще
використовувати System.IO, а не System.IOs.

Не використовуйте однакові імена для класу і простору імен.
Наприклад, не створюйте і простір імен Debug, і клас Debug.

І на закінчення, зверніть увагу, що ім'я простору імен не
обов'язково повинно дублювати ім'я збірки. Наприклад, якщо ви називаєте
збірку MyCompany.MyTechnology.dll, це не означає що вона повинна
містити простір імен MyCompany.MyTechnology.

Рекомендації по присвоюванню імен класів

Ось основні рекомендації щодо присвоюванню імен класів:

Далі наведено приклади правильно названих класів.

public class FileStream
public class Button
public class String

Рекомендації по присвоюванню імен інтерфейсів

Тут наведені основні рекомендації щодо присвоюванню імен
інтерфейсах:

Далі наведено приклади коректних імен інтерфейсів.

public interface IServiceProvider
public interface IFormatable

Наступний приклад коду демонструє, як визначити інтерфейс
IComponent і його стандартну реалізацію, клас Component.

public interface IComponent 
{
...
}
public class Component: IComponent 
{
...
}

Рекомендації по присвоюванню імен атрибутів

Ви завжди повинні додавати суфікс Attribute до імен спеціальних
класів атрибутів. Нижче наведено приклад коректного імені класу
атрибута.

public class ObsoleteAttribute{}

Рекомендації по присвоюванню імен перераховуються типам

Перераховується тип успадковується від класу Enum. Ось основні
рекомендації по присвоюванню імен перераховуються типами:

Рекомендації по присвоюванню імен статичним полях

При присвоєнні імен статичним полях керуйтеся наступними
рекомендаціями:

Рекомендації по присвоюванню імен параметрами

Далі наведені основні рекомендації щодо присвоюванню імен
параметрами:

Далі наведено приклади коректних імен параметрів.

Type GetType(string typeName)
string Format(string format, args() As object)

Рекомендації по присвоюванню імен методам

Основні рекомендації по присвоюванню імен методам наступні:

Далі наведено приклади коректних імен методів.

RemoveAll()
GetCharArray()
Invoke()

Рекомендації по присвоюванню імен властивостями

Основні рекомендації по присвоюванню імен властивостям наступні:

У наступному прикладі коду продемонстровано коректне присвоювання
імен властивостями.

public class SampleClass
{
   public Color BackColor 
   {
      // Code for Get and Set accessors goes here.
   }
}

У наступному прикладі коду наведено властивість, яка має таке ж ім'я,
як і ім'я його типу.

public enum Color 
{
   // Insert code for Enum here.
}
public class Control 
{
   public Color Color 
   { 
      get {// Insert code here.} 
      set {// Insert code here.} 
   }
}

Далі слід приклад неправильного присвоювання імені, бо
властивості типу Integer присвоєно ім'я Color.

public enum Color {// Insert code for Enum here.}
public class Control 
{
   public int Color 
   { 
      get {// Insert code here.} 
      set {// Insert code here.}  
   }
}

В останньому прикладі неможливо звернутися до членів перерахування
Color. Color.Xxx буде інтерпретовано, як звернення до члена, який
спочатку отримує значення властивості Color (типу Integer в Visual Basic
або типу int в C #), а потім звертається до члена, що має таке значенням
(Який повинен бути окремим членом System.Int32).

Рекомендації по присвоюванню імен подій

Нижче наведені основні рекомендації щодо присвоюванню імен подій:

Наступний приклад ілюструє обробник події з відповідними
ім'ям і параметрами.

public delegate void MouseEventHandler (object sender, MouseEventArgs e);

Наступний приклад ілюструє клас аргументу події з коректним
ім'ям.

public class MouseEventArgs : EventArgs 
{
   int x;
   int y;
   public MouseEventArgs(int x, int y) 
      { this.x = x; this.y = y; }
   public int X { get { return x; } } 
   public int Y { get { return y; } } 
}

Рекомендації по використанню членів класу

У цьому розділі запропоновано рекомендації щодо використання членів класу
в бібліотеках класів.

Рекомендації з використання властивостей

Визначте, що більше підходить для здійснення ваших вимог,
властивість чи метод. Більш докладно про відмінності між властивостями і
методами розказано в частині Властивості і методи цього розділу.

Виберіть ім'я для властивості на основі рекомендацій, наведених у
розділі Принципи присвоєння імен властивостями. Не створюйте властивість із
таким же ім'ям, як і у існуючого типу, це обумовлює
неоднозначності в деяких мовах програмування. Наприклад,
System.Windows.Forms.Control має властивість кольору. Оскільки також існує
і структура Color, властивість кольору в System.Windows.Forms.Control названо
BackColor. Це ім'я більш виразне і не конфліктує з ім'ям
структури Color.

Можливі ситуації, в яких вам доведеться порушити це правило.
Наприклад, клас System.Windows.Forms.Form містить властивість Icon
незважаючи на те, що в. NET Framework також існує клас Icon. Це
ім'я використано тому, що Form.Icon більш відкрите і зрозуміле ім'я для
властивості, ніж Form.FormIcon або Form.DisplayIcon.

При організації доступу до властивості через аксессор set, збережіть
значення властивості до того, як змініть його. Це забезпечить збереження
даних у випадку, якщо в аксессоре set виникне виняткова ситуація.

Питання стану властивості

Дозволено визначення властивостей в будь-якому порядку. Властивості не повинні
мати стану в залежності від інших властивостей. Дуже поширена
ситуація, коли окрема властивість об'єкта не набуває чинності до тих
пір, поки розробник не визначить певний набір властивостей, або до
тих пір, поки об'єкт знаходиться в певному стані. Поки об'єкт в
відповідному стані, властивість неактивно. Як тільки об'єкт змінює
стан, властивість автоматично активується без необхідності
відкритого запиту. Семантика аналогічна незалежно від порядку, в якому
розробник визначає значення властивостей, або від того, як розробник
переводить об'єкт в активний стан.

Наприклад, елемент управління TextBox може мати два взаємопов'язаних
властивості: DataSource і DataField. DataSource визначає ім'я таблиці, а
DataField – ім'я стовпця. Як тільки обидві властивості визначені, елемент
управління може автоматично зв'язувати дані таблиці з властивістю
Text. Наступний приклад коду ілюструє властивості, які можуть
задаватися в будь-якому порядку:

TextBox t = new TextBox();
t.DataSource = "Publishers";
t.DataField = "AuthorID";
// The data-binding feature is now active.

Ви можете визначити властивості DataSource і DataField в будь-якому порядку.
Таким чином, наступний код еквівалентний попередньому:

TextBox t = new TextBox();
t.DataField = "AuthorID";
t.DataSource = "Publishers";
// The data-binding feature is now active.

Можна також присвоїти властивості значення null (Nothing в Visual
Basic), щоб позначити, що значення не визначено.

TextBox t = new TextBox();
t.DataField = "AuthorID";
t.DataSource = "Publishers";
// The data-binding feature is now active.
t.DataSource = null;
// The data-binding feature is now inactive.

Наступний приклад ілюструє, як відслідковувати стан здібності
зв'язування даних і автоматично активувати або деактивувати його в
відповідний час.

public class TextBox
{
   string dataSource;
   string dataField;
   bool active;

   public string DataSource
   {   
      get
      {
         return dataSource;
      }
      set
      {
         if (value != dataSource)
         {
/ / Set the property value first, in case activate fails.
            dataSource = value;                
            // Update active state.
SetActive (dataSource! = Null & & dataField! = Null);
         }
      }
      }
      
   public string DataField
   {
      get
      {
         return dataField;
      }
      set
      {
         if (value != dataField)
         {
/ / Set the property value first, in case activate fails.
            dataField = value;              
            // Update active state.
SetActive (dataSource! = Null & & dataField! = Null);
         }
      }
   }   
   void SetActive(Boolean value)
   {
      if (value != active)
      {
         if (value)
         {
            Activate();
            Text = dataBase.Value(dataField);
         }
         else
         {
            Deactivate();
            Text = "";
         }
         // Set active only if successful.
         active = value; 
      }
   }
   void Activate()
   {
      // Open database.
   }
      
   void Deactivate()
   {
      // Close database.
   }
}

У попередньому прикладі даний вираз визначає, чи знаходиться об'єкт
в стані, в якому можливість зв'язуватися даних може
самоактівіроваться:

dataSource != null && dataField != null

Ви робите активацію автоматичної, створюючи метод, який
визначає можливість активації об'єкта, виходячи з його поточного
стану, і потім активує його, якщо це необхідно.

void UpdateActive()
{
   SetActive(dataSource != null && dataField != null);
}

Якщо у вас є взаємопов'язані властивості, такі як DataSource і
DataMember, ви повинні реалізувати інтерфейс ISupportInitialize. Це
дозволить розробнику (або користувачеві) викликати методи
ISupportInitialize.BeginInit і ISupportInitialize.EndInit при
визначенні безлічі властивостей, щоб дати можливість компоненту
надавати оптимізації. У прикладі, наведеному вище,
ISupportInitialize може запобігти непотрібні спроби доступу до бази
даних до тих пір поки установка не завершена коректно.

Вираз, що з'являється в цьому методі, позначає, які частини моделі
об'єкта повинні бути перевірені, щоб здійснювати ці переходи з одного
стану в інший. У цьому випадку чинять впливу властивості DataSource
і DataField. Більш детальна інформації про вибір між властивостями і
методами представлена в розділі Властивості і методи.

Виклик подій зміни властивості

Події зміни властивостей повинні викликатися для компонентів, якщо треба
повідомляти споживачів про програмне зміні властивості компонента. За
угоди про присвоєнні імен імена подій зміни властивості
формуються з імені властивості і суфікса Changed, як TextChanged.
Наприклад, елемент управління викликає подія TextChanged, коли
змінюється його властивість text. Щоб викликати цю подію, можна
використовувати protected допоміжну процедуру Raise <Property> Changed.
Однак, можливо, не варто викликати подія зміни властивості для
додавання елемента хеш-таблиці, тому що це тягне за собою зайві витрати
продуктивності. Наступний приклад ілюструє реалізацію
допоміжної процедури для події події зміни властивості.

class Control: Component
{
   string text;
   public string Text
   { 
      get
      { 
         return text; 
      }
      set
      {
         if (!text.Equals(value))
         {
            text = value;
            RaiseTextChangedEvent();
         }
      }
   }
}

При зв'язуванні даних цей шаблон використовується для того, щоб
забезпечити можливість двостороннього зв'язування властивості. Без подій
<Property> Changed і Raise <Property> Changed зв'язування даних працює в
одному напрямку: якщо змінюється база даних, властивість оновлюється.
Кожна властивість, що викликає подія <Property> Changed, повинно
надавати метадані для підтвердження того, що властивість
підтримує зв'язування даних.

Рекомендується викликати події відбувається / стався зміни,
якщо значення властивості змінюється в результаті зовнішніх втручань. Ці
події показують розробнику, що значення властивості змінюється або
змінилося в результаті операції, а не через виклик методів об'єкта.

Гарним прикладом у даному випадку є властивість Text елемента
управління Edit. У міру того як користувач записує інформацію в
елемент управління, значення властивості автоматично змінюється. Подія
викликається до того, як значення властивості змінилося. Воно не передає
старий чи новий значення, і розробник може скасувати подія,
сформувавши виняткову ситуацію. Ім'я події складається з імені
властивості і суфікса Changing. Далі наведено приклад події
відбувається зміни.

class Edit : Control 
{
   public string Text 
   { 
      get 
      { 
         return text; 
      }
      set 
      {
         if (text != value) 
         {
            OnTextChanging(Event.Empty);
            text = value;
         }
      }
   }
}

Подія також викликається після того, як значення властивості вже
змінилося. Ця подія не може бути скасовано. Ім'я події формується
з імені властивості і суфікса Changed. Також повинна викликатися
характерне подія PropertyChanged. Шаблоном для виклику цих подій
є виклик особливої події з методу OnPropertyChanged. Наступний
приклад ілюструє використання методу OnPropertyChanged.

class Edit : Control 
{
   public string Text 
   {
      get 
      { 
         return text; 
      }
      set 
      {
         if (text != value) 
         {
            OnTextChanging(Event.Empty);
            text = value;
            RaisePropertyChangedEvent(Edit.ClassInfo.text);
         }
      }
   }

   protected void OnPropertyChanged(PropertyChangedEvent e) 
   {
      if (e.PropertyChanged.Equals(Edit.ClassInfo.text))
         OnTextChanged(Event.Empty);
      if (onPropertyChangedHandler != null)
         onPropertyChangedHandler(this, e);
   }
}

Можливі ситуації, коли базове значення властивості не зберігається як
полі, що ускладнює відстеження змін значення. При виклику події
відбувається зміни знайдіть всі місця, на які вплине
зміна значення події, і забезпечте можливість скасувати подія.
Наприклад, попередній приклад елемента керування Edit не цілком
правильний, тому що значення Text насправді зберігається в
описувач вікна (HWND). Для виклику події TextChanging ви повинні
перевірити повідомлення Windows, щоб визначити, коли може змінитися
текст, і передбачити появу виняткової ситуації в
OnTextChanging, щоб скасувати подія. Якщо забезпечити подія
відбувається зміни надто складно, розумно буде підтримувати
тільки подія сталася зміни.

Властивості і методи

Розробники бібліотеки класів часто повинні приймати рішення про
тому, як реалізувати член класу, як властивість або як метод. Наступні
рекомендації допоможуть вам зробити правильний вибір.

Type type = // Get a type.
for (int i = 0; i < type.Methods.Length; i++)
{
   if (type.Methods[i].Name.Equals ("text"))
   {
      // Perform some operation.
   }
}

Наступний приклад ілюструє правильне застосування властивостей і
методів.

class Connection
{
   // The following three members should be properties
   // because they can be set in any order.
   string DNSName {get{};set{};}
   string UserName {get{};set{};}
   string Password {get{};set{};}

   // The following member should be a method
   // because the order of execution is important.
   // This method cannot be executed until after the 
   // properties have been set.
   bool Execute ();
}

Властивості тільки для читання і тільки для запису

Ви повинні використовувати властивості тільки для читання тоді, коли
користувач не може змінювати логічні члени даних властивості. Чи не
використовуйте властивості тільки для запису.

Використання індексованих властивостей

Наступні правила описують основні принципи використання
індексованих властивостей:

// Change the MethodInfo Type.Method property to a method.
MethodInfo Type.Method[string name]
MethodInfo Type.GetMethod (string name, Boolean ignoreCase)
// The MethodInfo Type.Method property is changed to
// the MethodInfo Type.GetMethod method.
MethodInfo Type.GetMethod(string name)
MethodInfo Type.GetMethod (string name, Boolean ignoreCase)

Рекомендації по використанню подій

Тут наведені основні рекомендації щодо використання подій:

Рекомендації щодо використання методів

Тут наведені основні рекомендації щодо використання методів:

Рекомендації з перезавантаження методів

Перезавантаження методу відбувається тоді, коли клас містить два методи
з однаковими іменами, але різними сигнатурами. У цьому розділі наведені
деякі принципи використання перезавантаженням методів.