NET CLR via C#读书笔记 - 第十章 属性

1 无参属性

1.1 无参属性代码

  代码示例:

public class Demo{
	private string m_s;
	private int m_i;

	public string S{
		get{return m_s;}
		set{m_s = value}
	}
	
	public int I{
		get{return m_i;}
		set{m_i = value}
	}
}

void UseDemo(){
	Demo d = new Demo();
	d.S = "Hello";
	d.I = 1;
	string s = d.S;
	int i = d.I;
}

1.2 无参属性说明

  ① CLR支持静态,示例,抽象和虚属性。
  ② 属性可由任意可访问性修饰符进行修饰,可在接口中定义。
  ③ 属性不可重载。

1.3 AIP(自动实现的属性)

1.3.1 AIP代码

  代码示例:

public class Demo{
	private int m_i;

	//AIP属性
	public string S{ 
		get;set;
	}
	
	//非AIP属性
	public int I{
		get{return m_i;}
		set{m_i = value}
	}
}

void UseDemo(){
	Demo d = new Demo();
	d.S = "Hello";
	d.I = 1;
	string s = d.S;
	int i = d.I;
}

1.3.2 AIP优点与不足

1.3.2.1 优点

  使用AIP时,表示你已经创建了一个属性,访问该属性的任何代码都会调用get/set访问器,后续在你需要自己定义get/set函数时,访问属性的任何代码都不需要重新编译。

1.3.2.2 不足

  ① AIP必须显示初始化字段,没有简便语法初始化。
  ② 使用AIP的类型无法序列化和反序列化,因为AIP定义的字段名由编译器决定,每次编译都会发生变化。
  ③ 无法断点调试get/set方法。

1.4 字段与属性的区别

  ① 属性可以是只读或者只写,字段通常可读可写(readonly修饰的除外)。
  ② 属性方法可能抛出异常,但字段访问永远不会。
  ③ 属性不能作为ref或者out参数传递给方法,字段可以。
  ④ 执行效率,属性方法通常花费较多时间执行,字段访问总是立即完成。
  ⑤ 属性方法可能会造成明显的副作用,但字段永远不会,属性可能会触发由于属性使用顺序不同导致类型行为异常。
  ⑥ 属性方法可能需要额外的内存空间,或者返回的引用指向的不是对象状态的一部分,造成修改内容无法作用于对象本身的问题。
  ⑦ 属性方法连续调用可能会返回不同的值。

2 有参属性

  C#中有参属性又叫索引器,C#使用数组风格来公开有参属性,可以理解为对[]进行重载。
  代码示例如下:

public class Demo{
	private int m_i;

	//AIP属性
	public string S{ 
		get;set;
	}
	
	//非AIP属性
	public int I{
		get{return m_i;}
		set{m_i = value}
	}
	
	//索引器 此处仅为示例  无任何意义
	public int this[int i]{
		get{ return 0; }
		set{
			if(i > 0)
			{
				m_i = value;
			}
		}
	}
}

3 属性访问器性能

  由于属性访问器一般代码量较少,且调用相对频繁,编译器编译时会使用内联,提高属性访问器的执行效率,事实上内联在函数调用时不会有效率上的损耗,且由于代码量小,一般不会造成严重的代码膨胀效应,除非属性访问器写的代码过多,一般这种情况都建议修改为字段加方法的形式。
  以上内容为对《NET CLR via C#(第四版)》第十章内容的阅读笔记,只记录其中核心部分内容,书中对以上主题还进行详细的代码演示说明,如需要详细阅读请自行查阅本书第十章内容,感谢您的阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值