在C#中通过调用堆栈共享实例

时间:2015-12-27 20:25:58

标签: c# callstack

请检查以下功能:

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

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

如您所见,如果我拨打DoJob()CheckPrivilege()功能会运行两次。有时我可以直接致电DoJob2(),因此我无法从CheckPrivilege()移除DoJob2()功能。

所以我需要知道CheckPrivilege()函数是在同一个调用堆栈中的另一个函数中调用的。

也就是说,我想在调用堆栈上共享一个Privilege对象。

这可能吗?如果是,怎么样?

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到,但“通过callstack共享”是不可能的。您可以保留一个状态变量,指示当前任务是否具有特权或执行此类操作。

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

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

答案 1 :(得分:0)

定义'内部'和'外部'接口函数。外部函数执行权限检查,任何人都可以调用;内部函数不进行检查,只应由实现调用。

将您的职能视为“外部”职能:

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

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

function void DoJob2_Internal()
{
    DoJob3_Internal();
}

该原则适用于任何语言 - 我不是C#程序员,因此我无法告诉您C#的哪些特定功能将强制执行访问控制或功能可见性,或者您是否必须依赖约定。