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

C# 在C中通过调用堆栈共享实例#,c#,callstack,C#,Callstack,请检查以下功能: public void DoJob() { CheckPrivilege(); DoJob2(); } public void DoJob2() { CheckPrivilege(); DoJob3(); } 如您所见,如果调用DoJob(),则CheckPrivilege()函数将运行两次。有时我可以直接调用DoJob2(),因此无法从DoJob2()中删除CheckPrivilege()函数 所以我需要知道CheckPrivilege()

请检查以下功能:

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

public void DoJob2()
{
    CheckPrivilege();
    DoJob3();
}
如您所见,如果调用
DoJob()
,则
CheckPrivilege()
函数将运行两次。有时我可以直接调用
DoJob2()
,因此无法从
DoJob2()
中删除
CheckPrivilege()
函数

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

也就是说,我希望通过调用堆栈共享特权对象


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

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

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

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

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

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

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

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

function void DoJob2_Internal()
{
    DoJob3_Internal();
}

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

C还是C?发布问题时请花更多时间。你的问题也不清楚。我没有投反对票,所以请给我一个不投反对票的理由。告诉我们你的目标到底是什么,否则你不会从圣诞老人那里得到任何礼物。我只是在用c#编辑帖子,所以我想通过调用堆栈共享一个实例。例如,我想在DoJob()函数中存储一个实例,然后在DoJob2()函数中,我想检查callstack中是否有存储的实例这个问题的动机是什么?调用是昂贵的还是只是为了避免重复代码?是的,CheckPrivilege()非常昂贵,在许多函数中都会调用它。有时它会执行7-8次,并给出与以前在许多函数中调用的callCheckPrivilege()完全相同的结果。所以我不能在每个函数上传递doPrivCheck参数。这就是我想知道的原因,我可以将此参数存储在调用堆栈中吗。@brtb您可以将其存储为这些函数所在的包含类的属性吗?只是出于好奇,为什么不能在所有调用中传递一个变量?这只是一种偏好吗?否则,您必须将权限检查的结果存储在某个地方。堆栈不是这样做的地方。请参阅@MartinSmith的评论。@MartinSmith有很多类。@brtb我想从技术上讲,你可以做到。与
TransactionScope
的工作方式类似。我不知道这是怎么回事。可能是线程本地存储。