Відповідно до Документації StyleCop:
SA1200: ВикористанняDirectivesMustBePlacedWithinNamespace
Причина AC # за допомогою директиви розміщується поза елементом простору імен.
Опис правила Порушення цього правила відбувається, коли використовуюча директива або директива використання псевдоніма розміщується поза елементом простору імен, якщо тільки файл не містить елементів простору імен.
Наприклад, наступний код призведе до двох порушень цього правила.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
Наступний код, однак, не призведе до порушень цього правила:
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
Цей код буде складено чисто, без помилок компілятора. Однак незрозуміло, яка версія типу Guid виділяється. Якщо директива використання буде переміщена всередині простору імен, як показано нижче, станеться помилка компілятора:
namespace Microsoft.Sample
{
using Guid = System.Guid;
public class Guid
{
public Guid(string s)
{
}
}
public class Program
{
public static void Main(string[] args)
{
Guid g = new Guid("hello");
}
}
}
Код не вдається в наступній помилці компілятора, знайденій у рядку, що містить Guid g = new Guid("hello");
CS0576: Простір імен "Microsoft.Sample" містить визначення, що суперечить псевдоніму "Guid"
Код створює псевдонім типу System.Guid під назвою Guid, а також створює власний тип під назвою Guid з інтерфейсом відповідного конструктора. Пізніше код створює екземпляр типу Guid. Щоб створити цей екземпляр, компілятор повинен вибрати між двома різними визначеннями Guid. Коли директива використання псевдоніму розміщується поза елементом простору імен, компілятор вибере локальне визначення Guid, визначене в локальному просторі імен, і повністю ігнорує директиву використання псевдоніма, визначену поза простором імен. Це, на жаль, не очевидно при читанні коду.
Однак, коли директива використання псевдоніму розташована в просторі імен, компілятору доводиться вибирати між двома різними конфліктуючими типами Guid, визначеними в одній просторі імен. Обидва ці типи забезпечують відповідний конструктор. Компілятор не може прийняти рішення, тому він позначає помилку компілятора.
Розміщення директиви використання псевдоніму поза простором імен є поганою практикою, оскільки це може призвести до плутанини в таких ситуаціях, коли не очевидно, яка версія типу використовується насправді. Це потенційно може призвести до помилок, які можуть бути важко діагностувати.
Якщо розміщувати директиви-псевдоніми в елементі простору імен, це усуває це як джерело помилок.
- Кілька просторів імен
Розміщення декількох елементів простору імен в одному файлі, як правило, погана ідея, але якщо і коли це зроблено, то добре використовувати всі директиви, що використовують, в межах кожного з елементів простору імен, а не глобально вгорі файлу. Це буде чітко охоплювати простори імен, а також допоможе уникнути виду поведінки, описаного вище.
Важливо зазначити, що коли код був написаний за допомогою директив, розміщених поза простором імен, слід бути обережним при переміщенні цих директив у просторі імен, щоб переконатися, що це не змінює семантику коду. Як пояснено вище, розміщення директив з використанням псевдоніму в елементі простору імен дозволяє компілятору вибирати між конфліктуючими типами способами, які не відбудуться, якщо директиви розміщуються поза простором імен.
Як виправити порушення Щоб виправити порушення цього правила, перемістіть усі, використовуючи директиви та директиви-псевдоніми в межах простору імен.