本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题4,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。
面试题4 举例说明属性、get和set访问器的使用
.NET程序员面试秘笈
【考点】对属性(Property)的理解,C#中get和set访问器的编写方法,理解自动实现的属性。
【出现频率】
【解答】
本例通过属性操作类中声明的私有字段_username,请注意在Name属性的get和set访问器中的逻辑操作。本例还有一个自动实现的属性,可读取用户输入的数据。在ch01目录下新建一个程序文件,并命名为GetSet.cs,编写代码如程序1.5所示。
在命令行下编译GetSet.cs后,执行GetSet程序,其效果如图1.7所示。
本例中,首先创建Detail类的对象dt,将用户第1次输入数据赋值给dt对象的Name属性。在Name属性的set访问器中,用户输入的字符串前面拼接了“user-”字符串,然后赋值给_username字段。当读取Name属性时,get访问器将_username字段的值执行Substring(5)方法,将“user-”字符串去掉后返回。从整个过程来看,用户无法知道属性中数据经过了什么处理及数据最终存储在何处。而用户输入第2次数据,其值被写入Password属性,自动属性实现可将值写入匿名后备字段,读取时亦可直接返回其值。
说明:
本例仅展示了get和set访问器在属性中的使用,在索引器中使用方法是一样的。
【分析】
在前面的例子中使用了get和set访问器,通过访问器可以很方便地访问私有成员。其对外部暴露的部分可以为属性或索引器,属性比较常用。类体中的属性(Property)在使用时和一般的类成员没有区别,只是在内部实现的方法通过get和set访问器完成,这样更灵活、更隐蔽、更安全。其编写格式如以下代码所示:
访问修饰符 数据类型 属性名称
{
get
{
[访问修饰符2] 相关数据操作;
}
[访问修饰符3] set
{
和value关键字有关的数据操作;
}
}
当直接读取属性名称时,将会使用get访问器,执行“相关数据操作”的内容,相当于执行一个返回值为“数据类型”的方法。当直接赋值给属性名称时,被赋予的新值将替换隐式参数value,执行相关的数据操作。从代码中可知,get或set可添加访问修饰符,不过必须在get和set同时存在的情况下,且不能同时添加。当没有set访问器时,代表该属性为只读。
最常用的数据操作是读取和写入类中的私有字段(被称为后备字段),如果get和set访问器中不需要逻辑,仅仅通过属性完成赋值和写入值的功能,可以使用自动实现的属性。自动实现的属性可以提供比较简洁的格式,并且编译器将自动创建一个匿名后备字段(在类体中没有声明),其编写方法如以下代码所示:
访问修饰符 数据类型 属性名称{get;set}
访问修饰符 数据类型 属性名称{get;private set}
第1种自动实现的属性可直接读取和写入,使用者并不知道数据读取或写入了哪个字段(匿名后备字段)。第2种自动实现的属性为只读,无法写入。
注意:
属性提供了比较灵活的数据访问方法,读者编写代码时注意显式声明的set访问修饰符必须比属性修饰符更严格。get或set没有显式访问修饰符时,其默认访问限制和属性一致。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。