Атрибути є позначками, що використовуються програмістом для передачі декларативної інформації. Приймачем інформації може бути інструментальне середовище, програма-конструктор, аналізатор програмного коду або інший програмний інструмент. Процес читання інформації атрибутів називається рефлексією.
Атрибути беруться в квадратні дужки і можуть встановлюватися для класів, членів класів, аргументів та інших елементів програми. Приклад використання атрибутів:
[CodeReview("l/l/199", Comment="Rockin")]
class Test
{
…
}
10.2.4 Робота з версіями
За рівнем підтримки версій мова С# перевершує мову C++. Оскільки середовище управляє розташуванням членів класів в пам'яті, сумісність на двійковому рівні проблем не викликає. При необхідності середовище забезпечує паралельні версії компонентів і стежить за правильністю семантики при роботі з різними версіями бібліотек класів, а сама мова С# дозволяє програмісту вибирати потрібні версії.
10.2.5 Організація програм
В мові С# немає заголовних файлів. Хоча умовний виклик функцій реалізований на рівні препроцесора, макроси заміни тексту не підтримуються. Ці обмеження одночасно спрощують і прискорюють процес аналізу коду С# компілятором, а також покращують читабельність програм С# в середовищі розробки.
Крім того, в С# не існує випереджаючих оголошень. Порядок розміщення оголошень класів в початкових файлах не важливий; оголошення класів можна довільно переставляти за своїм бажанням.
10.2.6 Відсутні в мові C# елементи
Нижче перелічені ті елементи C++, яких немає в мові С#:
- множинне спадкування;
- константні функції класів і аргументи (константні змінні класів підтримуються);
- глобальні змінні;
- typedef;
- приведення при конструюванні;
- значення за умовчанням для аргументів функцій.
В порівнянні з С# модель Visual C++ надає програмісту більше можливостей, оскільки користувач може створювати як керовані об'єкти, що автоматично знищуються в процесі збирання сміття, так і некеровані об'єкти, видалення яких з пам'яті проводиться тільки за допомогою інструкції delete.