C#反模式(C# Antipatterns)

2019-07-21 05:48发布

为了削减长话短说:我找到的Java反模式不可或缺的资源。 对于初学者来说不亚于专业人士。 我还没有找到像这样为C#。 所以我就开了这个问题,作为社区的wiki,并邀请大家一起分享这一知识。 由于我是新来的C#,我在这浓厚的兴趣,但不能与某些反模式启动:/

下面是我找到的C#,而不是其他语言特别真实的答案。

我只是复制/粘贴这些! 考虑投掷对这些评论一下为好。


投掷NullReferenceException

抛出了错误例外:

if (FooLicenceKeyHolder == null)
    throw new NullReferenceException();

属性与公共变量

在类公共变量(使用属性来代替)。

除非类是一个简单的数据传输对象。


不理解的是布尔是一个真正的类型,而不是只是一个约定

if (myBooleanVariable == true)
{
    ...
}

或者,甚至更好

if (myBooleanVariable != false)
{
    ...
}

像这样的结构经常被CC++开发人员,其中一个布尔值的想法只是一个约定(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)
{
    ...
}

像这样的结构经常被CC++开发人员,其中一个布尔值的想法只是一个约定(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