2015-12-27 41 views
-3

勾選下方的功能,請:在C#分享一個實例在調用堆棧

public void DoJob() 
{ 
    CheckPrivilege(); 
    DoJob2(); 
} 

public void DoJob2() 
{ 
    CheckPrivilege(); 
    DoJob3(); 
} 

正如你可以看到,如果我叫DoJob(),該CheckPrivilege()函數運行兩次。有時我可以直接撥打DoJob2(),因此我無法從DoJob2()刪除CheckPrivilege()功能。

所以我需要知道CheckPrivilege()功能是在另一個函數調用在同一個調用棧中。

也就是說,我想通過調用堆棧共享權限對象。

這可能嗎?如果是,如何?

+7

c#or c?發佈問題時請多花點時間。你的問題也不清楚。我沒有倒下,所以給我一個不這樣做的理由。告訴我們你的目標究竟是什麼,或者你沒有收到聖誕老人的任何禮物。 – gsamaras

+0

我只是編輯後,在C#,因爲我傷心,我想通過調用堆棧共享實例。例如,我想在DoJob()函數中存儲實例,然後在DoJob2()函數中,我想檢查調用堆棧中是否存儲了任何實例 – brtb

+0

問題的動機是什麼?通話費用昂貴還是你只是想避免重複的代碼? –

回答

0

有很多方法可以做到,但'通過調用堆棧共享'是不可能的。您可以保留一個狀態變量,指示當前任務是否具有特權或執行此類操作。

function void DoJob() 
{ 
    CheckPrivilege(); 
    DoJob2(false); 
} 

function void DoJob2(bool doPrivCheck) 
{ 
    if (doPrivCheck) 
     CheckPrivilege(); 
    DoJob3(); 
} 
+0

CheckPrivilege()在許多函數中被調用。所以我無法通過每個函數傳遞doPrivCheck參數。這就是爲什麼我想知道,我可以將這個參數存儲在調用堆棧中。 – brtb

+0

@brtb你可以將它作爲這些函數所在的包含類的屬性來存儲嗎? –

+0

出於好奇,爲什麼你不能在所有通話中傳遞一個變量?這只是一種偏好嗎?否則,你必須將特權檢查的結果存儲在某個地方。堆棧不是做它的地方。請參閱@ MartinSmith的評論。 – JJF

0

定義'內部'和'外部'接口功能。外部函數執行特權檢查並可以被任何人調用;內部函數不執行檢查,只應由實現調用。

治療你作爲「外部」的:

function void DoJob() 
{ 
    CheckPrivilege(); 
    DoJob2_Internal(); 
} 

function void DoJob2() 
{ 
    CheckPrivilege(); 
    DoJob3_Internal(); 
} 

function void DoJob2_Internal() 
{ 
    DoJob3_Internal(); 
} 

原則適用於任何語言 - 我不是一個C#程序員,所以我不能告訴你什麼樣的C#具體功能將強制執行訪問控制或功能可見性,還是您必須依賴約定。