为什么ReSharper会在一个方法可以变成静态方法时报错,但实际上没有?
是因为静态方法只创建一个实例(在类型上),从而提高性能吗?
为什么ReSharper会在一个方法可以变成静态方法时报错,但实际上没有?
是因为静态方法只创建一个实例(在类型上),从而提高性能吗?
我认为这个评论非常有用,因为它指出了两个重要的问题:
它让我问自己,这个方法是否真的应该成为类型的一部分。由于它没有使用任何实例数据,所以至少要考虑它是否可以移动到自己的类型中。它是类型的一个组成部分,还是一个通用的实用方法?
如果将该方法保留在特定类型上确实有意义,那么存在潜在的性能提升,因为编译器将为静态方法生成不同的代码。
以下是关于同一警告的FxCop文档描述(重点已添加):
如果成员不访问实例数据或调用实例方法,则可以将其标记为静态(Visual Basic中的共享)。当你将方法标记为静态时,编译器会向这些成员发出非虚拟调用站点。发出非虚拟调用站点将防止每次调用时在运行时进行检查,以确保当前对象指针非空。对于性能敏感的代码,这可以导致可衡量的性能提升。 在某些情况下,未访问当前对象实例表示一个正确性问题。
这里有一个非常好的关于此主题的辩论 (SO)。我认为如果可以将方法设置为静态方法,就应该将其设置为静态方法。我之所以这样认为,是因为为什么会有一个不使用任何实例数据的实例方法呢?在这种情况下,它真的是一个实例方法吗,还是实际上是一个类方法?
这不是抱怨,只是建议。
internal class ClassA
{
public ClassB Property { get; set; }
public int Method()
{
var classB = Property;
return classB.Property1 + classB.Property2;
}
}
internal class ClassB
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
转换为:
public static int Method(ClassB property)
{
var classB = property;
return classB.Property1 + classB.Property2;
}
转换为:
internal class ClassA
{
public ClassB Property { get; set; }
}
internal class ClassB
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public int Method()
{
return Property1 + Property2;
}
}
静态变量在第一次使用时实例化并保留在内存中。 如果不再使用,可能会成为问题。 静态变量更难进行测试(模拟等...)。