C# 当宿主方法被DebuggerHidden时防止lambda被介入 private static void Main() { WriteLine(GetRandomInteger()); Console.ReadLine(); } [调试程序隐藏] 私有静态int GetRandomInteger() { Func random=()=>4; 返回GetRandomInteger(随机); } [调试程序隐藏] 私有静态int-GetRandomInteger(Func-random) { 返回random(); }

C# 当宿主方法被DebuggerHidden时防止lambda被介入 private static void Main() { WriteLine(GetRandomInteger()); Console.ReadLine(); } [调试程序隐藏] 私有静态int GetRandomInteger() { Func random=()=>4; 返回GetRandomInteger(随机); } [调试程序隐藏] 私有静态int-GetRandomInteger(Func-random) { 返回random(); },c#,C#,使用上面的代码,有没有办法防止Func random=()=>4行在调试时不被介入?您可以使用带有[DebuggerHidden]属性的私有函数而不是labmda,并将Func委托设置为私有函数。[DebuggerHidden]可以在属性上使用,此属性的行为似乎与您所希望的一样: private static void Main() { Console.WriteLine(GetRandomInteger()); Console.ReadLine(); } [DebuggerH

使用上面的代码,有没有办法防止
Func random=()=>4行在调试时不被介入?

您可以使用带有
[DebuggerHidden]
属性的私有函数而不是labmda,并将
Func
委托设置为私有函数。

[DebuggerHidden]
可以在属性上使用,此属性的行为似乎与您所希望的一样:

private static void Main()
{
    Console.WriteLine(GetRandomInteger());
    Console.ReadLine();
}

[DebuggerHidden]
private static int GetRandomInteger()
{
    Func<int> random = () => 4;
    return GetRandomInteger(random);
}

[DebuggerHidden]
private static int GetRandomInteger(Func<int> random)
{
    return random();
}
[DebuggerHidden]
私有静态Func随机
{
获取{return()=>4;}
}

这是一个变通办法,就像另一个答案一样;但是,它保留了lambda,并且可能更接近原始意图。

您可以编辑IL,将
[DebuggerHidden]
属性应用于为匿名方法生成的函数,但我认为没有直接从C#执行此操作的方法。(一般来说,如果您接受任意的
Func
s,调试器将根据它们是否具有该属性对其进行处理。换句话说,该属性不是递归的。)这是lamdas无法解决的问题。理想情况下,C#编译器会将该属性传播到实现lambda的隐藏类。但事实并非如此,团队已经意识到了这个问题。他们当然不喜欢实现它,选择要传播的属性是一个滑铁卢。像往常一样,让Debug.StepOut随时可用。当我无法将lambda重写为私有方法时,我该怎么办?没有其他解决方法(除了下面的属性解决方法之外)。是什么阻止了您重写该方法?顺便说一下:如果您想知道新的“本地方法”是否会有所帮助,那么您似乎无法将属性应用于它们。另外请注意,Visual Studio具有intellisense功能,可以将lamba重写为您的私有方法,这可以为复杂的签名节省一些麻烦。从当前版本开始,您必须选择“引入本地”,然后选择“使用本地函数”,然后选择“转换为方法”。经过几年的经验之后,出现了一种情况,即匿名类不能移动到方法签名。我认为新的元组在这里会有所帮助,但我还没有在实践中使用它。
[DebuggerHidden]
private static Func<int> random
{
  get { return () => 4; }
}