C 基礎知識回顧 你不知道的Lazy

2022-01-14 13:01:37 字數 1768 閱讀 1827

物件的建立方式,始終代表了軟體工業的生產力方向,代表了先進軟體技術發展的方向,也代表了廣大程式開發者的集體智慧型。以new的方式建立,通過工廠方法,利用ioc容器,都以不同的方式實現了活生生例項成員的創生。而本文所關注的lazy也是幹這事兒的。不過,簡單說來,lazy要實現的就是按「需」建立,而不是按時建立。

我們往往有這樣的情景,乙個關聯物件的建立需要較大的開銷,為了避免在每次執行時建立這種傢伙,有一種聰明的辦法叫做實現「懶物件」,或者延遲載入。.net 4.0之前,實現懶物件的機制,需要開發者自己來實現與管理它的定義如下:

[serializable]

public

class lazy

public t value

public

override

string

tostring();

}

假設,我們有乙個大塊頭:

public

class

big

//other resources

}

static

void main(string

args)

當然,有其定義可知,lazy遠沒有這麼小兒科,它同時還可以為我們提供以下的服務:

顯而易見。我們的big類並沒有提供帶引數建構函式,那麼如下的big類:

public

class

big

public

int id

//other resources

}

上述建立方式將引發執行時異常,提示包裝物件沒有無參的建構函式。那麼,這種情形下的延遲載入,該如何應對呢?其實lazy的構造中還包括:

public 

lazy(

func

valuefactory);

它正是用來應對這樣的挑戰:

static void 

main(

string

args)

其實,從public lazy(funcvaluefactory)的定義可知,valuefactory可以返回任意的t例項,那麼任何複雜的建構函式,物件工廠或者ioc容器方式都可以在此以輕鬆的方式相容,例如:

public class 

bigfactory

}

可以應用lazy和bigfactory實現big的延遲載入:

static void 

main(

string

args)

另外的構造器:

public 

lazy(

bool

isthreadsafe);

public

lazy(

func

valuefactory,

bool

isthreadsafe);

中,isthreadsafe則應用於多執行緒環境下,如果isthreadsafe為false,那麼延遲載入物件則一次只能建立於乙個執行緒。

關於lazy的應用,其實已經不是乙個純粹的語言問題,還涉及了對設計的考量,例如實現整個物件的延遲載入,或者實現延遲屬性,考量執行緒安全等等。就不說教太多。因為,.net 4.0提供的關注度實在不少,我們眼花繚亂了。

鄭重宣告本文非原創……

這些ARM基礎知識你還不知道嗎

msb 最高有效位 lsb 最低有效位 ahb 先進的高效能匯流排 vpb 連線片內外設功能的vlsi外設匯流排 emc 外部儲存器控制器 mam 儲存器加速模組 vic 向量中斷控制器 spi 全雙工序列介面 pwm 脈寬調變器 etm 嵌入式跟蹤巨集 cpsr 當前程式狀態暫存器 spsr 程式...

你不知道的css小知識

使用 webkit transform scale 一種字型有粗體 斜體 下劃線 刪除線等諸多屬性。但是並不是所有字型都做了這些,一些不常用的字型,或許就只有個正常體,如果你用italic,就沒有效果了 這時候你就要用oblique.可以理解成italic是使用文字的斜體,oblique是讓沒有斜體...

C語言之那些你不知道的知識

目錄 定義常量 define 預處理器 const 關鍵字 在 c 中,有兩種簡單的定義常量的方式 使用 define預處理器。使用const關鍵字。下面是使用 define 預處理器定義常量的形式 define identifier value具體請看下面的例項 include define le...