C# lambda的堆栈异常

C# lambda的堆栈异常,c#,.net,lambda,C#,.net,Lambda,当我得到异常时,若我有lamda函数,那个么很难读取错误堆栈 例如,对于此代码: public void Test() { Func<AnotherClass, bool> myLambda = (AnotherClass p) => { if (p != null) { throw new Exception("Exception in method"); } return true; };

当我得到异常时,若我有lamda函数,那个么很难读取错误堆栈

例如,对于此代码:

public void Test()
{
 Func<AnotherClass, bool> myLambda = (AnotherClass p) =>
    {
    if (p != null)
    {
     throw new Exception("Exception in method");
    }
     return true;
    };        
     AnotherClass ac = new AnotherClass();        
     var r = myLambda(ac);   
}
public class AnotherClass
{
}   
公共无效测试()
{
Func myLambda=(另一类p)=>
{
如果(p!=null)
{
抛出新异常(“方法中的异常”);
}
返回true;
};        
AnotherClass ac=新的AnotherClass();
var r=myLambda(ac);
}
公共类另一类
{
}   
我将得到如下堆栈错误:

"CSharpTests.exe Error: 0 : System.Exception: Exception in method
   at CSharpTests.MarketingEntityManager.<>c.<Test>b__0_0(AnotherClass p)
   at CSharpTests.MarketingEntityManager.Test()
   at CSharpTests.DisplayClassTest.Test()"
“CSharpTests.exe错误:0:系统。异常:方法中的异常
在CSharpTests.MarketingEntityManager.c.b__0_0(另一个p类)
在CSharpTests.MarketingEntityManager.Test()上
在CSharpTests.DisplayClassTest.Test()中
有人问了很多次,什么是c.b_uu0

但另外有趣的是,可能是我在代码中使用的myLabda名称没有用于生成名称,而生成了b_uu0_0的原因


DisplayName文本在哪里?

您的匿名方法没有
myLambda
命名。匿名方法的委托被分配给
myLambda
局部变量。事实上,您的匿名方法有一个由编译器指定的“秘密”名称,它是
b_uu0_u0
(然后它被“隐藏”在名为
c
的嵌套类中),但是这个名称可以根据同一类中其他匿名方法的数量在不同的编译之间更改

举一个(退化的)例子(这在Javascript中非常常见),这是合法的:

((Func<AnotherClass, bool>)((AnotherClass p) =>
{
    if (p != null)
    {
        throw new Exception("Exception in method");
    }
    return true;
}))(new AnotherClass());        

这里的
x=>x+1
是一个匿名方法(其中一个委托由.NET创建,并传递给
Enumerable.Select
)。。。任何地方都没有名字。

您的匿名方法没有
myLambda
命名。匿名方法的委托被分配给
myLambda
局部变量。事实上,您的匿名方法有一个由编译器指定的“秘密”名称,它是
b_uu0_u0
(然后它被“隐藏”在名为
c
的嵌套类中),但是这个名称可以根据同一类中其他匿名方法的数量在不同的编译之间更改

举一个(退化的)例子(这在Javascript中非常常见),这是合法的:

((Func<AnotherClass, bool>)((AnotherClass p) =>
{
    if (p != null)
    {
        throw new Exception("Exception in method");
    }
    return true;
}))(new AnotherClass());        

这里的
x=>x+1
是一个匿名方法(其中一个委托由.NET创建,并传递给
Enumerable.Select
)。。。任何地方都没有名称。

myLamda
只是引用您的方法的代理的名称。它不是那种方法的名称。后者是由编译器生成的,您不能更改它

要澄清这一点,请想象一下,您根本没有匿名方法,并且会在委托中引用命名方法:

myLambda = MyMethod;

现在很清楚stacktrace将包含
MyMethod
,而不是
myLambda
,不是吗?

myLamda
只是引用您的方法的委托的名称。它不是那种方法的名称。后者是由编译器生成的,您不能更改它

要澄清这一点,请想象一下,您根本没有匿名方法,并且会在委托中引用命名方法:

myLambda = MyMethod;

现在很清楚stacktrace将包含
MyMethod
,而不是
myLambda
,不是吗?

你的意思是:“它被问了很多次,”?
myLambda
只是一个变量的常用名称,在你的例子中,它是一个方法引用的名称。但是,堆栈跟踪将包含方法名称,而不是该方法引用的名称。在StackOverflow和internet中多次询问,但从未真正解释过,因为它是作为生成代码生成名称,问题是我必须读取堆栈异常,并且生成的名称不是真正的用户友好型。您的意思是:“有人问了很多次,“?
myLambda
只是一个变量的常用名称,在您的例子中,它是一个方法引用的名称。但是,堆栈跟踪将包含方法名称,而不是该方法引用的名称。在StackOverflow和internet中多次询问,但从未真正解释过,因为它是生成代码生成名称,问题是我必须读取堆栈异常,并且生成的名称不是真正用户友好的
c
可能是针对类,但是你知道
b
和这两个数字的(秘密)含义吗?我假设最后一个
0
是一个计数器,但为什么之前的
0
是计数器?@MaartenBodewes看着sharplab(不能共享链接,太长了),第一个数字似乎是方法“number”(类中的第一个方法是0,然后是1,…),第二个数字是匿名函数号。如果匿名方法捕获了一些变量,那么它将被移动到
c_udisplayClass1_0
子类,并且编号更改为
b_u0()
很好的解释,我假设我需要一些[DebuggerAttribute]让lambda函数显示我想要显示的名称。我会把它发布到用户语音中。@good现在甚至还有本地方法。。。他们把名字弄乱了,比如
g_uumethodname | 0_0
c
可能是用来上课的,但是你知道
b
和这两个数字的(秘密)含义吗?我假设最后一个
0
是一个计数器,但为什么之前的
0
是计数器?@MaartenBodewes看着sharplab(不能共享链接,太长了),第一个数字似乎是方法“number”(类中的第一个方法是0,然后是1,…),第二个数字是匿名函数号。如果匿名方法捕获了一些变量,那么它将被移动到
c_udisplayClass1_0
子类,并且编号更改为
b_u0()
很好的解释,我假设我需要一些[DebuggerAttribute]让lambda函数显示我想要显示的名称。我会把它发布到用户语音中。@good现在甚至还有本地方法。。。他们把名字弄得乱七八糟<