C# 的常见误区整理

本文摘录自《编写高质量的代码:改善C#程序的157个建议》,分享了C#编程中提高代码质量的有效技巧,包括TryParse的使用、Nullable类型、深拷贝实现方法及C#集合的合理运用。
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;">


文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。  

原文链接:http://blog.csdn.net/fansongy/article/details/52790067







本文为《编写高质量的代码:改善C#程序的157个建议》中整理出来对我有用的知识,算是读书笔记吧。所以并不全,有兴趣了解详情的童鞋可以去买纸质书一探究竟。

  1. 当容易出错时,使用TryParse会更高效。
  2. 使用?可以对一个值类型赋空值,这种算符对应的基类为Nullable<T>。使用??可以对其是否为空进行简化判断,因此可以这样写:
int? i = 123;
int j = i ?? 0;

//等价于
int? i = 123;
int j;
if(i.HasValue)
{
    j = i.Value;
}
else 
{
    j = 0;
}
  1. const是编译期常量,所以效率比readonly高。
  2. 不要手动为枚举赋值,因为它的值是可重复的。
  3. 让一个类继承IComparable<T>接口,当把它的实例放到集合中时,直接调用Sort方法,就可以按规则排序。虽然我还是喜欢用Lambda单写排序...
  4. 深拷贝不一定非要一个个手动复制变量,也可以采用内存复制的形式:
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;
    }
}
  1. C#集合的分类:
  2. System.Collections.Concurrent命名空间下有线程安全的集合类。
  3. 为了防止公开变量的写入,可以为其添加一个带参数的构造方法,然后把它设为对外只读。
  4. 一般说来,使用Action、Func等预定义好的委托就足够了,没必要自己定义委托。还有些其他用途的,比如EventHandler、AsyncCallback等会作为一些接口参数出现,但本质是一样的。可以在MSDN页面上搜委托,然后在左侧的导航列表中就能看到所有的类型了。
  5. 所有的委托都应封装成事件,大多数情况是不需要自定义委托类型的。例如下面的代码,就是使用了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);
    }

}
  1. 委托命名建议采用动词或形容词。对于使用+=注册的事件处理器,使用"事件变量所属对象+下划线+事件变量名"来命名,委托或委托中间的回调应按照”委托变量所属对象+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)
{

}

如果你觉得这篇文章对你有帮助,可以顺手点个,不但不会喜当爹,还能让更多人能看到它... 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值