Какую идиому (если есть) вы предпочитаете присвоить имя параметру "this" методам расширения на С# и почему?

Первым параметром метода расширения С# является экземпляр, в который был вызван метод расширения. Я принял идиому, не видя ее в другом месте, называть эту переменную "я" . Я бы не удивился, если другие тоже используют это. Вот пример:

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);
}

И как третий вариант, некоторые предпочитают вообще никакой идиомы, говоря, что "я" и "@this" не дают никакой информации. Я думаю, мы все согласны с тем, что иногда есть четкое, содержательное имя для параметра, характерного для его цели, которое лучше, чем "я" или "это". Некоторые идут дальше и говорят, что вы всегда можете найти более ценное имя. Итак, это еще одна действительная точка зрения.

Какие еще идиомы вы видели? Какую идиому вы предпочитаете и почему?

Ответ 1

Я видел obj и val. Мне это не нравится. Мы должны стараться избегать использования ключевых слов. Я никогда не видел себя, но мне это нравится.

Ответ 2

Я называю это довольно нормально, основываясь на использовании. Таким образом, "источник" для исходной последовательности оператора LINQ или "аргумент" / "параметр" для расширения, выполняющего проверку параметров/аргументов и т.д.

Я не думаю, что это должно быть особенно связано с "this" или "self" - это не дает никакой дополнительной информации о значении параметра. Конечно, самое главное.

РЕДАКТИРОВАТЬ: Даже в случае, когда не существует много очевидного значения, я бы предпочел какой-то смысл. Какую информацию присваивает "я" или "@это"? Просто, что это первый параметр в методе расширения, и эта информация уже очевидна из-за того, что параметр украшен this. В примере, в котором указан параметр theStringToPrint/self, вместо этого я использовал бы outputText - он передает все, что вам нужно знать о параметре, IMO.

Ответ 3

Я называю переменную точно так, как я бы назвал ее, если бы это был простой старый статический метод. Причина в том, что его все еще можно назвать статическим методом, и вы должны учитывать этот вариант использования в своем коде.

Самый простой способ взглянуть на это - это проверка правильности аргументов. Рассмотрим случай, когда null передается в ваш метод. Вы должны выполнять проверку аргументов и бросать ArgumentNullException. Если он будет выполнен правильно, вам нужно будет поместить "this" в качестве имени аргумента.

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

Теперь кто-то кодирует вашу библиотеку и неожиданно получает диалоговое окно с исключениями, в котором говорится: "Это значение null". Они будут сбиты с толку:)

Это немного надуманный пример, но в целом я рассматриваю методы расширения, отличные от обычного статического метода. Я нахожу, что это облегчает рассуждения.

Ответ 4

Я называю его "target", так как метод расширения будет работать с этим параметром.

Ответ 5

Я считаю, что этого следует избегать, поскольку он использует самую бесполезную особенность, специфичную для языка, которая когда-либо была видна (@). Фактически, все, что может вызвать путаницу или уменьшать читаемость, такие как ключевые слова, появляющиеся там, где они не являются ключевыми словами, следует избегать. сам напоминает мне о python, но может быть хорошим для последовательного соглашения об именах, поскольку он ясно указывает, что он ссылается на используемый экземпляр, не требуя каких-либо неприятных синтаксических атак.

Ответ 6

Вы можете сделать что-то вроде этого...

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