您喜欢用什么成语(如果有的话)来命名;这";C#中扩展方法的参数,为什么?

您喜欢用什么成语(如果有的话)来命名;这";C#中扩展方法的参数,为什么?,c#,.net,c#-3.0,extension-methods,idioms,C#,.net,C# 3.0,Extension Methods,Idioms,C#扩展方法的第一个参数是调用扩展方法的实例。我采用了一个习语,称这个变量为“self”,在别处我没有看到。如果其他人也在使用它,我一点也不会感到惊讶。下面是一个例子: public static void Print(this string self) { if(self != null) Console.WriteLine(self); } 但是,我开始看到其他人将该参数命名为“@this”,如下所示: public static void Print(this string @th

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

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”更好。有些人更进一步说,你总能想出一个更有价值的名字。这是另一个有效的观点


你还看到了什么成语?你喜欢什么成语,为什么?

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

你可以这样做

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

根据使用情况,我很正常地给它命名。因此,对于LINQ运算符的源序列,使用“source”,对于执行参数/参数检查的扩展,使用“argument”/“parameter”,等等

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


编辑:即使在没有太多明显意义的情况下,我还是希望有一些意义而不是没有。“self”或“this”赋予了什么信息?仅仅是它是扩展方法中的第一个参数,而且该信息已经很明显,因为该参数用
this
修饰。在示例中,如果给定了
stringtoprit
/
self
选项,我将使用
outputText
——它传递您需要了解的有关参数的所有信息,IMO.

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

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

如果变量是一个简单的旧静态方法,我会准确地命名它。原因是它仍然可以被称为静态方法,并且必须考虑代码中的用例。 最简单的方法是参数验证。考虑NULL传入您的方法的情况。您应该执行参数检查并引发ArgumentNullException。如果它得到了正确的实现,您需要像这样将“this”作为参数名

public static void Print(this string @this) {
  if ( null == @this ) {
    throw new ArgumentNullException("this");
  }
  ...
}
现在有人在对你的库进行编码,突然得到一个异常对话框,上面写着“this is null”。他们会非常困惑:)


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

我倾向于同意回避关键词。你用@来转义关键词这是一个关键词。不,你不能:)你是想一致地使用“@this”还是一致地使用“extended”呢?他只是指出你有一个打字错误。在一个地方你仍然使用“@this”,在另一个地方,你使用“extended”。在很多情况下,我同意你的看法。但是,扩展方法通常非常通用,没有比“theStringToPrint”更好的名称了。我将编辑我的帖子来区分这两种情况。酷。我不能说我确信,但你肯定有一个合理的观点。我知道我写了两种扩展方法。当有一个有意义的名字时,我就用它。但在很多情况下,我能提供的最好信息是,这是一个“类似自我”的参数。对于一个非扩展静态方法,你会把这个参数称为什么?只是澄清一下——在某种程度上,我肯定是在扮演魔鬼的代言人。我们都编写过这样的方法,其中参数名基本上是类型名:“Customer-Customer”等,这也不会增加多少价值。我想我更喜欢它而不是“self”或“this”,因为它仍然描述参数。还请记住,扩展方法仍然可以按常规方式调用,然后调用“this”参数“self”或类似的参数可能会让人困惑。是的!与单元测试相同,这是操作方法的目标。大多数方法没有明确的“目标”,但单元测试和静态方法有。该方法的全部目的是使一个对象成为该方法的目标。