笔记<二>C# 字段、属性、自动属性(转)

属性(Property) 是类(class)、结构(structure)和接口(interface)的命名(named)成员。类或结构中的成员变量或方法称为 域(Field)。属性(Property)是域(Field)的扩展,且可使用相同的语法来访问。它们使用 访问器(accessors) 让私有域的值可被读写或操作。
属性(Property)不会确定存储位置。相反,它们具有可读写或计算它们值的 访问器(accessors)。

例如,有一个名为 Student 的类,带有 age、name 和 code 的私有域。我们不能在类的范围以外直接访问这些域,但是我们可以拥有访问这些私有域的属性。 

类成员包括变量和方法。如果希望其他类能够访问成员变量的值,就必须定义成公有的,而将变量设为公有public,那这个成员变量的就可以被任意访问(包括修改,读取),这样不利于数据安全。 C#通过属性特性读取和写入字段(成员变量),而不直接直接读取和写入,以此来提供对类中字段的保护。属性可用于类内部封装字段。属性是C#面向对象技术中封装性的体现。

属性和字段的区别:
属性是逻辑字段,是字段的扩展,并不占用实际的内存;而字段占用内存空间。(这是很重要的区别)
属性可以被其他类访问;而非public的字段不能被直接访问。
属性可以对接受的数据在范围上做限定;而字段不能。
使用属性的情况:
要求字段只能读或者只能写;
需要限制字段的取值范围;
在改变一个字段的值的时候希望改变对象的其它一些状态;
使用字段的情况:
允许自由读写;
取值范围只受数据类型约束而无其他任何特定限制;
值的变动不需要引发类中其它任何成员的相应变化。

示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Person
    {
        private string _name;
        private string _identificationID;
        private string _phoneNumber;

        public string Name { get; set; }                        //可读,可写
        public string IdentificationID { get; private set; }    //只读
        public string PhoneNumber
        {
            get
            {
                return _phoneNumber;
            }
            set
            {
                if (value.Length != 11)
                {
                    Console.WriteLine("手机号码应该为11位!");
                }
                else
                {
                    _phoneNumber = value;
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person cherry = new Person();
            cherry.Name = "Cherry";
            cherry.PhoneNumber = "12345678910";
            cherry.IdentificationID = "320000000000000000";  //报错,由于定义的是只读属性
        }
    }
}

总结:虽然在实际项目的开发过程中,公共字段和属性在合适的条件下都可以使用,但是我们应该尽可能的使用属性(property),而不是数据成员(field);把所有的字段都设置为私有字段,如果要暴露它们,则把它们封装成属性,这也是微软推荐的方式。

根据属性的实现方式,属性可分为自动实现的属性和常规属性。

常规属性需要具体的人为的实现get访问器或者set访问器,而且一般需要有一个字段与之相对应;而自动实现的属性的get和set访问器的实现部分被省略掉了,而且代码中不需要有相对应的字段。

常规属性:

    public class Person
    {
        //-----------------------
        //普通属性
        //-----------------------
        private string name;
        /// <summary>姓名</summary>
        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }
    }

自动实现的属性:

    public class Person
    {
        //-----------------------
        //自动实现的属性
        //-----------------------
        /// <summary>姓名</summary>
        public string Name
        {
            get;
            set;
        }
    }

可以给自动实现的属性的get访问器或者set访问器添加访问权限修饰符(private,protected,internal),以控制该属性的访问权限。

(*注意给get或者set访问器添加的访问权限修饰符的访问权限,必须比该属性整体的访问属性的访问权限要小)

通过给get或者set访问器添加的访问权限修饰符,实现只读或者只写:

 public class Person
    {
        //-----------------------
        //自动实现的属性实现只读
        //-----------------------
        /// <summary>姓名</summary>
        public string Name
        {
            get;
            private set;
        }
    }

    public class Person
    {
        //-----------------------
        //自动实现的属性实现只写
        //-----------------------
        /// <summary>姓名</summary>
        public string Name
        {
            private get;
            set;
        }
    }

自动实现的属性有以下几点需要注意:

①必须同时实现set访问器和get访问器,缺一不可;

②自动实现的属性,编译器在运行时会自动生成一个私有的字段,这个自动生成的字段不能够直接访问;

③当需要实现对数据的合法性验证或者其它特殊处理的时候不能用自动实现的属性。

转载来源:http://www.cnblogs.com/PolarisSky/p/3871408.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值