2013-05-20 41 views
4
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(); 
} 

使用上面的代碼,有沒有辦法阻止Func<int> random =() => 4;行在調試時進入?當主機方法爲DebuggerHidden時,防止lambda進入步驟DebuggerHidden

+1

您可以編輯IL以將'[DebuggerHidden]'屬性應用於爲匿名方法生成的函數,但我不認爲有直接從C#執行此操作的方法。 (一般來說,如果你接受任意的'Func ',調試器將根據它們是否具有該屬性來進入它們,換句話說,該屬性不是遞歸的。) – dlev

+1

這是一個不可解的拉姆達斯問題。理想情況下,C#編譯器會將屬性傳播給實現lambda的隱藏類。但它並沒有這樣做,團隊已經意識到了這個問題。他們肯定不喜歡實施它,選擇傳播的屬性是一個滑坡。一如既往地保持Debug.StepOut方便。 –

回答

4

那麼你可以使用私有函數[DebuggerHidden]屬性而不是labmda,並將Func<int>代理設置爲私有函數。

+1

這是我目前的解決方法,所以對你+1。 –

2

[DebuggerHidden]可以在屬性中使用,這個屬性似乎表現,你想:

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

這是一個解決辦法,像其他的答案;但是,它保留了lambda,並且可能更接近原始意圖。