3

我正在使用刚刚发布的 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;
}
4

3 回答 3

4

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

当然,“在幕后”,扩展方法是一个静态方法(不是实际的实例方法),只是编译器在这里给了你一些语法糖(但这不是重点)。

于 2016-09-13T16:21:51.613 回答
2

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

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

于 2016-10-26T12:32:31.643 回答
1

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

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

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

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

于 2016-09-13T16:32:05.913 回答