1:
jit(即時編譯)。乙個方法在第一次呼叫時
jit會把改方法的
il**轉換成
cpu指令,再次呼叫該方法時就只需執行對應的指令。方法第一次被呼叫的過程大致是:
1獲得方法的
il**;
2:分配記憶體;3:將
il**轉換成
cpu指令存在
2分配的記憶體中;
4:將方法表中對應該方法的指標指向
2分配的記憶體;
5:跳轉到
2分配的記憶體執行其中的指令,即該方法的
cpu指令。
2:as
的效能高於is。
is的作用是判斷當前型別與目標型別是否相容,即是否是同一型別或者目標型別是當前型別的父型別。強制型別轉換也要判斷型別的相容性,如果不相容就丟擲乙個型別轉換異常,如果你的**型別轉換用
is+強制型別轉換就做了兩次相容性判斷,而
as只有一次型別轉換。
3:c#
中的int
對應fcl
中的int32
,long對應fcl中的int64,
同一型別,64位
cpu所需儲存的空間是32位
cpu的2倍。
4:string
是引用型別,常量字串都存在字串池中,如果乙個字串在**中多次出現,那麼這些都是對字串池的引用,
string s="a"+"b";
只分配了一次記憶體,編譯器會直接將其編譯成
string s="ab";s
是對字串池中
ab的引用。
5:大量字串的拼接用
stringbuilder
,少量則用字串相加,能用
+=則更好,
string.format
的效率是低下的,它的記憶體其實是params object +stringbuilder,
params
也是低效的,字串相加,或是取其中的一部分都是要重新分配記憶體,然後將對應的字串存入。
fcl大部分**都是用
c#寫的,而操作字串這一塊用的是非託管**寫的,處於對效能的考慮。
6:別看到
new就以為會在託管堆中分配記憶體,值型別的變數就是分配中線程棧上的,結構體雖然可以用
new,但是編譯器推斷出它是值型別,就會按照值型別的處理,當然
il**中是沒有
newobj
指令的。
7:靜態類被編譯成
sealed abstract
型別,所以他不能被繼承,不能被例項化,所以他的屬性和方法都是屬於型別的,沒有屬於物件的,它必須直接繼承
object。
8:const
和readonly
的區別,
il**中存的是
const
變數的值,而不是引用,所以修改是不可能的,如果乙個
dll只引用了另乙個
dll中的乙個
const
變數,那麼這個
dll是不會被引用的,因為編譯的時候就知道變數的值了,所以在執行的時候也不會分配記憶體,
readonly
表示你不能修改它的指向,但是可以修改它所指向變數的值。
9:泛型,
c#中的泛型和
c++的模版區別在於引用型別,
c++模版會每一種型別都會生成乙個新的型別(引用型別是不會的),而
c#泛型中,引用型別用的是同乙個型別,只有值型別用的是不同的型別。因為引用都是乙個指標的引用,而值型別儲存所需的空間是不同的。在c++中有模版半特化,將t 半特化成void*,這樣指標型別就不用再生成一套**了
其他基礎知識,請看這篇部落格:這些天寫的技術微博
部落格:
C 基礎知識
抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...
c 基礎知識
或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....
C 基礎知識
1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...