[.NET]C# Code Review

本文整理「Lessons from Real World .NET Code Reviews」課程 Lessons for C# 的內容。

在這一部份會針對C#常見的問題進行討論,以下以測試的 Code 來說明,

//CodeReviewDLL專案
namespace CodeReviewDLL
{
    public class ConstAndReadOnly
    {
        public const string ConstValue = "MyConstValue";
        public static readonly string ReadOnlyValue = "MyReadOnlyValue";

    }
}
//Console專案,加入 CodeReviewDLL專案 參考
namespace CodeReviewApp
{
    class Program
    {
        static void Main(string[] args)
        {
            if (File.Exists(@"d:\abc.txt"))
                File.Delete(@"d:\abc.txt");
                Console.WriteLine("刪除檔案!");

            FileStream fs = File.Create(@"d:\abc.txt");
            try
            {
                for(int i = 0; i < 10; i++)
                {
                    string writeString = i.ToString() + "我" + "是" + "亂馬客"
                        + ", ConstValue:"
                        + CodeReviewDLL.ConstAndReadOnly.ConstValue
                        + ", ReadOnlyValue:"
                        + CodeReviewDLL.ConstAndReadOnly.ReadOnlyValue
                        + Environment.NewLine;
                    byte[] info = new UTF8Encoding(true).GetBytes(writeString);
                    fs.Write(info, 0, info.Length);
                }
            }
            finally
            {
                fs.Dispose();
            }
  
        }
    }
}

1.Magic Strings and Numbers

  在上面的範例中, d:\abc.txt 出現多次,所以可以將它抽到一個變數之中。

2.if的寫法

  if 多行會使用大括號去包起來,而單行則可以不需要大括號去包。但使用上,如果是單行的話,就不要寫在if的下一行,以避免排版上的誤會。

if (File.Exists(fileName))
{
	File.Delete(fileName);
	Console.WriteLine("刪除檔案!");
}

3.String的串接

  有時會看到一些字串的串接會直接使用 + 去串接,可以改用 string.Concat ,如下,

string writeString = i.ToString() + "我" + "是" + "亂馬客"
					+ ", ConstValue:"
					+ CodeReviewDLL.ConstAndReadOnly.ConstValue
					+ ", ReadOnlyValue:"
					+ CodeReviewDLL.ConstAndReadOnly.ReadOnlyValue
					+ Environment.NewLine;

  改成 

string writeString = string.Concat(i.ToString() , "我" , "是" , "亂馬客"
					, ", ConstValue:"
					, CodeReviewDLL.ConstAndReadOnly.ConstValue
					, ", ReadOnlyValue:"
					, CodeReviewDLL.ConstAndReadOnly.ReadOnlyValue
					, Environment.NewLine);

4.const vs. readonly

  使用 const 變數時,程式編譯後,會使用使用那個常數值放到程式之中,而不是變數。

  所以像我們的例子中,如果那個參考DLL修改ReadOnly變數值及常數值後,單獨編譯這個DLL,再將它的更新到範例程式。

  然後從 Command 模式執行範例程式,則那個常數值是不會變動的哦! 所以使用上要小心哦!

  

 

5.使用 Using

  有些有實作 IDisposable 的物件,使用上可以使用 Using 程式較為簡潔哦!

 

using (FileStream fs = File.Create(fileName))
{
	for (int i = 0; i < 10; i++)
	{
		string writeString = string.Concat(i.ToString(), "我", "是", "亂馬客"
			, ", ConstValue:"
			, CodeReviewDLL.ConstAndReadOnly.ConstValue
			, ", ReadOnlyValue:"
			, CodeReviewDLL.ConstAndReadOnly.ReadOnlyValue
			, Environment.NewLine);
		byte[] info = new UTF8Encoding(true).GetBytes(writeString);
		fs.Write(info, 0, info.Length);
	}
}	

最後調整過的範例如下,

static void Main(string[] args)
{
	string fileName = @"d:\abc.txt";
	if (File.Exists(fileName))
	{
		File.Delete(fileName);
		Console.WriteLine("刪除檔案!");
	}
	using (FileStream fs = File.Create(fileName))
	{
		for (int i = 0; i < 10; i++)
		{
			string writeString = string.Concat(i.ToString(), "我", "是", "亂馬客"
				, ", ConstValue:"
				, CodeReviewDLL.ConstAndReadOnly.ConstValue
				, ", ReadOnlyValue:"
				, CodeReviewDLL.ConstAndReadOnly.ReadOnlyValue
				, Environment.NewLine);
			byte[] info = new UTF8Encoding(true).GetBytes(writeString);
			fs.Write(info, 0, info.Length);
		}
	}
}

更多Code Review 的詳細資訊,

請參考 「Lessons from Real World .NET Code Reviews」課程。

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^