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#(第四版)》第十章内容的阅读笔记,只记录其中核心部分内容,书中对以上主题还进行详细的代码演示说明,如需要详细阅读请自行查阅本书第十章内容,感谢您的阅读。