• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Effective C# 学习笔记 1

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

条款一:使用属性代替可访问的数据成员
1、在C#中属性(property)在访问时候看起来是数据成员,但却是用方法实现的!可以对set访问器做参数检查!可以对属性访问添加多线程支持!
public class Person
{
    private string  name;
    public string Name
   {
            get
           {
                   lock(this)
                  {
                        return name;
                    }
             }
            set
           { 
                if(value=null||value.Length=0)
                     throw new ArgumentException("Name cannot be blank","Name");
                  name=value;
           }
   }
}

2、.net的数据绑定只支持属性,不支持公有数据成员。因为将数据成员直接暴露给外界不符合面向对象的设计原则!

3、属性可以定义只读,只写,读写的属性。
public class Person //只读的!
{
    private string  name;
    public string Name
   {
            get
           {
                        return name;
      
             }
   }
}


4、C#2.0可以用访问修饰符修饰get,set访问器因为他们在本质上都是成员函数,更好的控制属性可见性!
public class Person
{
    private string  name;
    public string Name
   {
            get
           {
                        return name;
               
             }
            protected set
            {
                  name=value;
           }
   }
}

5、可以定义虚属性和抽象属性!
public class Person
{
    private string  name;
    public virtual string Name //虚属性可以被override实现多态
   {
            get
           {
                        return name;  
             }
            set
           { 
                  name=value;
           }
   }
}
public interface IPerson
{
    string Name//抽象属性继承类型必须给出实现
   {
           get;
           set;
   }
}

6、用this关键字定义带参数的属性!
int [] values;
public int this[index]
{
    get
    {
        return values[index];
    }
    set
    {
        values[intex]=value;
    }
}

7、属性和公有字段生成的IL是不同的。访问属性和共有字段的客户代码生成IL也是不同的。所以属性和共有字段在二进制上是不相容的!不能简单的将共有字段换成属性。这样必须重新编译所有用到字段的程序集!他们只在源代码层次上是兼容的!

8、因为JIT编辑器会对短的经常调用的方法进行内联优化。(包括属性访问器)所以如果JIT内联了属性访问器。那么属性和字段的效率是没有差别的。即使不内联。效率差别也是可以忽略不计的。

综上所述我们应该使用属性!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
KingDZ 变菜鸟,每日一个C#小实例之---C#判断网络是否链接发布时间:2022-07-13
下一篇:
C# Task的GetAwaiter和ConfigureAwait发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap