(为什么)作为扩展方法调用是首选...方式?
(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)。
我正在使用刚刚发布的 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)。