翼度科技»论坛 编程开发 .net 查看内容

C#中的属性

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
公众号「DotNet学习交流」,分享学习DotNet的点滴。

简介

属性是代表类的实例或类中的一个数据项的成员,使用属性看起来非常像写入或读取一个字段,语法是相同的。
下面的代码展示了名称为D的类的使用,它有一个公有字段和一个公有属性,从用法无法区分它们。
  1. D d = new D();<br>​<br>d.MyField = 7; //给字段赋值<br>d.MyProperty = 10; //给属性赋值<br>Console.WriteLine($"{d.MyField} {d.MyProperty}"); //读取字段和属性
复制代码
与字段类似,属性有如下特征:
1、它是命名的类成员。
2、它有类型。
3、它可以被赋值和读取。
和字段不同的是,属性是一个函数成员。
1、它不为数据存储分配内存。
2、它执行代码。
一个关于属性的简单示例

代码如下:
  1. public class Person<br>{<br>    private string name; // 私有字段<br>​<br>    public string Name<br>    {<br>        get<br>        {<br>            // 这是属性的get访问器,用于获取属性的值<br>            return name;<br>        }<br>        set<br>        {<br>            // 这是属性的set访问器,用于设置属性的值<br>            name = value;<br>        }<br>    }<br>}
复制代码
这个示例的图示如下:

在这个示例中,Name 属性提供了对 name 字段的访问,但它本身并不存储数据。当您使用 person.Name 读取属性时,实际上调用了属性的get访问器来获取字段的值,而当您使用 person.Name = "John" 设置属性时,实际上调用了属性的set访问器来设置字段的值。
属性声明和访问器

set和get访问器有预定义的语法和语义。可以把set访问器想象成一个方法,带有单一的参数“设置”属性的值,get访问器没有参数并从属性返回一个值。
set访问器的特点
1、有一个单独的、隐式的值参,名称为value,与属性的类型相同。
2、返回类型void。
get访问器的特点
1、没有参数。
2、返回类型与属性类型相同。
属性和关联字段

属性常和字段关联,一种常见的方式是在类中将字段声明为private以封装该字段,并声明一个public属性来控制从类的外部对该字段的访问,和属性关联的字段常被称为后备字段或后备存储。
属性和它们的后备字段有几种命名约定。
一种约定是两个名称使用相同的内容,但字段使用Camel大小写,属性使用Pascal大小写。(Camel大小写风格中,复合词标识符中每个单词的首字母大写,出来第一个单词,其余字母都是小写,Pascal大小写风格中,复合词中每个单词的首字母都是大写。)
另一种约定是属性使用Pascal大小写,字段使用相同标识符的Camel大小写版本,并以下划线开始。
两种约定的示例代码如下:
  1.        // 第一种约定的写法<br>        private int firstField; // Camel大小写<br>        public int FirstField   // Pascal大小写<br>        {<br>            get { return firstField; }<br>            set { firstField = value;}<br>        }<br>​<br>        // 第二种约定的写法<br>        private int _secondField; // 下划线及Camel大小写<br>        public int SecondField   // Pascal大小写<br>        {<br>            get { return _secondField; }<br>            set { _secondField = value; }<br>        }
复制代码
只读和只写属性

要想不定义属性的某个访问器,可以忽略该访问器的声明。
只有get访问器的属性称为只读属性。只读属性是一种安全的,把一项数据从类或类的实例中传出,而不允许太多访问方法。
只有set访问器的属性称为只写属性。只写属性是一种安全的,把一项数据从类的外部传入类,而不允许太多的访问的方法。
两个访问器至少有一个必须定义,否则编译器会报错,如下图所示:

自动实现属性

因为属性经常被关联到后备字段,C#提供了自动实现属性(automatically implemented property),允许只声明属性而不声明后备字段,编译器会为我们创建隐藏的后备字段,并且自动挂接到get和set访问器上。
自动实现属性的注意点:
1、不声明后备字段,编译器会根据属性的类型分配存储。
2、不能提供访问器的方法体,它们必须被简单地声明为分号。get担当简单的内存读,set担当简单的写。
3、只有通过访问器才能访问后备字段。因为不能用其他的方法访问它,所以实现只读和只写属性没有意义,因此必须同时提供读写访问器。
一个自动实现属性的示例,代码如下:
  1.    public class Person<br>    {<br>        public string Name   // 没有声明后备字段<br>        {<br>            get; set;        // 访问器的方法体被声明为分号<br>        }<br>​<br> <br>    }<br>        internal class Program<br>    {<br>        static void Main(string[] args)<br>        {<br>            Person person = new Person();<br>            Console.WriteLine(person.Name); // 想使用规则属性那样使用自动属性<br>            person.Name = "小王";<br>            Console.WriteLine(person.Name);<br>        }<br>    }
复制代码
运行结果如下图所示:

参考资料

《C#图解教程(第4版)》——Daniel M. Solis

来源:https://www.cnblogs.com/mingupupu/archive/2023/11/20/17844001.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具