本文整理「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:從零開始的軟體開發生活」
請大家繼續支持 ^_^