javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

git

.net

ios

ruby-on-rails

sql

c

string

ruby

检索方法中的调用方法名称

可能重复:
如何找到调用当前方法的方法?

我在对象中有一个方法,可以从对象中的许多地方调用该方法。 有没有一种快速简便的方法来获取称为此流行方法的方法的名称。

伪代码示例:

public Main()
{
     PopularMethod();
}

public ButtonClick(object sender, EventArgs e)
{
     PopularMethod();
}

public Button2Click(object sender, EventArgs e)
{
     PopularMethod();
}

public void PopularMethod()
{
     //Get calling method name
}

PopularMethod()中,如果要从StackTrace调用它,我希望看到System.Reflection.MethodBase.GetCurrentMethod()的值...如果要从PopularMethod()调用PopularMethod(),我希望看到“ ButtonClick

我一直在查看System.Reflection.MethodBase.GetCurrentMethod(),但这无法获取调用方法。 我已经看过了StackTrace类,但我确实不喜欢每次调用该方法都运行整个堆栈跟踪。

trans by 2019-11-08T17:57:03Z

__stdcall的含义和用法是什么?

这些天,我遇到了很多__stdcall

MSDN并未非常清楚地说明其真正含义,何时以及为什么使用它(如果有的话)。

如果有人提供解释,最好提供一个或两个示例,我将不胜感激。

trans by 2019-10-03T16:21:50Z

windows - 为什么Windows64在x86-64上使用来自所有其他操作系统的不同调用约定?

AMD有一个ABI规范,描述了在x86-64上使用的调用约定。 所有操作系统都遵循它,除了拥有它自己的x86-64调用约定的Windows。 为什么?

有没有人知道这种差异的技术,历史或政治原因,还是纯粹是NIH综合症的问题?

我知道不同的操作系统可能对更高级别的东西有不同的需求,但这并不能解释为什么例如Windows上的寄存器参数传递顺序是rcx - rdx - r8 - r9 - rest on stack,而其他人都使用rdi - rsi - rdx - rcx - r8 - r9 - rest on stack

附: 我知道这些调用约定一般是如何不同的,如果需要,我知道在哪里可以找到详细信息。 我想知道的是为什么。

编辑:有关方法,请参阅例如 维基百科条目和那里的链接。

trans by 2019-08-12T10:43:03Z

assembly - callstack究竟是如何工作的?

我试图更深入地了解编程语言的低级操作是如何工作的,尤其是它们如何与OS / CPU交互。 我可能已经在Stack Overflow上阅读了每个堆栈/堆相关线程中的每个答案,并且它们都很棒。 但是还有一件事我还没有完全理解。

在伪代码中考虑这个函数,这往往是有效的Rust代码;-)

fn foo() {
    let a = 1;
    let b = 2;
    let c = 3;
    let d = 4;

    // line X

    doSomething(a, b);
    doAnotherThing(c, d);
}

这就是我假设堆栈在X行上的样子:

Stack

a +-------------+
  | 1           | 
b +-------------+     
  | 2           |  
c +-------------+
  | 3           | 
d +-------------+     
  | 4           | 
  +-------------+ 

现在,我所读到的关于堆栈如何工作的一切都是它严格遵守LIFO规则(后进先出)。 就像.NET,Java或任何其他编程语言中的堆栈数据类型一样。

但如果是这样,那么在X行之后会发生什么? 因为很明显,接下来我们需要的是使用ab,但这意味着OS / CPU(?)必须首先弹出bfoo才能回到ab。但是它会射击自己 在脚下,因为它需要cd在下一行。

所以,我想知道幕后究竟发生了什么?

另一个相关问题。 考虑我们传递对其他函数的引用,如下所示:

fn foo() {
    let a = 1;
    let b = 2;
    let c = 3;
    let d = 4;

    // line X

    doSomething(&a, &b);
    doAnotherThing(c, d);
}

根据我的理解,这将意味着a中的参数实际上指向bb中的bb中的相同内存地址。但是这又意味着在我们到达ab之前没有弹出堆栈。

这两个案例让我觉得我还没有完全掌握堆栈的工作原理以及它如何严格遵循LIFO规则。

trans by 2019-08-09T16:19:48Z

1 共1页