11

C# 扩展方法的第一个参数是调用扩展方法的实例。我采用了一个习惯用法,在别处没有看到它,称该变量为“自我”。如果其他人也使用它,我一点也不感到惊讶。这是一个例子:

public static void Print(this string self)
{
   if(self != null) Console.WriteLine(self);
}

但是,我开始看到其他人将该参数命名为“@this”,如下所示:

public static void Print(this string @this)
{
   if(@this != null) Console.WriteLine(@this);
}

作为第三种选择,有些人根本不喜欢任何成语,说“self”和“@this”不提供任何信息。我想我们都同意,有时参数有一个明确、有意义的名称,特定于它的目的,这比“self”或“@this”更好。有些人走得更远,说你总能想出一个更有价值的名字。所以这是另一个有效的观点。

你还见过哪些成语?你喜欢什么成语,为什么?

4

6 回答 6

16

根据用途,我很正常地命名它。因此,“source”表示 LINQ 运算符的源序列,或“argument”/“parameter”表示进行参数/参数检查的扩展等。

我不认为它必须与“this”或“self”特别相关——这并没有提供关于参数含义的任何额外信息。当然这是最重要的。

编辑:即使在没有很多明显含义的情况下,我更喜欢some meaning to none。“self”或“@this”赋予了哪些信息?仅仅是它是扩展方法中的第一个参数 - 并且该信息已经通过参数装饰的事实显而易见thistheStringToPrint在给出/选项的示例情况下self,我会改用outputText它 - 它传达了您需要了解的有关参数 IMO 的所有信息。

于 2009-04-04T06:26:53.087 回答
4

如果它是一个普通的旧静态方法,我会准确地命名变量。原因是它仍然可以作为静态方法调用,您必须在代码中考虑该用例。

看待这一点的最简单方法是参数验证。考虑将 null 传递到您的方法中的情况。您应该进行参数检查并抛出 ArgumentNullException。如果它实施得当,您需要像这样将“this”作为参数名称。

public static void Print(this string @this) {
  if ( null == @this ) {
    throw new ArgumentNullException("this");
  }
  ...
}

现在有人正在对你的库进行编码,突然得到一个异常对话框,上面写着“这是空的”。他们会最困惑:)

这是一个人为的例子,但总的来说,我对待扩展方法与普通的旧静态方法没有什么不同。我发现这让他们更容易推理。

于 2009-04-04T13:48:07.627 回答
3

我见过使用 obj 和 val 。我不喜欢这个。我们应该尽量避免使用关键字。我从未见过自己,但我喜欢它。

于 2009-04-04T06:15:30.150 回答
2

我称它为“目标”,因为扩展方法将对该参数进行操作。

于 2009-04-04T07:13:57.387 回答
2

我认为应该避免使用 @this,因为它使用了有史以来最无用的语言特定功能 (@)。事实上,应该避免任何可能导致混淆或降低可读性的事情,例如关键字出现在它们不是关键字的地方。self 让我想起了 python,但可能有利于一致的命名约定,因为很明显它指的是正在使用的实例,而不需要一些讨厌的句法技巧。

于 2009-04-04T13:25:37.540 回答
1

你可以做这样的事情......

public static void Print(this string extended)
{
   if(extended != null) Console.WriteLine(extended);
}
于 2009-04-04T06:22:10.960 回答