Menurut Dokumentasi StyleCop:
SA1200: MenggunakanDirectivesMustBePlacedWithinNamespace
Penyebab AC # menggunakan arahan ditempatkan di luar elemen namespace.
Deskripsi Aturan Pelanggaran aturan ini terjadi ketika arahan menggunakan atau arahan using-alias ditempatkan di luar elemen namespace, kecuali file tersebut tidak mengandung elemen namespace.
Misalnya, kode berikut akan menghasilkan dua pelanggaran aturan ini.
using System;
using Guid = System.Guid;
namespace Microsoft.Sample
{
public class Program
{
}
}
Namun, kode berikut tidak akan mengakibatkan pelanggaran apa pun terhadap aturan ini:
namespace Microsoft.Sample
{
using System;
using Guid = System.Guid;
public class Program
{
}
}
Kode ini akan dikompilasi dengan bersih, tanpa ada kesalahan kompiler. Namun, tidak jelas versi jenis Guid yang dialokasikan. Jika arahan penggunaan dipindahkan di dalam namespace, seperti yang ditunjukkan di bawah ini, kesalahan kompiler akan terjadi:
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");
}
}
}
Kode gagal pada kesalahan kompilator berikut, ditemukan pada baris yang berisi Guid g = new Guid("hello");
CS0576: Namespace 'Microsoft.Sample' berisi definisi yang bertentangan dengan alias 'Guid'
Kode tersebut membuat alias ke tipe System.Guid yang disebut Guid, dan juga membuat tipe sendiri yang disebut Guid dengan antarmuka konstruktor yang cocok. Kemudian, kode menciptakan turunan dari tipe Guid. Untuk membuat instance ini, kompiler harus memilih antara dua definisi Guid yang berbeda. Ketika directive alias menggunakan ditempatkan di luar elemen namespace, kompiler akan memilih definisi lokal Guid didefinisikan dalam namespace lokal, dan sepenuhnya mengabaikan directive alias menggunakan yang didefinisikan di luar namespace. Sayangnya, ini tidak jelas ketika membaca kode.
Ketika menggunakan-alias direktif diposisikan dalam namespace, kompiler harus memilih antara dua jenis Guid yang berbeda dan saling bertentangan, keduanya didefinisikan dalam namespace yang sama. Kedua tipe ini menyediakan konstruktor yang cocok. Kompiler tidak dapat membuat keputusan, sehingga menandai kesalahan kompiler.
Menempatkan menggunakan-alias direktif di luar namespace adalah praktik yang buruk karena dapat menyebabkan kebingungan dalam situasi seperti ini, di mana tidak jelas versi jenis mana yang benar-benar digunakan. Ini berpotensi menyebabkan bug yang mungkin sulit didiagnosis.
Menempatkan arahan-alias menggunakan dalam elemen namespace menghilangkan ini sebagai sumber bug.
- Banyak ruang nama
Menempatkan banyak elemen namespace dalam satu file umumnya adalah ide yang buruk, tetapi jika dan ketika ini dilakukan, itu adalah ide yang baik untuk menempatkan semua menggunakan arahan dalam setiap elemen namespace, daripada secara global di bagian atas file. Ini akan membatasi ruang nama secara ketat, dan juga akan membantu menghindari jenis perilaku yang dijelaskan di atas.
Penting untuk dicatat bahwa ketika kode telah ditulis dengan menggunakan arahan yang ditempatkan di luar namespace, harus berhati-hati ketika memindahkan arahan ini di dalam namespace, untuk memastikan bahwa ini tidak mengubah semantik kode. Seperti dijelaskan di atas, menempatkan arahan-alias menggunakan di dalam elemen namespace memungkinkan kompiler untuk memilih antara tipe yang saling bertentangan dengan cara yang tidak akan terjadi ketika arahan ditempatkan di luar namespace.
Cara Memperbaiki Pelanggaran Untuk memperbaiki pelanggaran aturan ini, pindahkan semua menggunakan arahan dan arahan menggunakan-alias di dalam elemen namespace.