(Почему) вызывает в качестве метода расширения предпочтительный... способ?

Я перерабатываю свое решение, используя только что выпущенную версию Resharper (2016.2.2)

Это помечает эту строку кода:

ReportRunnerConstsAndUtils.ConvertValueToAppropriateTypeAndAssign(totalPackagesCell, packages);

... намекнув, что я должен "вызывать как метод расширения"

Если я соглашусь, он изменит эту строку на следующую:

totalPackagesCell.ConvertValueToAppropriateTypeAndAssign(packages);

Это лучше? Если так, то как? Зачем?

Вот вызываемый метод, который находится в классе "ConstsAndUtils":

// Adapted from https://stackru.com/questions/26483496/is-it-possible-to-ignore-excel-warnings-when-generating-spreadsheets-using-epplu
public static void ConvertValueToAppropriateTypeAndAssign(this ExcelRangeBase range, object value)
{
    string strVal = value.ToString();
    if (!String.IsNullOrEmpty(strVal))
    {
        decimal decVal;
        double dVal;
        int iVal;

        if (decimal.TryParse(strVal, out decVal))
            range.Value = decVal;
        if (double.TryParse(strVal, out dVal))
            range.Value = dVal;
        else if (Int32.TryParse(strVal, out iVal))
            range.Value = iVal;
        else
            range.Value = strVal;
    }
    else
        range.Value = null;
}

3 ответа

Решение

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

"Под капотом", конечно, метод расширения является статическим методом (не фактическим методом экземпляра), просто компилятор дает вам некоторый синтаксический сахар (но это не главное).

Рекомендуется вызывать его как метод расширения, потому что вы (или кто-то другой) СОЗДАЛИ его как метод расширения. Синтаксис this ExcelRangeBase range делает этот метод методом расширения, и поэтому для обеспечения согласованности его следует использовать в качестве метода расширения при его вызове. В противном случае у вас есть строки, которые читают ReportRunnerConstAndUtils.ConvertValueToApp ProperTypeAndAssign(range) и строки, которые делают то же самое, что читают range.ConvertValueToApp ProperTypeAndAssign ().

C# 6 ввел новый синтаксис, и теперь вы можете иметь using ReportRunnerConstAndUtils вверху файла, а затем ConvertValueToApp ProperTypeAndAssign(range) на вашем сайте вызова.

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

В этом конкретном случае я бы не использовал метод расширения просто потому, что метод возвращает void; методы, которые не возвращают что-то и просто вызывают побочные эффекты, не являются хорошими кандидатами в методы расширения, и я считаю их более читаемыми, как стандартные вызовы статических методов.

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

Если подумать, методы расширения были реализованы, чтобы сделать возможным LINQ, что является очень функциональной стороной C#. Я склонен сохранять то же "чувство" в любых методах расширения, которые я реализую.

Другие вопросы по тегам