首頁 >後端開發 >C#.Net教程 >C#學習記錄:撰寫高品質程式碼改善整理建議1-3

C#學習記錄:撰寫高品質程式碼改善整理建議1-3

php是最好的语言
php是最好的语言原創
2018-08-06 14:54:101750瀏覽

建議1:正確使用字串

string 

string str1 = "str1" + 9;
string str2 = "str2" + 9.ToString();

第一行程式碼會產生一次裝箱,還有一次string的concat

而第二行程式碼使用ToString(),內部使用的是Number.FormatInt32

其原型為

C#學習記錄:撰寫高品質程式碼改善整理建議1-3

##而NumberFormatInt32是一個非託管方法,運行效率比正常c#的託管程式碼高很多,所以第二行程式碼的效率比第一行高



enter description here







###至於什麼是託管程式碼非託管程式碼,我引用了其他部落格的一段話:##################託管程式碼與非託管程式碼######眾所周知,我們正常程式設計所使用的高階語言,是無法被電腦辨識的。需要先將高階語言翻譯為機器語言,才能被機器理解和運作。 ### 在標準C/C 中,編譯過程是這樣的:########## 原始碼首先經過預處理器,對頭檔以及巨集進行解析,然後經過編譯器,產生彙編程式碼,接著,經過彙編,產生機器指令,最後將所有檔案連接起來。 ### 這種編譯方式的優點在於,最終直接產生了機器碼,可以直接被電腦識別和運行,無需任何中間運行環境,但缺點也在於,由於不同平台能夠識別的機器碼不同,因此程式的跨平台能力較差。 ### 而在Java語言中,原始碼並沒有直接翻譯成機器碼,而是編譯成了一種中間碼(字節碼Bytecode)。因此,執行Java程式需要一個額外的JRE(Java Runtime Enviromental)運行環境,在JRE中存在著JVM(Java Virtual Mechinal,Java虛擬機器),在程式運作的時候,會將中間程式碼進一步###解釋# ##為機器碼,並在機器上運作。 ### 使用中間程式碼的好處在於,程式的跨平台性比較好,一次編譯,可以在不同的裝置上運作。 ### 託管/非託管是微軟的.net framework中特有的概念,其中,非託管程式碼也叫本地(native)程式碼。與Java中的機制類似,也是先將原始程式碼編譯成中間程式碼(MSIL,Microsoft Intermediate Language),然後再由.net中的CLR將中間程式碼###編譯###成機器碼。 ### 而C#與Java的差別在於,Java是先編譯後解釋,C#則是兩次編譯。 ### 託管的方式除了擁有跨平台的優點之外,對程式的效能也產生一定的影響。但程式效能不在本文討論的範圍,這裡不在贅述。 ### 此外,在.net中,C 也可以進行託管擴展,從而使C 程式碼也依賴.net和CLR運行,獲得託管程式碼的優勢。 ################

简单理解就是托管代码加了一个中间层,使其可以跨平台,不过效率会降低,而非托管代码就不会产生这样的情况

所以我们编写代码秉承一个原则:尽量减少装箱拆箱

StringBuilder

StringBuilder的效率来源于预先以非托管的方式分配内存,如果没有预先定义长度,默认长度为16,不够的时候会重新分配内存,依次加16的倍数,所以如果你提前知道字符串需要的最大长度,最好预先定义好,这样就不会频繁分配内存从而带来效率的降低

2、使用默认转型方法

这个建议的大体内容是尽量使用系统所带的转换类型的方法

例如 int.Parse  ToString()  System.Convert 等等

3、区别对待强转类型和as  is

两个类型之间转换有两种情况

1. 他们是父子类的关系: ChildType  =  (ChildType)ParentType

2.没有继承关系,或者继承同一个父类,这时候就需要重写强转方法

class FirstType
{
    public string Name { get; set; }
}

class SecondType
{
    public string Name { get; set; }
        
    public static explicit operator SecondType(FirstType firstType)
    {
        SecondType secondType = new SecondType() { Name = firstType.Name };
        return secondType;
    }
}

FirstType firstType = new FirstType() { Name = "张" };
SecondType secondType = (SecondType)firstType;

如果是继承的关系,为了效率推荐使用 ChildType = ParentType as ChildType

这个就更上面提到的,尽量使用系统方法的转换,而不是强制转换

我写Unity的时候有这样一个需求,右键点击装备的时候会使用,装备有Equipment,Weapon,我们需要判断是Equipment还是Weapon类型,它们都是继承Item类型,有两种方法可用:

Weapon weapon = item as Weapon;
if(weapon != null)
{
    //TODO 使用武器
}

if(item is Weapon)
{
    weapon weapon = item as Weapon;
    //TODO 使用武器
}

第一种方法只判断了一次类型,而第二种方法判断了两次类型

书上说as不能判断基元类型,但是经过我的测试发现书上写错了,as仅仅不能判断值类型,这里大家可以自己测试一下

C#學習記錄:撰寫高品質程式碼改善整理建議1-3

C#學習記錄:撰寫高品質程式碼改善整理建議1-3

相关文章:

C#学习记录:编写高质量代码改善整理建议4-8

C#学习记录:编写高质量代码改善整理建议9-15

以上是C#學習記錄:撰寫高品質程式碼改善整理建議1-3的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn