【问题标题】:Share an instance over a call stack in C#在 C# 中通过调用堆栈共享实例
【发布时间】:2016-04-01 18:28:17
【问题描述】:

请检查以下功能:

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

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

如您所见,如果我调用DoJob()CheckPrivilege() 函数会运行两次。有时我可以直接调用DoJob2(),所以我无法从DoJob2() 中删除CheckPrivilege() 函数。

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

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

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

【问题讨论】:

  • c# 还是 c?发布问题时请花更多时间。你的问题也不清楚。我没有投反对票,所以给我一个不这样做的理由。告诉我们您的目标到底是什么,否则您将没有收到圣诞老人的任何礼物。
  • 我只是在用 c# 编辑帖子,所以我很伤心,我想通过调用堆栈共享一个实例。例如我想在 DoJob() 函数中存储一个实例,然后在 DoJob2() 函数中我想检查调用堆栈中是否有任何存储的实例
  • 提问的动机是什么?调用成本高还是您只是想避免重复代码?
  • 是的 CheckPrivilege() 非常昂贵,并且在许多函数中都会调用它。有时它会执行 7-8 次并给出与前一次调用完全相同的结果

标签: c# callstack


【解决方案1】:

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

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

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

【讨论】:

  • CheckPrivilege() 在许多函数中被调用。所以我不能在每个函数上传递 doPrivCheck 参数。这就是我想知道的原因,我可以将此参数存储在调用堆栈中吗?
  • @brtb 你能把它存储为包含这些函数的类的属性吗?
  • 只是出于好奇,为什么不能在所有调用中传递一个变量?这只是一种偏好吗?否则,您必须将权限检查的结果存储在某处。堆栈不是这样做的地方。请参阅@MartinSmith 的评论。
  • @MartinSmith 有很多类。
  • @brtb 好吧,我想从技术上讲你可以做到。与TransactionScope 的工作方式类似。不知道它是如何工作的。可能是线程本地存储。
【解决方案2】:

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

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

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

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

function void DoJob2_Internal()
{
    DoJob3_Internal();
}

该原则适用于任何语言——我不是 C# 程序员,所以我不能告诉你 C# 的哪些特定特性会强制访问控制或函数可见性,或者你是否必须依赖约定。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多