C#学习六 字段、属性、索引器、常量

目录

  • 字段
    • 什么是字段
    • 字段的声明
    • 字段的初始值
  • 属性
    • 什么是属性
    • 属性的声明
    • 属性与字段的关系
  • 索引器(概述)
    • 什么是索引器
  • 常量
    • 什么是常量
    • 常量的应用场景

字段

什么是字段

  • 字段(field)是一种表示与对象或类型(类与结构体)关联的变量
  • 字段是类型的成员,旧称“成员变量”
  • 与对象关联的字段称为“静态字段”,由static修饰

字段的声明

  • 尽管字段的声明带有分号,但他不是语句
  • 字段的名字一定是名称

字段的初始值

  • 五显式初始化时,字段获得其类型的默认值,所以字段“永远都不会未被初始化”
  • 实例字段初始化的时机——对象创建时,必须实例化才可以使用
  • 静态字段初始化的时机——类型被加载(load)时,不用实例化就可以使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 实例字段和静态字段
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> stulist = new List<Student>();
            for (int stu = 0; stu < 100; stu++)
            {
                Student student = new Student();
                student.Age = 24;               //此处调用非静态变量,必须实例化才可以使用
                student.Score = stu;
                stulist.Add(student);
            }
            int totalAge = 0;
            int totalScore = 0;
            foreach (var item in stulist)
            {
                totalAge += item.Age;
                totalScore += item.Score;
            }
            Student.AverageAge = totalAge / Student.Amount;     //此处调用静态变量,可以不用实例化
            Student.AverageScore = totalScore / Student.Amount;
            Console.WriteLine("平均年龄为:{0}",Student.AverageAge);
            Console.WriteLine("平均成绩为:{0}",Student.AverageScore);
        }
    }

    class Student
    {
        public int Age;
        public int Score;

        public static int AverageAge;
        public static int AverageScore;
        public static int Amount;
        public Student()
        {
            Student.Amount++;
        }
        public static void ReportAmount()
        {
            Console.WriteLine(Student.Amount);
        }

        public static void ReportAverageAge()
        {
            Console.WriteLine(Student.AverageAge);
        }
        public static void ReportAverageScore()
        {
            Console.WriteLine(Student.AverageScore);
        }
    }
}
/*平均年龄为:24
 * 平均成绩为:49
 */

属性

什么是属性

  • 属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态

  • 属性是字段的自然拓展
    从命名上来看,field更偏向于实例化对象在内存的布局,property更偏向于反映现实世界对象的特征
    对外:暴露数据,数据可以是储存在字段里的,也可以是动态计算出来的
    对内:保护字段不被非法值“污染”

  • 属性有Get/Set方法对进化而来

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

namespace 私有字段
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student student = new Student();
                Console.WriteLine("请输入年龄值:");
                int age = Int32.Parse(Console.ReadLine());
                student.Setage(age);
                Console.WriteLine("这位同学的年龄为:{0}", student.Getage());
            }
            catch (Exception ex)        //抓住异常
            {
                Console.WriteLine(ex.Message);      //输出异常
            }
        }
    }
    class Student
    {
        private int age;
        public int Getage()         //获取字段值的方法
        {
            return this.age;
        }
        public void Setage(int value)   //对字段进赋值,此处就可以控制字段的输入形式
        {
            if (value>=0&&value<=120)
            {
                this.age = value;
            }
            else
            {
                throw new Exception("年龄输入超限!!");                  //抛出异常,但不会在输出端显示出来,可以结合catch语句搭配使用
            }
        }
    }
    /*输入:20
     *输出:这位同学的年龄为:20
     *输入:1212
     *输出:年龄输入超限!!
     *输入:输入字符串的格式不正确。
     */
}

使用get–set方法

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

namespace 私有字段
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Student2 student2 = new Student2();
                Console.WriteLine("请输入年龄值:");
                int age = Int32.Parse(Console.ReadLine());
                student2.Age = age;
                Console.WriteLine("这位同学的年龄为:{0}", student2.Age);
            }
            catch (Exception ex)        //抓住异常
            {
                Console.WriteLine(ex.Message);      //输出异常
            }
        }
        public class Student2
        {
            public int Age
            {
                get
                {
                    return this.Age;
                }
                set
                {
                    if (value >= 0 && value <= 120)
                    {
                        this.Age = value;
                    }
                    else
                    {
                        throw new Exception("年龄输入超限!!");                  //抛出异常,但不会在输出端显示出来,可以结合catch语句搭配使用
                    }
                }
            }

        }
    }
}

    /*输入:20
     *输出:这位同学的年龄为:20
     *输入:1212
     *输出:年龄输入超限!!
     *输入:输入字符串的格式不正确。
     */

属性的声明

  • 完整的声明——后台(back)成员变量与访问器(注意使用code snippet和refactor工具)
  • 简略声明——只有访问器(prop,再双击Tab键)
public class Student
{
    public Guid id { get; set; }
    public string age { get; set; }
}
  • 可以利用set方法动态计算值
  • 只读属性:只有getter没有setter

属性与字段的关系

  • 一般情况下,他们都用于表示实体(对象或类型)的状态
  • 属性大多数情况下是字段的包装器(wrapper)
  • 建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected

索引器(概述)

什么是索引器

索引器(快捷键:输入indexer后,再双击Tab键)是这样一种成员:他使对象能够用与数组相同的方式(即下标)进行索引

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

namespace 索引器
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student["math"] = 90;
            var mathscaore = student["math"];

            Console.WriteLine(mathscaore);
        }
    }

    class Student
    {
        private Dictionary<string, int> keyValuePairs = new Dictionary<string, int>();

        //声明索引器indexer,双击Tab
        public int? this[string subject]
        {
            get {
                if (this.keyValuePairs.ContainsKey(subject))
                {
                    return this.keyValuePairs[subject];
                }
                else
                {
                    return null;
                }
            }
            set {
                if (value.HasValue==false)//检查value是否为空值
                {
                    throw new Exception("对不起,值不可以为空值!!");
                }
                if (this.keyValuePairs.ContainsKey(subject))
                {
                    this.keyValuePairs[subject] = value.Value;      //可空类型获取值的方法
                }
                else
                {
                    this.keyValuePairs.Add(subject, value.Value);
                }
                }
            }
        }  
 }
//输出:90

常量

什么是常量

  • 常量(constant)是表示常量值(即:可以在编译时计算的值)的类成员
  • 常量隶属于类型而不是对象,即没有“实例常量”
    实例常量的角色由只读实例字段来担当
  • 注意区分成员常量与局部常量

常量的应用场景

  • 为了提高程序的可读性和执行效率——常量
  • 为了防止对象的值被改变——只读字段
  • 向外暴露不允许被修改的数据——只读属性(静态或非静态),功能与常量有一些重叠
  • 当希望成为常量的值其类型不能被常量声明接收时(类/自定义结构体)——静态只读字段

你可能感兴趣的:(学习C#)