直播中
<b>避免</b>使用由經常使用的名稱空間復制的類型名。類型名不能使用下列詞語。
System Collections Forms UI
<b>避免</b>使用與常用關鍵詞沖突的標識符。例如,避免使用下列詞語。<table class=ubb cellspacing=0><tr><td class=ubb>
<i>AddHandler</i></td><td class=ubb>
<i>AddressOf</i></td><td class=ubb>
<i>Alias</i></td><td class=ubb>
<i>And</i></td><td class=ubb>
<i>Ansi</i></td></tr><tr><td class=ubb>
<i>As</i></td><td class=ubb>
<i>Assembly</i></td><td class=ubb>
<i>Auto</i></td><td class=ubb>
<i>BitAnd</i></td><td class=ubb>
<i>BitNot</i></td></tr><tr><td class=ubb>
<i>BitOr</i></td><td class=ubb>
<i>BitXor</i></td><td class=ubb>
<i>Boolean</i></td><td class=ubb>
<i>ByRef</i></td><td class=ubb>
<i>Byte</i></td></tr><tr><td class=ubb>
<i>ByVal</i></td><td class=ubb>
<i>Call</i></td><td class=ubb>
<i>Case</i></td><td class=ubb>
<i>Catch</i></td><td class=ubb>
<i>CBool</i></td></tr><tr><td class=ubb>
<i>CByte</i></td><td class=ubb>
<i>CChar</i></td><td class=ubb>
<i>CDate</i></td><td class=ubb>
<i>CDec</i></td><td class=ubb>
<i>CDbl</i></td></tr><tr><td class=ubb>
<i>Char</i></td><td class=ubb>
<i>CInt</i></td><td class=ubb>
<i>Class</i></td><td class=ubb>
<i>CLng</i></td><td class=ubb>
<i>CObj</i></td></tr><tr><td class=ubb>
<i>Const</i></td><td class=ubb>
<i>CShort</i></td><td class=ubb>
<i>CSng</i></td><td class=ubb>
<i>CStr</i></td><td class=ubb>
<i>CType</i></td></tr><tr><td class=ubb>
<i>Date</i></td><td class=ubb>
<i>Decimal</i></td><td class=ubb>
<i>Declare</i></td><td class=ubb>
<i>Default</i></td><td class=ubb>
<i>Delegate</i></td></tr><tr><td class=ubb>
<i>Dim</i></td><td class=ubb>
<i>Do</i></td><td class=ubb>
<i>Double</i></td><td class=ubb>
<i>Each</i></td><td class=ubb>
<i>Else</i></td></tr><tr><td class=ubb>
<i>ElseIf</i></td><td class=ubb>
<i>End</i></td><td class=ubb>
<i>Enum</i></td><td class=ubb>
<i>Erase</i></td><td class=ubb>
<i>Error</i></td></tr><tr><td class=ubb>
<i>Event</i></td><td class=ubb>
<i>Exit</i></td><td class=ubb>
<i>ExternalSource</i></td><td class=ubb>
<i>False</i></td><td class=ubb>
<i>Finally</i></td></tr><tr><td class=ubb>
<i>For</i></td><td class=ubb>
<i>Friend</i></td><td class=ubb>
<i>Function</i></td><td class=ubb>
<i>Get</i></td><td class=ubb>
<i>GetType</i></td></tr><tr><td class=ubb>
<i>Goto </i></td><td class=ubb>
<i>Handles</i></td><td class=ubb>
<i>If</i></td><td class=ubb>
<i>Implements</i></td><td class=ubb>
<i>Imports</i></td></tr><tr><td class=ubb>
<i>In</i></td><td class=ubb>
<i>Inherits</i></td><td class=ubb>
<i>Integer</i></td><td class=ubb>
<i>Interface</i></td><td class=ubb>
<i>Is</i></td></tr><tr><td class=ubb>
<i>Let</i></td><td class=ubb>
<i>Lib</i></td><td class=ubb>
<i>Like</i></td><td class=ubb>
<i>Long</i></td><td class=ubb>
<i>Loop</i></td></tr><tr><td class=ubb>
<i>Me</i></td><td class=ubb>
<i>Mod</i></td><td class=ubb>
<i>Module</i></td><td class=ubb>
<i>MustInherit</i></td><td class=ubb>
<i>MustOverride</i></td></tr><tr><td class=ubb>
<i>MyBase</i></td><td class=ubb>
<i>MyClass</i></td><td class=ubb>
<i>Namespace</i></td><td class=ubb>
<i>New</i></td><td class=ubb>
<i>Next</i></td></tr><tr><td class=ubb>
<i>Not</i></td><td class=ubb>
<i>Nothing</i></td><td class=ubb>
<i>NotInheritable</i></td><td class=ubb>
<i>NotOverridable</i></td><td class=ubb>
<i>Object</i></td></tr><tr><td class=ubb>
<i>On</i></td><td class=ubb>
<i>Option</i></td><td class=ubb>
<i>Optional</i></td><td class=ubb>
<i>Or</i></td><td class=ubb>
<i>Overloads</i></td></tr><tr><td class=ubb>
<i>Overridable</i></td><td class=ubb>
<i>Overrides</i></td><td class=ubb>
<i>ParamArray</i></td><td class=ubb>
<i>Preserve</i></td><td class=ubb>
<i>Private</i></td></tr><tr><td class=ubb>
<i>Property</i></td><td class=ubb>
<i>Protected</i></td><td class=ubb>
<i>Public</i></td><td class=ubb>
<i>RaiseEvent</i></td><td class=ubb>
<i>ReadOnly</i></td></tr><tr><td class=ubb>
<i>ReDim</i></td><td class=ubb>
<i>Region</i></td><td class=ubb>
<i>REM</i></td><td class=ubb>
<i>RemoveHandler</i></td><td class=ubb>
<i>Resume</i></td></tr><tr><td class=ubb>
<i>Return</i></td><td class=ubb>
<i>Select</i></td><td class=ubb>
<i>Set</i></td><td class=ubb>
<i>Shadows</i></td><td class=ubb>
<i>Shared</i></td></tr><tr><td class=ubb>
<i>Short</i></td><td class=ubb>
<i>Single</i></td><td class=ubb>
<i>Static</i></td><td class=ubb>
<i>Step</i></td><td class=ubb>
<i>Stop</i></td></tr><tr><td class=ubb>
<i>String</i></td><td class=ubb>
<i>Structure</i></td><td class=ubb>
<i>Sub</i></td><td class=ubb>
<i>SyncLock</i></td><td class=ubb>
<i>Then</i></td></tr><tr><td class=ubb>
<i>Throw</i></td><td class=ubb>
<i>To</i></td><td class=ubb>
<i>True</i></td><td class=ubb>
<i>Try</i></td><td class=ubb>
<i>TypeOf</i></td></tr><tr><td class=ubb>
<i>Unicode</i></td><td class=ubb>
<i>Until</i></td><td class=ubb>
<i>Variant</i></td><td class=ubb>
<i>When</i></td><td class=ubb>
<i>While</i></td></tr><tr><td class=ubb>
<i>With</i></td><td class=ubb>
<i>WithEvents</i></td><td class=ubb>
<i>WriteOnly</i></td><td class=ubb>
<i>Xor</i></td><td class=ubb>
eval</td></tr><tr><td class=ubb>
extends</td><td class=ubb>
instanceof</td><td class=ubb>
package</td><td class=ubb>
var</td><td class=ubb>
</td></tr></table>
標識符(包括參數名)中<b>不要</b>使用縮寫。
如果必須使用縮寫:
任何超過兩個字符以上的縮寫都使用camel大寫格式,即使這不是標準縮寫。
<b>名稱空間</b><b></b>
命名名稱空間的一般規(guī)則如下:
CompanyName.TechnologyName
這樣,我們看到的名稱空間應該是這樣的:
Microsoft.Office
PowerSoft.PowerBuilder
注意:這只是一個原則。第三方公司可以選擇其它的名字。
避免用公司名稱或其它著名品牌的名稱作為名稱空間的前綴,這樣會造成兩個公布的名稱空間有同一個名稱的可能性。(例如,將微軟提供的Office自動類命名為Microsoft.Office。)
使用Pascal大寫方式,用逗號分隔邏輯成分(例如,Microsoft.Office.PowerPoint)。如果你的品牌使用的是非傳統(tǒng)大寫方式,那么一定要遵循你的品牌所確定使用的大寫方式,即使這種方式背離了通常的名稱空間大寫規(guī)則(例如,NeXT.WebObjects,和ee.cummings。)
該用復數的時候要使用復數的名稱空間名。例如,使用System.Collections而不是System.Collection。本規(guī)則的特例是品牌名稱和縮寫。例如:使用System.IO而不是System.IOs。
名稱空間和類不能使用同樣的名字。例如,有一個類被命名為Debug后,就不要再使用Debug作為一個名稱空間名。
<b>類和類成分</b><b></b>
<b> </b>
<b>類的命名原則</b>
用名詞或名詞短語命名類。
使用Pascal大寫。
減少類名中縮寫的使用量。
不要使用任何類前綴(比如C)。
不要使用帶下劃線的字符。
下面是一些正確命名的類名的例子。
public class <b>FileStream</b> {
}
public class <b>Button </b>{
}
public class <b>String</b> {
}
<b>接口命名原則</b>
使用名詞或名詞短語,或者描述行為的形容詞來命名接口。例如,IComponent(描述性名詞),ICustomAttributeProvider(名詞短語),和IPersistable(形容詞)。
使用Pascal大寫。
減少接口名中縮寫的使用量。
不要使用帶下劃線的字符。
在接口名前加前綴I,以表示這個類型是一個接口。
不要在類名前加上前綴C。偶而情況下,需要在類名前加上I而并不表示它是一個接口。在這種情況下,只要I后面的字符是小寫就可(例如,IdentityStore。)
當類是接口的標準執(zhí)行時,定義這一對類/接口組合就要使用相似的名稱。兩個名稱的不同之處只是接口名前有一個I前綴。
下面我們舉個例子,來看看接口IComponent和它的標準執(zhí)行,類Component。
public interface <b>IComponent</b> {
}
public class Component : <b>IComponent </b>{
}
public interface <b>IServiceProvider</b>{
}
public interface <b>IFormatable</b> {
}
<b>屬性命名原則</b>
在屬性的后面加上Attribute后綴,來自定義屬性類。如下例所示。
public class <b>ObsoleteAttribute</b>{
}
<b>Enum</b><b>命名原則</b>
Enum需使用Pascal大寫。
Enum值名需使用Pascal大寫。
減少enum名中縮寫的使用量。
Enum名前不要加前綴(例如,adxxx表示ADO enums,rtfxxx表示多信息文本enum,等等。)。
在enum類型上不要加Enum后綴。
Enum名稱需使用單數名詞。
比特域使用復數名詞。
如果列舉值在參數或屬性中使用,需用一個enum來定義列舉值。這樣工具就可以知道一個屬性或參數可能的值了。
public enum FileMode{
Create,
CreateNew,
Open,
OpenOrCreate,
Truncate
}
如果數字值to be bitwise or'ed together,就使用Flags對屬性進行自定義。
[Flags]
public enum Bindings {
CreateInstance,
DefaultBinding,
ExcatBinding,
GetField,
GetProperty,
IgnoreCase,
InvokeMethod,
NonPublic,
OABinding,
SetField
SetProperty,
Static
}
在封裝一個Win32 API時,這個規(guī)則有一個特例。從一個Win32標頭產生內部定義是很常見的。你可以使用Win32大寫,這種形式下字母通常全部大寫。
使用Int32作為一個enum的基礎類型。
如果這個enum代表標志,而且標志又非常多(大于32),或者這個enum在將來可以發(fā)展成許多標志,或者類型需要與類型int有所不同以便向后兼容時,在這種情況下就產生了特例。
只有在值可以被完全表示為一組位標志時,才使用enum。開集不能使用enum(例如操作系統(tǒng)版,等等)。
<b>只讀和</b><b>Const</b><b>字段名</b><b></b>
用名詞,名詞短語,或名詞的縮寫命名靜態(tài)字段。
用Pascal大寫命名靜態(tài)字段。
不要用匈牙利文類型的符號作靜態(tài)字段名的前綴。
<b>參數名</b>
使用描述性參數名。參數名應該具有足夠的描述性,這樣在大多數情況下參數名和它的種類可以用來確定它的意思。
用camel大寫方式命名參數。
根據參數的意思來命名參數,而不是根據參數的種類來命名。我們希望開發(fā)工具可以用很方便的方式提供關于參數種類的信息,這樣參數名可以得到更好的使用,可以對語義而不是對種類進行描述。但是偶爾使用根據類型命名的參數名也是完全可以的。
不要使用保留參數。如果在下一個版本中需要更多的數據,可以增加進來。
不要用匈牙利文類型的符號作為字段名的前綴。
Type GetType (string <b>typeName</b>)
string Format (string <b>format</b>, object [] <b>args</b>)
<b>方法命名原則</b>
用動詞或動詞短語命名方法。
用下述范例所示的Pascal大寫方式命名方法。
RemoveAll()
GetCharArray()
Invoke()
<b>屬性命名原則</b>
用名詞或名詞短語命名屬性。
用Pascal大寫命名屬性。
屬性與類型要一樣。
用與一個類型的名稱相同的名字來命名屬性時,就使這個屬性的類型成為那個類型。雖然聽起來有些奇怪,但這是正確的。下面的例子正確使用了屬性命名原則。
public enum Color {...}
public class Control {
public Color Color { get {...} set {...} }
}
下例就是不正確的。
public enum Color {...}
public class Control {
public int Color { get {...} set {...} }
}
在那個不正確的例子中,要想引用Color enum是不可能的,因為Color,Xxx會被翻譯成一個成員訪問,它會首先獲得Color屬性的值(int種類),然后再訪問那個值的成員(它應該是System.Int32的一個實例成員)。
<b>事件命名原則</b>
用EventHandloer后綴命名事件處理程序,如下列所示。
public delegate void <b>MouseEventHandler</b>(object sender, MouseEvent e);
使用名為sender和e的兩個參數。
Sender參數代表提出事件的對象。Sender參數永遠是一個類型對象,即使它可能使用了更為特定的類型。
與事件相關的狀態(tài)被封裝在一個名為e的事件類范例中。要使用這個類型的正確的、特定的事件類。
public delegate void MouseEventHandler(object <b>sender</b>, MouseEvent <b>e</b>);
用EventArgs后綴命名事件自變量類,如下例所示。
public class MouseEventArgs : EventArgs {
int x;
int y;
public MouseEventArgs(int x, int y)
{ this.x = x; this.y = y; }
public int X { get { return x; } }
public int Y { get { return y; } }
}
命名事件名時,需要有之前和之后的時態(tài)概念,因此要使用現在時態(tài)和過去時態(tài)(不要使用BeforeXxx\AfterXxx的方式)。例如,可以被取消的結束事件就有Closing事件和Closed事件。
public event ControlEventHandler ControlAdded {
//..
}
用動詞命名事件。
<b>區(qū)分大小寫</b>
不要使用需要對大小寫作出區(qū)分的名稱。各成分不論是在區(qū)分大小寫還是不區(qū)分大小寫的語言下都必須是完全可用的。因為不區(qū)分大小寫的語言不能在同樣的環(huán)境下對只有大小寫不同的兩個名稱作出辯別,所以成分必須避免這種情況。
不要產生兩個名稱相同只有大小寫不同的名稱空間。
namespace ee.cummings;
namespace Ee.Cummings;
帶有兩個參數的一個類型,其兩個參數的名稱不能只有大小寫不同。
void foo(string a, string A)
System.WinForms.Point p;
System.WinForms.POINT pp;
帶有兩個屬性的一個類型,其屬性的名稱不能只有大小寫不同。
int Foo {get, set};
int FOO {get, set}
帶有兩種方法的一個類型,其方法的名稱不能只有大小寫不同。
void foo();
void Foo();
<b>避免類型名出現混淆</b>
不同的語言使用不同的術語以識別基本管理類型。設計人員必須避免使用對語言有專門要求的術語。遵照本章說明的規(guī)則,避免出現類型名稱混淆的情況。
使用語義上有意義的名稱,而不要使用類型名稱。
在很少見的情況下,參數除了類型以外語義上沒有任何意義,這時使用類屬名。例如,一個類支持將多種數據類型寫進一個流中,這個類可能有下列方法:
void Write(double value);
void Write(float value);
void Write(long value);
void Write(int value);
void Write(short value);
上面的例子在下述對語言有專門要求的情況下是首選。
void Write(double doubleValue);
void Write(float floatValue);
void Write(long longValue);
void Write(int intValue);
void Write(short shortValue);
在極端情況下,每一個基本數據類型需要有唯一的命名方式,此時使用下面的通用類型名稱。<table class=ubb cellspacing=0><tr><td class=ubb>
<b>C# type name</b></td><td class=ubb>
<b>Visual Basic type name</b></td><td class=ubb>
<b>JScript type name</b></td><td class=ubb>
<b>Visual C++ type name</b></td><td class=ubb>
<b>IL representation</b></td><td class=ubb>
<b>Universal type name</b></td></tr><tr><td class=ubb>
sbyte</td><td class=ubb>
SByte</td><td class=ubb>
SByte</td><td class=ubb>
char</td><td class=ubb>
I1</td><td class=ubb>
<b>SByte</b></td></tr><tr><td class=ubb>
byte</td><td class=ubb>
Byte</td><td class=ubb>
byte</td><td class=ubb>
unsigned char</td><td class=ubb>
U1</td><td class=ubb>
<b>Byte</b></td></tr><tr><td class=ubb>
short</td><td class=ubb>
Short</td><td class=ubb>
short</td><td class=ubb>
short</td><td class=ubb>
I2</td><td class=ubb>
<b>Int16</b></td></tr><tr><td class=ubb>
ushort</td><td class=ubb>
UInt16</td><td class=ubb>
UInt16</td><td class=ubb>
unsigned short</td><td class=ubb>
U2</td><td class=ubb>
<b>UInt16</b></td></tr><tr><td class=ubb>
int</td><td class=ubb>
Integer</td><td class=ubb>
int</td><td class=ubb>
int</td><td class=ubb>
I4</td><td class=ubb>
<b>Int32</b></td></tr><tr><td class=ubb>
uint</td><td class=ubb>
NA</td><td class=ubb>
NA</td><td class=ubb>
unsigned int</td><td class=ubb>
U4</td><td class=ubb>
<b>UInt32</b></td></tr><tr><td class=ubb>
long</td><td class=ubb>
Long</td><td class=ubb>
long</td><td class=ubb>
__int64</td><td class=ubb>
I8</td><td class=ubb>
<b>Int64</b></td></tr><tr><td class=ubb>
ulong</td><td class=ubb>
UInt64</td><td class=ubb>
UInt64</td><td class=ubb>
Unsigned __int64</td><td class=ubb>
U8</td><td class=ubb>
<b>UInt64</b></td></tr><tr><td class=ubb>
float</td><td class=ubb>
Single</td><td class=ubb>
float</td><td class=ubb>
float</td><td class=ubb>
R4</td><td class=ubb>
<b>Single</b></td></tr><tr><td class=ubb>
double</td><td class=ubb>
Double</td><td class=ubb>
double</td><td class=ubb>
double</td><td class=ubb>
R8</td><td class=ubb>
<b>Double</b></td></tr><tr><td class=ubb>
bool</td><td class=ubb>
Boolean</td><td class=ubb>
boolean</td><td class=ubb>
bool</td><td class=ubb>
I4</td><td class=ubb>
<b>Boolean</b></td></tr><tr><td class=ubb>
char</td><td class=ubb>
Char</td><td class=ubb>
char</td><td class=ubb>
wchar_t</td><td class=ubb>
U2</td><td class=ubb>
<b>Char</b></td></tr><tr><td class=ubb>
string</td><td class=ubb>
String</td><td class=ubb>
String</td><td class=ubb>
String</td><td class=ubb>
System.String</td><td class=ubb>
<b>String</b></td></tr><tr><td class=ubb>
object</td><td class=ubb>
Object</td><td class=ubb>
Object</td><td class=ubb>
Object</td><td class=ubb>
System.Object</td><td class=ubb>
<b>Object</b></td></tr></table>
一個支持從流中讀取多種數據類型的類可以有下列方法。
double ReadDouble();
float ReadSingle();
long ReadIn64();
int ReadInt32();
short ReadInt16();
上面的例子在下述對語言有專門要求的情況下是首選。
double ReadDouble();
float ReadFloat();
long ReadLong();
int ReadInt();
short ReadShort();