Стек в исключении для лямбды - PullRequest
0 голосов
/ 23 мая 2018

Когда я получаю исключение, довольно сложно прочитать стек ошибок, если у меня есть функции 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
{
}   

Я получу ошибку стека как:

"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()"

Много раз спрашивали, что такое <> c.b__0_0

Но, кроме того, интересно, почему myLabda имя, которое я использовал в своем коде, не использовалось для генерации имени, и был сгенерирован b__0_0.

и где текст DisplayName?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

myLamda - это просто имя делегата , на которое ссылается вашего метода.Это не название этого метода .Последний генерируется компилятором, вы не можете его изменить.

Чтобы прояснить это немного, представьте, что у вас вообще не было анонимного метода, и вы бы ссылались на названный метод с вашим делегатом:

myLambda = MyMethod;

Теперь этоСовершенно ясно, что трассировка стека будет содержать MyMethod, а не myLambda, не так ли?

0 голосов
/ 23 мая 2018

Ваш анонимный метод не с именем myLambda.Делегат анонимного метода назначается локальной переменной myLambda.По правде говоря, у вашего анонимного метода есть «секретное» имя, присвоенное ему компилятором, и оно <Test>b__0_0 (и затем оно «скрыто» во вложенном классе с именем <>c), но это имя может меняться междукомпиляции, основанные на количестве других анонимных методов в том же классе.

Чтобы привести (вырожденный) пример (который очень распространен в Javascript), это допустимо:

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

Здесьмы не присваиваем делегат метода какой-либо переменной, но используем его немедленно для вызова класса.Количество скобок ужасно: -)

Другой классический пример:

var coll = new int[5];
var enu = coll.Select(x => x + 1).ToArray();

Здесь x => x + 1 - это анонимный метод (из которого .NET создает делегат и передает егоEnumerable.Select) ... Нигде нет имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...