C# 反模式

标签: C#
发布时间: 2011/5/17 18:58:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

可能重复:
有关的常见编程错误。网络的开发人员,可以避免吗?

若要削减长话短说: 我发现 java'>Java 反模式 不可或缺的资源。对专业人员的初学者。尚未找到像这样的 C#。我会开放这一问题作为社区 wiki,邀请大家分享他们的知识。我新的 C#,我在这方面,有强烈兴趣,但是不能启动与一些反模式: /

这里是 C# 和其他的语言不找专门的真正的答案。

我只是复制/粘贴这些 !考虑对这些意见以及投掷一看。


抛出NullReferenceException'>Exception

引发错误的异常

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


与公共变量的属性

(而使用属性) 的类中的公共变量。

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


不了解该布尔值真正的类型,而不仅仅是一项公约

if (myBooleanVaRIA'>riable == true)
{
    ...
}

或者,甚至更好

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

构造像这些经常使用 CC++ 布尔值的想法在那里只是一项公约的开发人员 (0 = = false,什么是真实) ; 这不是必需的 (或可取的) 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.

解决方法 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
}

解决方法 2:

气相色谱法。收集的信任,垃圾回收器而不是 Collect()。

解决方法 3:

我看到这一种方式,太多,这两个 Java 和 C# … …

if(something == true){
  somethingelse = true;
}

如果它还具有的积分

else{
  somethingelse = false;
}

解决方法 4:

我看到很多以下代码:

if (i==3)
       return true;
else
       return false;

应该是:

       return (i==3);

解决方法 5:

using Microsoft.SharePoint;

' 说的饶

解决方法 6:

抛出 NullReferenceException

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

解决方法 7:

侮辱米特的法律:

a.PropertyA.PropertyC.PropertyB.PropertyE.PropertyA = 
     b.PropertyC.PropertyE.PropertyA;

解决方法 8:

int foo = 100;
int bar = int.Parse(foo.ToString());

或更一般情况下:

object foo = 100;
int bar = int.Parse(foo.ToString());

解决方法 9:

这是我见过我自己的眼睛。

public object GetNull()
{
     return null;
}

它实际使用的应用程序,和甚至已经去过,它的存储的过程将返回空值的 sp_GetNull … …。

这使我的一天。

我认为 sp 用传统的 asp 站点...跟一个结果集。一个.net 有人"转换"到.net 的代码的想法...

解决方法 10:

很多时候我绊倒 var 滥用这种:

var ok = Bar();

或甚至更好:

var i = AnyThing();

使用这种方式的 var 是毫无道理的并获得什么。它只会使代码难以遵循。

解决方法 11:

我发觉这在我们的项目和几乎打破了椅子...

DateTime date = new DateTime(DateTime.Today.Year, 
                             DateTime.Today.Month, 
                             DateTime.Today.Day);

解决方法 12:

  • 空测试前委托调用的缺乏
  • 不知道何时及如何使用与空的检查与铸造与 try/catch '一样'。
  • ' 引发异常 ' 与 '抛出' catch 块内。
  • 实例化一大批字符串,而不是使用 StringBuilder。
  • 深嵌套的块

解决方法 13:

(而使用属性) 的类中的公共变量。

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

请参见下面的讨论和澄清的注释。

解决方法 14:

不了解该布尔值真正的类型,而不仅仅是一项公约

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

或者,甚至更好

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

构造像这些经常使用 CC++ 布尔值的想法在那里只是一项公约的开发人员 (0 = = false,什么是真实) ; 这不是必需的 (或可取的) C# 或其他语言具有真正的布尔值。

更新: 惆怅,提高其清晰度的最后一段。

解决方法 15:

我其实这见过。

bool isAvailable = CheckIfAvailable();
if (isAvailable.Equals(true))
{ 
   //Do Something
}

isAvailable == true 反手放下 !
这使超-反模式 !

解决方法 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.

解决方法 17:

专用自动实现的属性:

private Boolean MenuExtended { get; set; }

解决方法 18:

声明和初始化所有的本地变量,每个方法的顶部是这么丑 !

void Foo()
{
    string message;
    int i, j, x, y;
    DateTime date;

    // Code
}

解决方法 19:

不用铸造 (请信任编译器):

foreach (UserControl view in workspace.SmartParts)
{
  UserControl userControl = (UserControl)view;
  views.Add(userControl);
}

解决方法 20:

总是说话的口音,抓住了我。

C + + 程序员:

if (1 == variable) { }

在 C# 中这会给你一个编译器错误如果您键入 if (1 = variable),使您可以编写代码的方式,你的意思是它的而不是担心拍摄自己的脚。

解决方法 21:

访问修改后的关闭

foreach (string list in lists)
{
        Button btn = new Button();
        btn.Click += new EventHandler(delegate { MessageBox.Show(list); });
}

(请参见解释和修复链接)

解决方法 22:

不使用三元的是我请参阅转换为 c# 偶尔

您将看到:

private string foo = string.Empty;
if(someCondition)
  foo = "fapfapfap";
else
  foo = "squishsquishsquish";

而不是:

private string foo  = someCondition ? "fapfapfap" : "squishsquishsquish";

解决方法 23:

if(data != null)
{
  variable = data;
}
else
{
  variable = new Data();
}

可以更好地写成

variable = (data != null) ? data : new Data();

为更好地写

variable = data ?? new Data();

最后的代码清单中的作品。NET 2.0 及以上

解决方法 24:

两个字符串反模式
反 # 1
检查 null 或空字符串

//Bad
if( myString == null || myString == "" )
OR
if( myString == null || myString.Length == 0 )

//Good
string.IsNullOrEmpty(myString)

反 # 2(只供。净额 4.0)
检查 null 或空或空格的字符串

//Bad
if( myString == null || myString == "" || myString.Trim() == "")

//Good
string.IsNullOrWhiteSpace(myString) 

解决方法 25:

Concating 任意数量的字符串的字符串生成器而不是使用字符串串联

Exampls

foreach (string anItem in list)
    message = message + anItem;

解决方法 26:

这是一般的吗?

public static main(string [] args)
{
  quit = false;
  do
  {
  try
  {
      // application runs here .. 
      quit = true;
  }catch { }
  }while(quit == false);
}

我不知道怎么去解释,但像有人捕获的异常和重试遍又一遍地希望它以后工作的代码。像如果流发生时,他们只是尝试遍又一遍,直到它的工作原理...

解决方法 27:

我对该项目有五十个班级,从同一个类的 所有 定义的所有继承:

public void FormatZipCode(String zipCode) { ... }

或者把它的父类或一个实用程序类推迟到一边。凯旋门。

您是否考虑过浏览 每日大典

解决方法 28:

大量繁复 'Page_Load' 方法,想要做的一切。

解决方法 29:

无知就是幸福 (知道您的框架):

TimeSpan keyDays = new TimeSpan(Licence.LicenceExpiryDate.Ticks);
TimeSpan nowDays = new TimeSpan(System.DateTime.Now.Ticks);

int daysLeft = keyDays.Days - nowDays.Days;

解决方法 30:

使用属性对于以外进行简单检索的值或可能是廉价的计算。如果您从您的属性访问数据库,您应该将其更改为方法调用。开发人员希望的方法调用可能代价高昂,他们别指望这从属性。

官方微信
官方QQ群
31647020