zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    关于JSON可能出现的错误,待更/todo
    mongoose的安装与使用(书签记录) 2017
    HTTP的学习记录3--HTTPS和HTTP
    HTTP的学习记录(二)头部
    HTTP(一)概述
    LeetCode 455. Assign Cookies
    LeetCode 453. Minimum Moves to Equal Array Elements
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 447. Number of Boomerangs
    LeetCode 416. Partition Equal Subset Sum
  • 原文地址:https://www.cnblogs.com/melao2006/p/4239294.html
Copyright © 2011-2022 走看看