看乙個小專案**的時候發現bll和dal兩層所有的方法都宣告為靜態方法,第一感覺就是採用這種方式不和諧,但又說不出所以然。檢視了msdn和clr via c#資料總結如下:
msdn:靜態方法可以被過載而不能被重寫。靜態方法和屬性不能訪問其包含型別中的非靜態欄位和事件,並且不能訪問任何物件的例項變數(除非在方法引數中顯式傳遞)。對靜態方法的呼叫以 microsoft 中間語言 (msil) 生成呼叫指令,而對例項方法的呼叫生成 callvirt 指令,該指令還檢查 null 物件引用。但是,兩者之間的效能差異在大多數時候並不明顯。下圖1可以看出例項方法的呼叫指令。
圖1clr via c#:呼叫乙個靜態方法時,clr會定位與定義靜態方法的型別對應的型別物件。然後,jit編譯器在型別物件的方法表中查詢與被呼叫的方法對應的記錄項,對方法進行jit編譯(如果需要的話),再呼叫jit編譯的**。過程圖如下:
圖2小結:
一般情況下宣告靜態方法的類大多是工具類,並且這些靜態方法不需要訪問型別中的非靜態欄位和事件,也就是說靜態方法與該型別中的非靜態欄位和事件不具有邏輯上的關聯性。
如果乙個方法宣告為靜態方法,也意味著不能被重寫,該方法失去物件導向的擴充套件和多型的特性。
靜態方法與例項方法在效能和占用記憶體上沒有明顯的區別,是否宣告為靜態方法需要從型別的非靜態字段、事件、物件導向擴充套件和多型這三方面來考慮。
C 靜態方法
學習c 靜態函式及變數的乙個精典例子與 1 用於對靜態字段 唯讀欄位等的初始化。2 新增static關鍵字,不能新增訪問修飾符,因為靜態建構函式都是私有的。3 類的靜態建構函式在給定應用程式域中至多執行一次 只有建立類的例項或者引用類的任何靜態成員才激發靜態建構函式 4 靜態建構函式是不可繼承的,而...
C 靜態方法
靜態方法是一種特殊的成員方法,它不屬於類的某乙個具體的例項。非靜態方法可以訪問類中的任何成員,而靜態只能訪問類中的靜態成員。看這個例子 class a 在這個類定義中,靜態方法f 可以訪問類中靜態成員y,但不能訪問非靜態成員x。這是因為,x作為非靜態成員,在類的每個例項中都占有乙個儲存 或者說具有乙...
C 靜態方法
靜態方法是一種 特殊的成員方法,它不屬於類的某乙個具體的例項,而是屬於類本身。所以對靜態方法不需要 首先建立乙個類的例項,而是採用類名.靜態方法的格式 靜態成員存在於記憶體,非靜態成員需要例項化才會分配記憶體,所以靜態成員不能訪問非靜態的成員.因為靜態成員 存在於記憶體,所以非靜態成員可以直接訪問類...