width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=2080045857&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Fandroid-game%2F1521.html&dpc=1" style="font-size: 14px; font-weight: bold; border-width: 0px; margin: 0px; padding: 0px; font-family: arial, helvetica, clean, sans-serif; line-height: 16px;">
本文为《编写高质量的代码:改善C#程序的157个建议》中整理出来对我有用的知识,算是读书笔记吧。所以并不全,有兴趣了解详情的童鞋可以去买纸质书一探究竟。
- 当容易出错时,使用TryParse会更高效。
- 使用
?可以对一个值类型赋空值,这种算符对应的基类为Nullable<T>。使用??可以对其是否为空进行简化判断,因此可以这样写:
int? i = 123;
int j = i ?? 0;
//等价于
int? i = 123;
int j;
if(i.HasValue)
{
j = i.Value;
}
else
{
j = 0;
}
- const是编译期常量,所以效率比readonly高。
- 不要手动为枚举赋值,因为它的值是可重复的。
- 让一个类继承
IComparable<T>接口,当把它的实例放到集合中时,直接调用Sort方法,就可以按规则排序。虽然我还是喜欢用Lambda单写排序... - 深拷贝不一定非要一个个手动复制变量,也可以采用内存复制的形式:
public Employee DeepClone()
{
using(Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryForamtter();
formatter.Serialize(objectStream, this);
objectStream.Seek(0,SeekOrigin.Begin);
return formatter.Deserialize(objectStream) as Employee;
}
}
- C#集合的分类:
- 在
System.Collections.Concurrent命名空间下有线程安全的集合类。 - 为了防止公开变量的写入,可以为其添加一个带参数的构造方法,然后把它设为对外只读。
- 一般说来,使用Action、Func等预定义好的委托就足够了,没必要自己定义委托。还有些其他用途的,比如EventHandler、AsyncCallback等会作为一些接口参数出现,但本质是一样的。可以在MSDN页面上搜
委托,然后在左侧的导航列表中就能看到所有的类型了。 - 所有的委托都应封装成事件,大多数情况是不需要自定义委托类型的。例如下面的代码,就是使用了EventHandler:
class FileUploadedEventArgs : EventArgs
{
public int FileProgress {get;set;}
}
class FileUploader
{
public event EventHandler<FileUploadedEventArgs> FileUploaded;
public void Upload()
{
FileUploadedEventArgs e = new
FileUploadedEventArgs() { FileProgress = 100};
while(e.FileProgress > 0)
{
//Up Load File
e.FileProgress--;
if(FileUploaded != null)
{
FileUploaded(this,e);
}
}
}
}
class Program
{
static void Main(string[] args)
{
FileUploader fl = new FileUploader();
fl.FileUploaded +=Progress;
fl.Upload();
}
static void Progress(object sender,FileUploadedEventArgs e)
{
Console.writeLine(e.FileProgress);
}
}
- 委托命名建议采用动词或形容词。对于使用+=注册的事件处理器,使用"事件变量所属对象+下划线+事件变量名"来命名,委托或委托中间的回调应按照”委托变量所属对象+On+事件来源+委托变量名”为命名规则,例如:
public Main()
{
Button btn = new Button();
btn.Click+= new EventHandler(button_Click);
}
void button_Click(object sender,EventArgs e)
{
}
void SalaryOnEmployeeChanged(object sender,EventArgs e)
{
}
如果你觉得这篇文章对你有帮助,可以顺手点个顶,不但不会喜当爹,还能让更多人能看到它...
本文摘录自《编写高质量的代码:改善C#程序的157个建议》,分享了C#编程中提高代码质量的有效技巧,包括TryParse的使用、Nullable类型、深拷贝实现方法及C#集合的合理运用。
2370

被折叠的 条评论
为什么被折叠?



