内嵌显示方法可用于快速检查

发布于 2025-01-03 19:01:07 字数 912 浏览 1 评论 0原文

通常,在研究我正在开发的某些代码时,我会在此处或那里插入一个 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;
}

Often, while investigating some code I'm developing, I'll throw in a Console.WriteLine here or there too see a value when the program is run. The drawback to Console.WriteLine is that I have to wrap an expression in parenthesis and possibly break it apart. For example given this expression:

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

let's suppose I want to print the value of b(). I'll have to do something like:

var val = a().b();

Console.WriteLine(val);

val.c();

That's alot of editing just to see a value.

My solution has been to use this extension method:

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

I can inject a call to Disp in any method chain without altering the value of the overall expression. To see the result of b() in the above example, I'd do:

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

My question is, is there already some method like Disp in .NET? Is there a better way to implement Disp? Are there drawbacks to this technique?

update 2012-02-09

I also added an overloaded version which accepts a format string:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我不在是我 2025-01-10 19:01:07

我认为它没有问题,尽管您可能会考虑使用 Action 参数使其更通用:

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

这类似于 Tap 在 Ruby 中。

您可以执行以下操作,而不是使用 Dump 方法:

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

I don't see a problem with it, although you might consider making it more general with an Action<T> parameter:

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

This is similar to Tap in Ruby.

Instead of your Dump method you can then do:

a.().b().Tap(Console.WriteLine).c()
生寂 2025-01-10 19:01:07

LINQPad 正是以这种方式使用 Dump 扩展方法。

所有扩展方法都有一个共同的缺点:

  1. 扩展方法是静态的,这限制了您覆盖其行为的灵活性。
  2. 任何“使用”扩展方法的命名空间的文件都会在每个对象上看到此方法。智能感知变得混乱,并且您面临命名冲突的风险。

LINQPad uses a Dump extension method in exactly this way.

The only downsides are common to all extension methods:

  1. Extension methods are static, which restricts your flexibility in terms of overriding their behavior.
  2. Any file that is "using" the extension method's namespace will see this method on every object. Intellisense gets cluttered and you run the risk of naming collisions.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文