• C#属性


    属性是对现实世界中实例特征的抽象,它提供对类或对象性质的访问。例如人的姓名、年龄、体重和身高等都可以作为属性。类的属性所描述的是状态信息,在类的某个实例中属性的值表示该对象的状态值。

    在C#中,通过访问器来访问属性,使用get访问器和set访问器对属性的值进行读写。

    一、属性的声明

    下面的代码是一个完整的属性声明:
     
    private string computer;  // 私有的computer字段
    public string Computer
    {
        get
        {
            return computer;
        }
        set
        {
            computer = value;
        }
    }

    为什么要使用属性?为了不让所有人随便访问修改变量,我们需要为变量设置读写条件,这样做也利于类的安全性和封装性,所以要使用属性。

    声明属性的语法格式如下:

    修饰符 返回类型 属性名
    {
        get
        {
            return 需要访问修改的字段;
        }
        set
        {
            需要访问修改的字段 = value;
        }
    }

    ?修饰符:可以是new、public、protected、internal、private、static、virtual、sealed、override或abstract等,其中static、virtual、override和abstract修饰符不能同时使用。

    ?返回类型:需要与要修改和访问的字段同类型。

    ?属性名:不要与字段同名。
    当我们使用属性来访问(读)该字段时,就会调用里面的get方法;当我们要修改该字段时,就会调用set方法。

    定义一个属性时,可以只写get方法而不写set方法,也可以不写get方法而只写set方法,或者两种方法都不写。

    ?当只有get方法(get访问器)时,只能访问不能修改。

    ?当只有set方法时,只能修改不能访问。

    ?同时具有get方法和set方法时,表示属性的值既能读取又能修改。

    其中set方法中有一个名为“value”的隐式参数,此参数的类型是属性类型,如果在该访问器内的局部变量或常量声明中出现该名称,则会导致编译时出错。

    除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”,其它所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。

    二、属性的种类

    属性可以分为静态属性和实例属性。

    ?当属性声明中包含static修饰符时,该属性就称为静态属性。它不与特定实例相关联,因此在静态属性的访问器内引用this会导致编译时错误。

    ?当属性声明中没有包含static修饰符时,该属性就称为实例属性。它与类的一个给定实例相关联,该实例可以在属性的访问器内用this来访问。

    三、访问属性的值示例
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace Test
    {
        class Program
        {
            class Person
            {
                public static int Number;       // 公共静态字段,表示人的编号
                private static int counter = 0; // 私有静态字段,表示人的编号
                private string name;            // 私有实例字段,表示人的姓名
                private int age;                // 私有实例字段,表示人的年龄
                public Person()
                {
                    counter = ++counter + Number; // 计算人的编号
                }
                public string Name// 可读写实例属性Name,用于检索和设置私有字段name
                {
                    get { return name; }
                    set { name = value; }
                }
                public int Age  // 可读写实例属性Age,用于检索和设置私有字段age
                {
                    get { return age; }
                    set { age = value; }
                }
                // 只读静态属性Counter,只包含get访问器,用于检索私有字段counter
                public static int Counter
                {
                    get { return counter; }
                }
            }
            static void Main(string[] args)
            {
                // C#属性-www.baike369.com
                Person.Number = 1000;
                Person personA = new Person();
                personA.Name = "LiPing";     // 为实例属性Name赋值
                personA.Age = 18;            // 为实例属性Age赋值
                Console.WriteLine("Person.number:{0} personA.Name:{1}
                        personA.Age:{2}", Person.Counter, 
                        personA.Name, personA.Age);
                Console.ReadLine();
            }
        }
    }

    运行结果:

    Person.number:1001      personA.Name:LiPing      personA.Age:18

  • 相关阅读:
    $POST数组论证($GET || $COOKIE || $REQUEST 同理)
    PHP之preg_replace()与ereg_replace()正则匹配比较讲解
    PHP之mysql_real_escape_string()函数讲解
    浅析白盒审计中的字符编码及SQL注入
    PHP之list()函数讲解
    PHP之implode与explode函数讲解
    PHP之Error与Logging函数讲解
    Nextcloud私有云盘在Centos7下的部署笔记
    Linux下路由配置梳理
    实验c语言不同类型的指针互用(不推荐只是学习用)
  • 原文地址:https://www.cnblogs.com/melao2006/p/4239294.html
Copyright © 2020-2023  润新知