C# code review

Magic number

如果同一字符串出现两次以上,使用变量替换

About "if"

var b = false
if(b)
 Console.WriteLine(b);

应该使用

if(b) Console.WriteLine(b);

String concatenation

字符串相加:

var concatenatedString = "a" + "b";

应该使用Concat方法代替

var concatenatedString = string.Concat("a", "b");

Const vs readonly

Const 变量在编译期间使用变量的值直接替换此变量,因此具有更高效率,但使用不小心容易出错

例子最能说明问题:

有一个C#库程序名字为Constants 

public class OurConstants
{
  public const int FAILURERESULT=-1;
  public static readonly int SUCCESS = 1;
}
主程序名字为ConstReadonlyTest,引用Constants库

class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine("Constant: {0}", OurConstants.FAILURERESULT);
    Console.WriteLine("Constant: {0}", OurConstants.SUCCESS);
  }
}

编译之后运行输出结果如下

Constant: -1

Constant: 1

对上面库程序作如下修改

public class OurConstants
{
  public const int FAILURERESULT=-2;
  public static readonly int SUCCESS = 2;
}

重新编译Constants,将Constants.dll 拷贝到主程序ConstReadonlyTest目录,注意不要编译主程序,再次运行,结果如下

Constant: -1

Constant: 2

应该能琢磨出他们的区别了吧

在开发组件(库)供其他程序使用时,应该使用避免使用const


Bad IDisposable Usage

先看一个错误的使用方式

classs Test
{
  public static void Run()
  {
    FileStream stream = new FileStream();
    //...
    stream.Close();
    stream.Dispose();
    
  }
}

如果在stream操作的过程中发生异常,Close()和Dispose()方法将不会调用,从而会导致内存泄露

改进版:

classs Test
{
  public static void Run()
  {
    try
    {
      FileStream stream = new FileStream();
      //...
      stream.Close();
    }
    catch
    {

    }
    finally
    {
      stream.Dispose();
    }
  }
}

但是 比较冗余,
最终版,使用using 语句
classs Test
{
  public static void Run()
  {    
    using(  FileStream stream = new FileStream())
    {
     //...
      stream.Close();
    }
  }
}

Enumeration Initialization

枚举,

enum Week
{
Sun = 1,
Mon = 2,
Tue = 3,
Wed = 4,
Thu = 5,
Fir = 6
}

enum Gender
{
  Male,
  Female
}

Week week;// 默认值为0
Gender gender;// 默认值为Male

对于Week使用默认值时,就很容易导致错误,建议是为每个enum声明无效值,

enum Week
{
Invalid = 0,
Sun = 1,
Mon = 2,
Tue = 3,
Wed = 4,
Thu = 5,
Fir = 6
}

enum Gender
{
  Invalid = 0,
  Male,
  Female
}

Large Method Bodies

将一个大的方法设法分割成多个小的方法,每个方法只做一件事,通过方法名很容易得知次方的的作用,从而起到注释的作用

你可能感兴趣的:(DotNet)