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

(Why) is invoking as extension method the preferred...way?

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

它标记了这行代码:

ReportRunnerConstsAndUtils.ConvertValueToAppropriateTypeAndAssign(totalPackagesCell, packages);

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

如果我默认,它会将该行更改为:

totalPackagesCell.ConvertValueToAppropriateTypeAndAssign(packages);

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

这是被调用的方法,它在 "ConstsAndUtils" class:

// Adapted from 
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;
}

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

"Under the hood,"当然,扩展方法是一个静态方法(不是实际的实例方法),只是编译器在这里给了你一些语法糖(但这不是重点)

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

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

我尽量保持我的扩展方法 "pure",但就像我说的,这是我个人的意见。

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

建议您将其作为扩展方法调用,因为您(或某人)将其创建为扩展方法。语法 this ExcelRangeBase range 使该方法成为扩展方法,因此为了保持一致性,在调用它时应将其用作扩展方法。否则,您有读作 ReportRunnerConstAndUtils.ConvertValueToAppropriateTypeAndAssign(range) 的行和读作 range.ConvertValueToAppropriateTypeAndAssign().

完全相同的行

C#6 引入了一些新语法,现在您可以在文件顶部添加 using ReportRunnerConstAndUtils,然后在调用站点添加 ConvertValueToAppropriateTypeAndAssign(range)。