为了削减长话短说:我找到的Java反模式不可或缺的资源。 对于初学者来说不亚于专业人士。 我还没有找到像这样为C#。 所以我就开了这个问题,作为社区的wiki,并邀请大家一起分享这一知识。 由于我是新来的C#,我在这浓厚的兴趣,但不能与某些反模式启动:/
下面是我找到的C#,而不是其他语言特别真实的答案。
我只是复制/粘贴这些! 考虑投掷对这些评论一下为好。
投掷NullReferenceException
抛出了错误例外:
if (FooLicenceKeyHolder == null)
throw new NullReferenceException();
属性与公共变量
在类公共变量(使用属性来代替)。
除非类是一个简单的数据传输对象。
不理解的是布尔是一个真正的类型,而不是只是一个约定
if (myBooleanVariable == true)
{
...
}
或者,甚至更好
if (myBooleanVariable != false)
{
...
}
像这样的结构经常被C
和C++
开发人员,其中一个布尔值的想法只是一个约定(0 ==假的,什么都为true); 这是不是在C#或有真正的布尔其他语言的需要(或希望)。
使用using()
不做的使用using
酌情:
object variable;
variable.close(); //Old code, use IDisposable if available.
variable.Dispose(); //Same as close. Avoid if possible use the using() { } pattern.
variable = null; //1. in release optimised away. 2. C# is GC so this doesn't do what was intended anyway.
Answer 1:
不正确地重新抛出异常。 重新抛出异常:
try
{
// do some stuff here
}
catch (Exception ex)
{
throw ex; // INCORRECT
throw; // CORRECT
throw new Exception("There was an error"); // INCORRECT
throw new Exception("There was an error", ex); // CORRECT
}
Answer 2:
GC.Collect()
来收集的,而不是信任垃圾收集器。
Answer 3:
我看到这一种方式太多了,无论是在Java和C#...
if(something == true){
somethingelse = true;
}
有加分,如果它也有
else{
somethingelse = false;
}
Answer 4:
using Microsoft.SharePoint;
“这份厚礼说
Answer 5:
我看到下面的代码有很多:
if (i==3)
return true;
else
return false;
应该:
return (i==3);
Answer 6:
侮辱得墨忒耳定律:
a.PropertyA.PropertyC.PropertyB.PropertyE.PropertyA =
b.PropertyC.PropertyE.PropertyA;
Answer 7:
投掷NullReferenceException
:
if (FooLicenceKeyHolder == null)
throw new NullReferenceException();
Answer 8:
这是真的,我亲眼看到了。
public object GetNull()
{
return null;
}
它在应用中实际使用的,甚至有一个存储过程去用它太,一个sp_GetNull将返回null ....
这让我很快乐。
我认为使用了SP对传统的ASP网站..东西有结果集做。 在.NET之一是“转换”的代码到.NET的人的想法...
Answer 9:
int foo = 100;
int bar = int.Parse(foo.ToString());
或者更一般的情况:
object foo = 100;
int bar = int.Parse(foo.ToString());
Answer 10:
我在我们的项目中发现这一点,几乎打破椅子...
DateTime date = new DateTime(DateTime.Today.Year,
DateTime.Today.Month,
DateTime.Today.Day);
Answer 11:
很多时候我绊倒这种变种滥用的:
var ok = Bar();
甚至更好:
var i = AnyThing();
使用VAR这种方式是没有意义的,并没有什么收益。 它只是使代码更难以效仿。
Answer 12:
- 缺乏委托调用之前空测试 。
- 不知道何时以及如何使用“为”与空校验与用一个try / catch铸造。
- “扔异常”对一个catch块“扔”。
- 实例化大量的字符串,而不是使用的StringBuilder。
- 用块的深度嵌套 。
Answer 13:
不理解的是布尔是一个真正的类型,而不是只是一个约定
if (myBooleanVariable == true)
{
...
}
或者,甚至更好
if (myBooleanVariable != false)
{
...
}
像这样的结构经常被C
和C++
开发人员,其中一个布尔值的想法只是一个约定(0 ==假的,什么都为true); 这是不是在C#或有真正的布尔其他语言的需要(或希望)。
更新 :改写最后一段,以提高其透明度。
Answer 14:
在类公共变量(使用属性来代替)。
除非类是一个简单的数据传输对象。
参见下面的讨论和澄清意见。
Answer 15:
其实,我已经看到了这一点。
bool isAvailable = CheckIfAvailable();
if (isAvailable.Equals(true))
{
//Do Something
}
击败isAvailable == true
反模式还不是手到擒来?
使之成为一个超级反模式!
Answer 16:
object variable;
variable.close(); //Old code, use IDisposable if available.
variable.Dispose(); //Same as close. Avoid if possible use the using() { } pattern.
variable = null; //1. in release optimised away. 2. C# is GC so this doesn't do what was intended anyway.
Answer 17:
私人自动实现的属性:
private Boolean MenuExtended { get; set; }
Answer 18:
声明并在每个方法的顶部初始化所有局部变量是如此的丑陋!
void Foo()
{
string message;
int i, j, x, y;
DateTime date;
// Code
}
Answer 19:
两个字符串的反模式
反模式#1
检查字符串null或空
//Bad
if( myString == null || myString == "" )
OR
if( myString == null || myString.Length == 0 )
//Good
string.IsNullOrEmpty(myString)
反模式#2(仅适用于.NET 4.0)
检查字符串null或空或空白
//Bad
if( myString == null || myString == "" || myString.Trim() == "")
//Good
string.IsNullOrWhiteSpace(myString)
Answer 20:
不用铸造(请相信编译):
foreach (UserControl view in workspace.SmartParts)
{
UserControl userControl = (UserControl)view;
views.Add(userControl);
}
Answer 21:
if(data != null)
{
variable = data;
}
else
{
variable = new Data();
}
可以更好地写成
variable = (data != null) ? data : new Data();
甚至更好的写作
variable = data ?? new Data();
最后代码工作在.NET 2.0及以上
Answer 22:
带有口音说话总能吸引我。
C ++程序员:
if (1 == variable) { }
在C#这会给你一个编译错误,如果你要输入if (1 = variable)
,让你写的代码,你的意思是不是担心在脚下搬起石头砸自己的方式。
Answer 23:
不使用三元的是我看到转换到C#偶尔做
你看:
private string foo = string.Empty;
if(someCondition)
foo = "fapfapfap";
else
foo = "squishsquishsquish";
代替:
private string foo = someCondition ? "fapfapfap" : "squishsquishsquish";
Answer 24:
访问修改关闭
foreach (string list in lists)
{
Button btn = new Button();
btn.Click += new EventHandler(delegate { MessageBox.Show(list); });
}
(见链接,解释和修正)
Answer 25:
对于使用字符串连接而不是字符串生成器的concating串的任意数
Exampls
foreach (string anItem in list)
message = message + anItem;
Answer 26:
这被认为是一般的?
public static main(string [] args)
{
quit = false;
do
{
try
{
// application runs here ..
quit = true;
}catch { }
}while(quit == false);
}
我不知道如何解释它,但它就像有人捕获异常和重试代码一遍又一遍,希望它的工作原理后。 就像如果发生IOException,他们只是尝试一遍又一遍,直到它的工作原理..
Answer 27:
我上有五十类项目,全部来自同一个类继承, 所有的定义:
public void FormatZipCode(String zipCode) { ... }
无论是把它的父类或实用类在一旁。 哎呀。
你有没有考虑通过浏览每日跆拳道 ?
Answer 28:
大规模过于复杂“的Page_Load”方法,它想要做的一切。
Answer 29:
使用属性比其他任何事情简单地检索值或可能便宜的计算。 如果你是从你的财产访问数据库,你应该将其更改为一个方法调用。 开发商预计,方法调用可能是昂贵的,他们不从属性,要求这一点。
Answer 30:
在我继承了这个系统发现了几次...
if(condition){
some=code;
}
else
{
//do nothing
}
反之亦然
if(condition){
//do nothing
}
else
{
some=code;
}
文章来源: C# Antipatterns