Ответ 1
Я видел obj и val. Мне это не нравится. Мы должны стараться избегать использования ключевых слов. Я никогда не видел себя, но мне это нравится.
Первым параметром метода расширения С# является экземпляр, в который был вызван метод расширения. Я принял идиому, не видя ее в другом месте, называть эту переменную "я" . Я бы не удивился, если другие тоже используют это. Вот пример:
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" не дают никакой информации. Я думаю, мы все согласны с тем, что иногда есть четкое, содержательное имя для параметра, характерного для его цели, которое лучше, чем "я" или "это". Некоторые идут дальше и говорят, что вы всегда можете найти более ценное имя. Итак, это еще одна действительная точка зрения.
Какие еще идиомы вы видели? Какую идиому вы предпочитаете и почему?
Я видел obj и val. Мне это не нравится. Мы должны стараться избегать использования ключевых слов. Я никогда не видел себя, но мне это нравится.
Я называю это довольно нормально, основываясь на использовании. Таким образом, "источник" для исходной последовательности оператора LINQ или "аргумент" / "параметр" для расширения, выполняющего проверку параметров/аргументов и т.д.
Я не думаю, что это должно быть особенно связано с "this" или "self" - это не дает никакой дополнительной информации о значении параметра. Конечно, самое главное.
РЕДАКТИРОВАТЬ: Даже в случае, когда не существует много очевидного значения, я бы предпочел какой-то смысл. Какую информацию присваивает "я" или "@это"? Просто, что это первый параметр в методе расширения, и эта информация уже очевидна из-за того, что параметр украшен this
. В примере, в котором указан параметр theStringToPrint
/self
, вместо этого я использовал бы outputText
- он передает все, что вам нужно знать о параметре, IMO.
Я называю переменную точно так, как я бы назвал ее, если бы это был простой старый статический метод. Причина в том, что его все еще можно назвать статическим методом, и вы должны учитывать этот вариант использования в своем коде.
Самый простой способ взглянуть на это - это проверка правильности аргументов. Рассмотрим случай, когда null передается в ваш метод. Вы должны выполнять проверку аргументов и бросать ArgumentNullException. Если он будет выполнен правильно, вам нужно будет поместить "this" в качестве имени аргумента.
public static void Print(this string @this) {
if ( null == @this ) {
throw new ArgumentNullException("this");
}
...
}
Теперь кто-то кодирует вашу библиотеку и неожиданно получает диалоговое окно с исключениями, в котором говорится: "Это значение null". Они будут сбиты с толку:)
Это немного надуманный пример, но в целом я рассматриваю методы расширения, отличные от обычного статического метода. Я нахожу, что это облегчает рассуждения.
Я называю его "target", так как метод расширения будет работать с этим параметром.
Я считаю, что этого следует избегать, поскольку он использует самую бесполезную особенность, специфичную для языка, которая когда-либо была видна (@). Фактически, все, что может вызвать путаницу или уменьшать читаемость, такие как ключевые слова, появляющиеся там, где они не являются ключевыми словами, следует избегать. сам напоминает мне о python, но может быть хорошим для последовательного соглашения об именах, поскольку он ясно указывает, что он ссылается на используемый экземпляр, не требуя каких-либо неприятных синтаксических атак.
Вы можете сделать что-то вроде этого...
public static void Print(this string extended)
{
if(extended != null) Console.WriteLine(extended);
}