C# 代码清理:ReSharper

8
我刚刚使用了Resharper,让我觉得自己完全不知道如何在C#中编写代码;它给了我很多建议,其中一些是:

1)SomeObject o = new SomeObject();

Resharper会将其转换为:

var o = new SomeObject()

2) this.Loaded += new RoutedEventHandler(MainPage_Loaded);

转换为:

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

this.Loaded += MainPage_Loaded;

3) 转换我的变量并在所有实例变量前面加下划线。 4) 删除类父级的名称。我在 Silverlight 上进行了测试。
public partial class MainPage : UserControl

public partial class MainPage

5) 替换实例变量

 this.variable = somevalue

 variable = somevalue

这段文字的意思是:“所有这些都真的必要吗?它真的会影响我的程序效率吗?我的类名用var关键字替换有什么好处呢?毕竟,var也会在编译时被类名替换。它是因为已经被编程实现了还是这些事情确实以某种方式产生影响?”

我真的对第四点表示怀疑。它会破坏继承。 - Madhur Ahuja
3
只有在另一部分偏类声明为继承自UserControl时,它才会这样做。 - Joe Enos
@Madhur:Joe的评论很有道理。不要忘记这个类是“Partial”的。 - Padu Merloti
1
@madhur 这是一个部分类 - resharper 将确保没有重复的声明。 - x0n
感谢大家的澄清。 - Madhur Ahuja
@xOn:是的,它确保了继承关系,但我认为让类名保持原样可以提高可读性。我们可以直接转到文件顶部,至少看到它从哪个类继承而来。毕竟,这段代码往往是由Visual Studio生成的。即使在Visual Studio自动生成的代码中,也能避免错误 :d - TCM
4个回答

8
这种行为在ReSharper设置中都是可配置的。其中包括一些代码清理规则(比如是否将用法替换为var - 我不会这样做!)、代码风格规则(比如变量命名)和格式化规则(比如大括号的放置方式)。
我写了一篇文章,概述了这些设置以及如何使用它们来塑造编码标准,并通过代码清理自动应用这些标准。

http://gojisoft.com/blog/2010/05/10/coding-standards-using-resharper/

最终,很多人都关注编程风格和去除冗余代码,这些对编译后的代码没有影响。您可以配置许多选项以适应您或您团队的编码风格。


5

这些都是必要的吗?

没有一个是必要的。

它真的会影响程序的效率吗?

它不会以任何改变性能或语义的方式影响编译后的代码。

我的类名用var关键字替换有什么好处呢?毕竟在编译时,var也会被类名替换掉。

更易读的代码。

这是因为已经编程来做还是这些东西确实以某种方式影响了吗?

是的。如果您不喜欢它们,可以进行配置。

1)没问题。

SomeObject o = new SomeObject();

第一个SomeObject是多余的且无用的,使用var不会降低可读性,甚至可以说更易读。此外,对于像这样的复杂定义,例如:
var dictionary = new Dictionary<string, Dictionary<string, List<string>>();

相比其他方式,这种方法更易读。然而,有时候会过度使用。例如

string s = "s";

优于

var s = "s";

原样

var i = 5;

结束

int i = 5;

Note that

var i = 2147483648;

使用隐式类型定义真的很糟糕,因为不清楚i的类型是什么。对于非复杂的定义,我更喜欢使用显式类型定义而不是隐式类型定义。此外,有时你想表达的意思是

IFoo foo = new Foo();

foo显式地声明为IFoo类型,而var则将其声明为Foo类型。

2) 通常情况下,代码越少越好。

3) 我不喜欢这个建议。我讨厌前导下划线。我使用常规的命名约定来命名我的成员变量,并在它们之前加上this以提高清晰度。我会关闭这个建议。

public SomeObject(string name) {
    this.name = name;
}

比起更易读

public SomeObject(string name) {
    _name = name;
}

我个人认为:

4) 等等,为什么会这样?我对这个有点困惑。因为它是部分的,并且类定义的另一部分有继承?我无法想象在它改变语义的情况下会这样做。我会关闭这个。

5) 我不喜欢这个(见3)。


关于#4:正如在OP的评论中指出的那样,只有当基类由部分类的另一部分声明时,ReSharper才会建议这样做。在这种情况下,我可以几乎保证我们正在看到WPF UserControl的代码后端,其XAML前端声明了基类。 - Dan J
@djacobson:啊,谢谢。个人认为在基类中加入冗余语句更清晰明了。 - jason
关于问题 #4,我总是会删除多余的基类。这样如果我以后想把我的窗口改成用户控件,或者把我的用户控件改成页面,就更容易了——我只需要改变 XAML,一切都能正常工作。如果你保留了多余的“: UserControl”,那么你需要在两个地方(XAML 和代码后台)都进行更改。遵循 DRY 原则。 - Joe White

3

它们并不是必要的。

它们遵循resharper设定的编码标准。好处在于你可以将编码标准配置为符合自己的方式。

然而,resharper的美妙之处在于你最终会学习到以不同的方式完成你一直以来按某种方式完成的任务。


2

所有这些更改对编译后的CIL代码都没有任何影响 - 它们只是ReSharper对C#代码本身可读性的看法。

您可以调整所有这些设置以满足您或您部门的需求。大多数情况下,这只是个人偏好的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接