(为什么)调用作为扩展方法的首选方式?

时间:2016-09-13 16:13:01

标签: c# resharper extension-methods resharper-2016

我正在使用刚刚发布的Resharper版本(2016.2.2)重新解析我的解决方案

它标记了这行代码:

ReportRunnerConstsAndUtils.ConvertValueToAppropriateTypeAndAssign(totalPackagesCell, packages);

...暗示我应该" 作为扩展方法调用"

如果我默认,它会改变这一行:

totalPackagesCell.ConvertValueToAppropriateTypeAndAssign(packages);

这样更好吗?如果是这样,怎么样?为什么呢?

这是被调用的方法,它位于" ConstsAndUtils"类:

// Adapted from https://stackoverflow.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 个答案:

答案 0 :(得分:4)

正如一些评论所指出的,这至少部分是偏好问题。就个人而言,我认为在这里使用扩展方法更“清洁”和更清晰,但有些人可能不同意这一点。

“引擎盖下”,当然,扩展方法是一个静态方法(不是一个实际的实例方法),只是编译器在这里给你一些语法糖(但除此之外)。

答案 1 :(得分:2)

建议您将其作为扩展方法调用,因为您(或某人)将其作为扩展方法创建。语法this ExcelRangeBase range使该方法成为扩展方法,因此对于一致性,它应该在调用时用作扩展方法。否则,您有行读取ReportRunnerConstAndUtils.ConvertValueToAppropriateTypeAndAssign(范围)和行与读取range.ConvertValueToAppropriateTypeAndAssign()完全相同的行。

C#6引入了一些新语法,现在您可以在文件顶部放置using ReportRunnerConstAndUtils,然后在呼叫站点放置ConvertValueToAppropriateTypeAndAssign(范围)。

答案 2 :(得分:1)

这是一个基于意见的问题,它不是真正的回答,但我想指出以下内容。

在这种特殊情况下,我不会使用扩展方法,因为该方法返回void;不返回某些东西并且只是引起副作用的方法不是好的扩展方法候选者,我发现它们作为标准的静态方法调用更具可读性。

我尽量将我的扩展方法保持为“纯粹”,但就像我说的那样,这是我个人的看法。

如果你考虑一下,实现了扩展方法以使LINQ成为可能,这是C#的一个非常实用的方面。我倾向于在我实现的任何扩展方法中保持相同的“感觉”。