2012-02-08 61 views
3

通常,在調查我正在開發的一些代碼時,我會在這裏或那裏拋出一個Console.WriteLine,程序運行時也會看到一個值。 Console.WriteLine的缺點是我必須在括號中包裝表達式,並可能會將其分開。例如,給出以下表達式:內聯顯示方法對快速檢查有用

a().b().c(); 

假設我想打印b()的值。我將不得不這樣做:

var val = a().b(); 

Console.WriteLine(val); 

val.c(); 

這是很多編輯只是爲了看到一個值。

我的解決辦法一直是使用這種擴展方法:

public static T Disp<T>(this T obj) 
{ 
    Console.WriteLine(obj); 
    return obj; 
} 

我可以注入的任何方法鏈Disp一個呼叫,而不改變整體表達式的值。要查看b()結果在上面的例子中,我會做:

a.().b().Disp().c() 

我的問題是,有沒有已經像.NET Disp一些方法?有沒有更好的方法來實施Disp?這種技術有缺點嗎?

更新2012-02-09

我還添加一個重載的版本,它接受的格式的字符串:

public static T Disp<T>(this T obj, string format) 
{ 
    Console.WriteLine(string.Format(format, obj)); 
    return obj; 
} 

回答

2

我看不出它有問題,雖然你可能會考慮更一般與Action<T>參數:

public static T Tap<T>(this T obj, Action<T> act) 
{ 
    act(obj); 
    return obj; 
} 

這類似於Ruby的Tap

而不是你Dump方法,你可以再做:

a.().b().Tap(Console.WriteLine).c() 
+0

呼叫良好。不過,我可能仍然有'Disp'作爲速記符號來定義'Tap'。 – dharmatech 2012-02-09 19:03:53

1

LINQPad使用Dump擴展方法以完全相同這種方式。

唯一的缺點是通用於所有的擴展方法:

  1. 擴展方法是靜態的,這限制了你的靈活性覆蓋其行爲的條款。
  2. 任何「使用」擴展方法的名稱空間的文件都將在每個對象上看到此方法。智能感知變得混亂,你冒着命名衝突的風險。
+0

感謝指針LINQPad及其'Dump'方法! – dharmatech 2012-02-09 19:02:26