ตามเอกสาร StyleCop:
SA1200: UsingDirectivesMustBePlacedWithinNamespace
สาเหตุ AC # โดยใช้คำสั่งถูกวางไว้ด้านนอกขององค์ประกอบเนมสเปซ
กฎคำอธิบายการละเมิดกฎนี้เกิดขึ้นเมื่อใช้ directive หรือ direct-alias directive อยู่นอกองค์ประกอบ namespace ยกเว้นว่าไฟล์จะไม่มีองค์ประกอบ namespace ใด ๆ
ตัวอย่างเช่นรหัสต่อไปนี้จะส่งผลให้มีการละเมิดกฎนี้สองครั้ง
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 type ใดที่กำลังถูกจัดสรร หากคำสั่งการใช้ถูกย้ายภายในเนมสเปซดังที่แสดงด้านล่างข้อผิดพลาดของคอมไพเลอร์จะเกิดขึ้น:
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: Namespace 'Microsoft.Sample' มีคำจำกัดความที่ขัดแย้งกับนามแฝง 'Guid'
รหัสสร้างนามแฝงกับชนิด System.Guid ที่เรียกว่า Guid และยังสร้างชนิดของตัวเองที่เรียกว่า Guid ด้วยอินเทอร์เฟซตัวสร้างที่ตรงกัน ต่อมารหัสจะสร้างอินสแตนซ์ของประเภท Guid ในการสร้างอินสแตนซ์นี้คอมไพเลอร์ต้องเลือกระหว่างคำจำกัดความที่แตกต่างกันสองคำของ Guid เมื่อคำสั่ง use-alias วางอยู่ด้านนอกขององค์ประกอบเนมสเปซคอมไพเลอร์จะเลือกนิยามโลคัลของ Guid ที่กำหนดไว้ภายในเนมสเปซท้องถิ่นและไม่สนใจคำสั่ง use-alias ที่กำหนดไว้ภายนอกเนมสเปซ โชคไม่ดีที่เห็นได้ชัดเมื่ออ่านรหัส
เมื่อคำสั่ง use-alias อยู่ในตำแหน่งภายในเนมสเปซคอมไพเลอร์จะต้องเลือกระหว่าง Guid ชนิดต่าง ๆ สองชนิดที่ขัดแย้งกันซึ่งกำหนดไว้ภายในเนมสเปซเดียวกัน ทั้งสองประเภทนี้ให้ตัวสร้างการจับคู่ คอมไพเลอร์ไม่สามารถตัดสินใจได้ดังนั้นจึงตั้งค่าสถานะข้อผิดพลาดของคอมไพเลอร์
การวาง direct-directive ไว้นอกเนมสเปซเป็นการฝึกฝนที่ไม่ดีเพราะมันอาจทำให้เกิดความสับสนในสถานการณ์เช่นนี้ซึ่งไม่เป็นที่แน่ชัดว่าเวอร์ชันของชนิดใดที่ใช้งานจริง สิ่งนี้อาจนำไปสู่ข้อผิดพลาดซึ่งอาจวินิจฉัยได้ยาก
การวางคำสั่งนามแฝงภายในองค์ประกอบเนมสเปซกำจัดสิ่งนี้เป็นแหล่งของข้อบกพร่อง
- หลายเนมสเปซ
การวางองค์ประกอบเนมสเปซหลายรายการภายในไฟล์เดียวโดยทั่วไปเป็นความคิดที่ไม่ดี แต่ถ้าและเมื่อทำเช่นนี้เป็นความคิดที่ดีที่จะวางคำสั่งทั้งหมดโดยใช้คำสั่งภายในแต่ละองค์ประกอบเนมสเปซแทนที่จะเป็นส่วนกลางที่ด้านบนของไฟล์ สิ่งนี้จะกำหนดขอบเขตเนมสเปซให้แน่นและจะช่วยหลีกเลี่ยงพฤติกรรมที่อธิบายไว้ข้างต้น
เป็นสิ่งสำคัญที่จะต้องทราบว่าเมื่อโค้ดถูกเขียนด้วยการใช้คำสั่งที่วางอยู่นอกเนมสเปซควรใช้ความระมัดระวังเมื่อย้ายคำสั่งเหล่านี้ภายในเนมสเปซเพื่อให้แน่ใจว่านี่จะไม่เปลี่ยนซีแมนทิกส์ของรหัส ตามที่อธิบายไว้ข้างต้นการวาง direct-นามแฝงไว้ในองค์ประกอบ namespace ทำให้คอมไพเลอร์สามารถเลือกระหว่างชนิดที่ขัดแย้งกันในรูปแบบที่จะไม่เกิดขึ้นเมื่อวางคำสั่งไว้นอกเนมสเปซ
วิธีแก้ไขการละเมิดในการแก้ไขการละเมิดกฎนี้ให้ย้ายทั้งหมดโดยใช้คำสั่งและการใช้นามแฝงภายในองค์ประกอบเนมสเปซ