爲什麼我得到了編譯器警告爲什麼帶有下劃線的名稱不符合CLS?
標識符 'Logic.DomainObjectBase._isNew' 是不符合CLS
以下的代碼?
public abstract class DomainObjectBase
{
protected bool _isNew;
}
爲什麼我得到了編譯器警告爲什麼帶有下劃線的名稱不符合CLS?
標識符 'Logic.DomainObjectBase._isNew' 是不符合CLS
以下的代碼?
public abstract class DomainObjectBase
{
protected bool _isNew;
}
從Common Language Specification:
符合CLS的語言編譯器必須遵循Unicode標準3.0的技術報告15,其支配的組可以就被列入標識字符的附件7規則。這個標準可以從Unicode聯盟的網站上獲得。
如果look this up:
也就是說,標識符的第一個字符可以是大寫字母,小寫字母,首字母大寫字母,修飾符字母,其他字母,或字母數字。標識符的後續字符可以是任何這些字符,加上非間距標記,間距組合標記,十進制數,連接符標點和格式化代碼(例如右 - 左標記)。通常格式代碼在存儲或比較標識符之前應該被過濾掉。
基本上,您不能使用下劃線啓動標識符 - 這違反了可見(公共/受保護)字段上的CLS標準。
前導underscore伴隨_isNew
可見(即,不是私有的)。
這是下劃線。看到這個article。
由於數據成員的名稱_isNew
開頭是下劃線。
符合CLS的標識符不應以下劃線開頭。
下劃線導致問題。通常的做法是下劃線是專用於私人領域的。受保護的/公共成員應該適當地加以套用和命名。
例如:
public abstract class DomainObjectBase{
private bool _isNew;
protected bool IsNew { get { return _isNew; } set { _isNew = value;} }
}
,或者,如果你想使用3.x和擺脫私人領域:
public abstract class DomainObjectBase{
protected bool IsNew { get; set; }
}
領先_是不符合CLS
Microsoft StyleCop將分析您的代碼,並提供指向相關文檔的鏈接,說明它不符合CLS的原因。
CLS compliance與不同的.NET語言之間的互操作性有關。該屬性不符合CLS,因爲它以下劃線開頭並且是公共的(注意:公共類中的受保護屬性可以從組件外部訪問)。雖然如果從C#訪問屬性,這將起作用,但如果從其他.NET語言訪問屬性名稱時不允許使用下劃線,則該屬性可能不適用,因此它不符合CLS。
您收到此編譯器錯誤,因爲地方在你的代碼已標記您的組件,CLS符合線路是這樣的:
[assembly: CLSCompliant(true)]
Visual Studio中包含AssemblyInfo.cs文件中這行可以在大多數項目的屬性下找到。
要解決這個錯誤,您可以:
重命名你的財產(推薦):
protected bool isNew;
設置你的整個裝配爲不符合CLS:
[assembly: CLSCompliant(false)]
爲您的房產添加屬性:
[CLSCompliant(false)]
protected bool _isNew;
更改屬性的範圍,以使其不能在組件外部看到。
private bool _isNew;
你可能不應該被標記爲非私人用下劃線成員反正。我知道每個人都有自己的風格,但其他人幾乎肯定會認爲這個領域是私人的,不符合常規。 – 2009-07-28 17:25:36
@EdS。哪個公約? – Pharap 2015-06-16 02:16:52
似乎一次是一個VB約定,它也似乎超出了C++,C#的風格,比在這裏找到的這個盒子更適合:https://stackoverflow.com/questions/3136594/naming-約定 - 下劃線在cc-變量 – MatthewMartin 2015-06-16 03:10:57