C 高效程式設計

2022-03-31 12:17:57 字數 4192 閱讀 6462

一、 使用readonly而不是const

const是編譯時常量,readonly是執行時常量。如果引用了乙個庫中的const常量,則在更新了程式集,但應用程式沒有重新編譯時,執行結果會出錯

如程式集assembly.dll中有如下宣告

1

public

static

readonly

int start = 1;2

public

const

int end = 10;

1

public

static

readonly

int start = 10;2

public

const

int end = 20;

二、使用is和as關鍵字,而不是使用強制型別轉換強制型別轉換不當會引發 invalidcastexception異常。使用is和as可以避免這個問題

三、使用$ - 字串內插來格式化字串,而不是string.format()函式.這個功能需要c#6.0

四、盡量使用conditional特性,減少#if和#endif的使用

平常我們會使用#if和#endif來執行一些debug環境下執行的**。這些**在編譯成release版本時不會執行,但仍然會有一些開銷。這時我們就可以使用conditional特性,使用了conditional特性的函式只有在某些環境或者設定了某個值之後才能編譯成類的一部分,這樣就可以減少release版本的開銷。值得注意的,使用conditional特性必須把以前的除錯部分**封裝成函式才行。

需要了解conditionalattribute更詳細的說明,可以檢視msdn文件 

使用#if和#endif的情況

當定義了debug符號時,控制台會輸出debug和release。未定義debug符號時,只會輸出release。

1

#define debug23

using

system;

4using

system.collections.generic;

5using

system.diagnostics;

6using

system.linq;

7using

system.text;

8using

system.threading.tasks;910

namespace

1122

2324

}25 }

使用conditional特性的情況輸出情況是跟上面一致的。但當未定義debug符號時,debugmethod不會被編譯進msil。可以節省開銷

值得注意的是,應用了conditional特性的函式,返回型別只能為void

1

#define debug23

using

system;

4using

system.collections.generic;

5using

system.diagnostics;

6using

system.linq;

7using

system.text;

8using

system.threading.tasks;910

namespace

1120

21 [conditional("

debug")]

22static

void

debugmethod()

232627}

28 }

五、如何正確的對成員變數進行初始化(這個問題困擾了我好久,今天終於有解決方案了)大多情況下,使用成員初始化器對成員進行初始化。就是在宣告時就進行初始化,而不是放到建構函式。初始化器可以看做是建構函式中初始化語句的另一種表示。初始化器生成的**會在建構函式前執行。如果是派生類,初始化器會在父類的建構函式前執行,然後再執行子類的建構函式。

public

class

patient

}

下面三種情況,不推薦使用初始化器語法

1、值型別初始值設為0,引用型別初始值設為null的情況

系統預設的初始化工作將在所有**執行之前把一切都設定成0或null。系統生成0或者null的這一步操作是位於很底層的實現,會直接使用cpu指令將一整塊記憶體設定為0。

所以以下**是多餘的

1

int num = 0

;2 student stu = null;

2、需要對這個變數執行不同的初始化方式的情況。初始化器語法的前提是,所有的建構函式都會將變數設定為同樣的值。3、在進行初始化時,可能會引發異常的情況。這種情況下,就需要在建構函式中進行初始化,以便進行相應處理。六、區分值型別和引用型別

值型別應該是那些小型、輕量級的型別,分配在棧上

引用型別則用來構成類層次結構,分配在堆上。

有如下**

1 mytype arrayoftypes = new mytype[100];
如果mytype屬於值型別,那麼將一次分配大小為mytype的100倍空間

如果mytype屬於引用型別,那麼也僅會分配一次,陣列中的每個元素都為空。在初始化陣列中的元素時,將執行101次分配,101次分配要比1次分配更占用時間,分配大量的引用 型別將讓堆上充滿碎片。

還有一點值得注意的是,在集合中查詢元素時,如果集合裡是值型別,則查詢出來的元素跟集合中的元素是不同的引用。如果是引用型別,則查詢出來的元素跟集合中的該元素是相同的引用。在修改值的時候,會導致意外的發生。

有如下**

1

class

program2;

6 test2 test2 = new test2() ;

78 listlist1 = new list() ;

9var temp1 = list1.find(x => x.name == "

test1");

10 console.writeline(object

.referenceequals(test1,temp1));

1112 temp1.name = "

modified test1";

13 console.writeline(list1.elementat(0

).name);

1415 listlist2 = new list() ;

16var temp2 = list2.find(x => x.name == "

test2");

17 console.writeline(object

.referenceequals(test2,temp2));

1819 temp2.name = "

modified test2";

20 console.writeline(list2.elementat(0

).name);

2122

2324}25

}262728

struct

test1

2931}32

33class

test2

3436 }

執行結果如下

可以看到,查詢出來的值型別集合中的元素,跟新增時的元素並不是同乙個引用,而且修改值,也不會導致集合中元素的更改。

引用型別則相反。

高效C 程式設計

推薦編寫c 的 風格,看似容易,堅持不易,且寫且珍惜!陳國林 1.版本和版本宣告 版本和版本檔案宣告位於標頭檔案和定義檔案的開頭,主要內容 1 版本資訊 2 檔名稱 識別符號 摘要 3 當前的版本號 作者 修改日期 4 版本歷史資訊 2.程式版式 1 在每個類宣告之後 每個函式定義之後都要加上乙個空...

《C 高效程式設計》筆記(壹)

標籤 空格分隔 c 高效程式設計 本部落格是看 c 高效程式設計 的筆記,還在更新中。書張這樣 第一部分扯蛋,沒怎麼看,直接看第二部分。的確是好書,值得一看。三條指令教你做人 gcc s hello.c gcc c hello.c gcc e hello.c gcc e hello.c output...

python 高效程式設計

有時候,我們需要在兩台機器或服務之間做一些簡便的 很基礎的rpc之類的互動。我們希望用一種簡單的方式使用b程式呼叫a程式裡的乙個方法 有時是在另一台機器上。僅內部使用。我並不鼓勵將這裡介紹的方法用在非內部的 一次性的程式設計中。我們可以使用一種叫做xml rpc的協議 相對應的是這個python庫 ...