编写高质量的代码,改善c#程序的157个建议_之1~10
生活随笔
收集整理的這篇文章主要介紹了
编写高质量的代码,改善c#程序的157个建议_之1~10
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//編寫高質量的代碼,改善c#程序的157個建議 # 1、正確操作字符串 ## 1 * 確保盡量少的裝箱 * 避免分配額外的內存空間
1. 會進行一次裝箱 ````C# string str1="str1"+9; ```` 2. 沒有裝箱,調用的是整型的ToString方法 ````C# string str2="str2"+9.ToString(); ````
# 2、使用默認轉換類型 * 使用類型的轉換運算符 * 使用類型內置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法 * 使用幫助類提供的方法 * 使用CLR支持的轉型
## 1、使用類型轉換運算符 使用類型內部的一個方法:隱式轉換和顯式轉換,用戶自定義的類型通過重載運算符提供這一類轉換。 ## 2、使用類型內置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法 在FCL中,如果某個類型經常需要進行轉型操作,類型自身則會帶有一些轉型方法。 ## 3、使用幫助類提供的方法 可以使用如System.Convert類、System.Converter類來進行類型轉換。 ## 4、使用CLR支持的轉型 CLR支持的轉型,即上溯轉型和下溯轉型。基類和子類之間的轉換
# 3、區別對待強制轉型與as和is ````C# secondType=(SencondType)firstType; ```` 強制轉型意味著兩件不同的事情: * 1> firstType和SencondType彼此依靠轉換操作符來完成兩個類型之間的轉型 如果類型之間都上溯到了某個共同的基類,那么根據此基類進行的轉(即基類轉型為子類本身)應該使用as。子類與子類之間的轉型,則應該提供轉換操作符,以進行強制轉型。 ````C# //對比兩種類型 class FirstType { public string Nmae{get;set;} } class SecondType { public string Name{get;set;} public static explicit operator SecondType(FirstType firstType) { SecondType secondType=new SecondType(){Name="轉型自:" + firstType}; return secondType; } } //使用過程 static void DoWithSomeType(object obj) { SecondType secondType=(SecondType)obj;//參數是firstType會引發異常
SecondType secondType= obj as SecondType;//這個時候輸入的參數可以是firstType! if(secondType!=null) { //ToDo } } ```` * 2> FirstType是SencondType的基類 既可以使用強制轉型,也可以使用as操作符;建議使用as操作符 ````C# class Program { static void Main(string[] args) { SecondType secondType=new SecondType(){Name="Second Type"}; FirstType firstType1=(FirstType)secondType; FirstType firstType1=secondType as FirstType; } } class FirstType { public string Name{get;set;} } class SecondType:FirstType { } //另一種版本 if (obj is SecondType) { SecondType secondType=obj as SecondType; //ToDo } ````
# 4、TyParse比Parse好 如果轉換的結果是對的,那么這兩種的效率在相同的數量級;如果轉換失敗前者效率比后者高很多! # 5、使用int?來確保值類型也可以為null 語法T?是Nullable<T>的簡寫,兩者可以相互轉換。可以為null的類型表示其基礎值類型正常范圍內的值再加上一個null值。例如,Nullable<Int32>,其值的范圍為-2147483648~2147483647,再加上一個null值。 * 基元類型提供了其對應的可空類型的隱式轉換 ````C# int? i=null; int j=0; i=j; ```` * 反過來,可空類型不可隱式轉換為對應的基元類型 ````C# int? i=123; int j; //繁瑣的代碼 if(i.HasValue) { j=i.Value; } else { j=0; } //簡化的代碼 int? i=123; int j=i??0; ````
# 6、區別readonly和const的使用方法
* >const是一個編譯期常量,readonly是一個運行時常量。 ### 1>對于值類型變量,值本身不可改變。 ### 2>對于引用類型變量,引用本身(相當于指針)不可改變。 ````C# /*****值類型變量*****/ calss Sample { public readonly int ReadOnlyValue; public Sample(int value) { readOnlyValue=value; } } //Sample的實例在構造方法中被賦值后就不可以改變 Sample sample=new Sample(200); sample.ReadOnlyValue=300; /*******引用類型變量*****/ class Sample2 { public readonly Student ReadOnlyValue; public Sample2(Student value) { ReadOnlyValue=value; } } //賦值后,變量不能再指向任何其他的Student實例 Sample2 sample2=new Sample2(new Student(){Age=10}); sample2.ReadOnlyValue=new Student(){Age=20}; //引用本身不可改變,引用所指實例的值卻可以改變 sample2=new Sample2(new Student(){Age=10}); sample2.ReadOnlyValue.Age=20; ```` * >const只能修飾基元類型、枚舉類型或者字符串類型,readonly沒有限制。
# 7&8、將0值作為枚舉的默認值&避免給枚舉類型的元素提供顯式的值 允許使用的枚舉類型有byte、sbyte、short、ushort、int、uint、long和ulong。始終將0值作為枚舉類型的默認值。 ````C# //應該將顯示為元素的賦值去掉,編譯器會自動從0值開始計數,然后逐個為元素的值+1 enum Week { Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 } //枚舉元素允許設定重復得值 enum Week { Monday=1, Tuesday=2, ValueTemp, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 } //下邊代碼輸出為:Wednesday Week week=Week.ValueTemp; Console.WriteLine(week);//上一個枚舉值加一 ````
1. 會進行一次裝箱 ````C# string str1="str1"+9; ```` 2. 沒有裝箱,調用的是整型的ToString方法 ````C# string str2="str2"+9.ToString(); ````
# 2、使用默認轉換類型 * 使用類型的轉換運算符 * 使用類型內置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法 * 使用幫助類提供的方法 * 使用CLR支持的轉型
## 1、使用類型轉換運算符 使用類型內部的一個方法:隱式轉換和顯式轉換,用戶自定義的類型通過重載運算符提供這一類轉換。 ## 2、使用類型內置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法 在FCL中,如果某個類型經常需要進行轉型操作,類型自身則會帶有一些轉型方法。 ## 3、使用幫助類提供的方法 可以使用如System.Convert類、System.Converter類來進行類型轉換。 ## 4、使用CLR支持的轉型 CLR支持的轉型,即上溯轉型和下溯轉型。基類和子類之間的轉換
# 3、區別對待強制轉型與as和is ````C# secondType=(SencondType)firstType; ```` 強制轉型意味著兩件不同的事情: * 1> firstType和SencondType彼此依靠轉換操作符來完成兩個類型之間的轉型 如果類型之間都上溯到了某個共同的基類,那么根據此基類進行的轉(即基類轉型為子類本身)應該使用as。子類與子類之間的轉型,則應該提供轉換操作符,以進行強制轉型。 ````C# //對比兩種類型 class FirstType { public string Nmae{get;set;} } class SecondType { public string Name{get;set;} public static explicit operator SecondType(FirstType firstType) { SecondType secondType=new SecondType(){Name="轉型自:" + firstType}; return secondType; } } //使用過程 static void DoWithSomeType(object obj) { SecondType secondType=(SecondType)obj;//參數是firstType會引發異常
SecondType secondType= obj as SecondType;//這個時候輸入的參數可以是firstType! if(secondType!=null) { //ToDo } } ```` * 2> FirstType是SencondType的基類 既可以使用強制轉型,也可以使用as操作符;建議使用as操作符 ````C# class Program { static void Main(string[] args) { SecondType secondType=new SecondType(){Name="Second Type"}; FirstType firstType1=(FirstType)secondType; FirstType firstType1=secondType as FirstType; } } class FirstType { public string Name{get;set;} } class SecondType:FirstType { } //另一種版本 if (obj is SecondType) { SecondType secondType=obj as SecondType; //ToDo } ````
# 4、TyParse比Parse好 如果轉換的結果是對的,那么這兩種的效率在相同的數量級;如果轉換失敗前者效率比后者高很多! # 5、使用int?來確保值類型也可以為null 語法T?是Nullable<T>的簡寫,兩者可以相互轉換。可以為null的類型表示其基礎值類型正常范圍內的值再加上一個null值。例如,Nullable<Int32>,其值的范圍為-2147483648~2147483647,再加上一個null值。 * 基元類型提供了其對應的可空類型的隱式轉換 ````C# int? i=null; int j=0; i=j; ```` * 反過來,可空類型不可隱式轉換為對應的基元類型 ````C# int? i=123; int j; //繁瑣的代碼 if(i.HasValue) { j=i.Value; } else { j=0; } //簡化的代碼 int? i=123; int j=i??0; ````
# 6、區別readonly和const的使用方法
* >const是一個編譯期常量,readonly是一個運行時常量。 ### 1>對于值類型變量,值本身不可改變。 ### 2>對于引用類型變量,引用本身(相當于指針)不可改變。 ````C# /*****值類型變量*****/ calss Sample { public readonly int ReadOnlyValue; public Sample(int value) { readOnlyValue=value; } } //Sample的實例在構造方法中被賦值后就不可以改變 Sample sample=new Sample(200); sample.ReadOnlyValue=300; /*******引用類型變量*****/ class Sample2 { public readonly Student ReadOnlyValue; public Sample2(Student value) { ReadOnlyValue=value; } } //賦值后,變量不能再指向任何其他的Student實例 Sample2 sample2=new Sample2(new Student(){Age=10}); sample2.ReadOnlyValue=new Student(){Age=20}; //引用本身不可改變,引用所指實例的值卻可以改變 sample2=new Sample2(new Student(){Age=10}); sample2.ReadOnlyValue.Age=20; ```` * >const只能修飾基元類型、枚舉類型或者字符串類型,readonly沒有限制。
# 7&8、將0值作為枚舉的默認值&避免給枚舉類型的元素提供顯式的值 允許使用的枚舉類型有byte、sbyte、short、ushort、int、uint、long和ulong。始終將0值作為枚舉類型的默認值。 ````C# //應該將顯示為元素的賦值去掉,編譯器會自動從0值開始計數,然后逐個為元素的值+1 enum Week { Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 } //枚舉元素允許設定重復得值 enum Week { Monday=1, Tuesday=2, ValueTemp, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 } //下邊代碼輸出為:Wednesday Week week=Week.ValueTemp; Console.WriteLine(week);//上一個枚舉值加一 ````
轉載于:https://www.cnblogs.com/mengwy/p/11371032.html
總結
以上是生活随笔為你收集整理的编写高质量的代码,改善c#程序的157个建议_之1~10的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多米诺骨牌 优化版
- 下一篇: artdialog5 bug