字段、属性、索引器、常量

前言

类的成员是静态成员 (static member) 或者实例成员 (instance member)。 静态成员属于类, 实例成员属于对象(类的实例) 。下表提供了类所能包含的成员种类的概述。

成员说明
常量与类关联的常量值
字段类的变量
方法类可执行的计算和操作
属性与读写类的命名属性相关联的操作
索引器与以数组方式索引类的实例相关联的操作
事件可由类生成的通知
运算符类所支持的转换和表达式运算符
构造函数初始化类的实例或类本身所需的操作
析构函数在永久丢弃类的实例之前执行的操作
类型类所声明的嵌套类型

本节所讲的字段、属性、索引器、常量为类的四个成员。

字段 Field

什么是字段

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

字段的声明

参见C#语言定义文档
尽管字段声明带有分号,但它不是语句

字段是类内部用于存储数据的变量。比如:

public int RequestPower; 公共字段
private int RequestPower; 私有字段

声明一个字段,可以用访问修饰符+类型+变量名称来声明,下图是一个简单的示例:

public class 家庭
{
    public int 成员变量;
    public static string 口号;
    protected readonly int 星级;
}

属性

属性是一种成员,它提供了一套灵活的机制来读取、写入或计算私有字段的值。也可以这样理解:属性是外部访问这些数据的受控通道。

C++、JAVA 里面是没有属性的,使用 Get/Set 来保护字段的方法至今仍在 C++、JAVA 里面流行。因为 Get/Set 写起来冗长,微软应广大程序员请求,给 C# 引入了属性。

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var stu1 = new Student();
            stu1.Age=20;

            var stu2 = new Student();
            stu2.Age = 20;

            var stu3 = new Student();
            stu3.Age = 200;

            var avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;

            Console.WriteLine(avgAge);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

class Student
{
    private int age;

    public int Age
    {
        get
        {
            return age;
        }

        set
        {
            if (value >= 0 && value <= 120)
            {
                age = value;
            }
            else
            {
                throw new Exception("Age value has error.");
            }
        }
    }
}
  • 建议:永远使用属性(而不是字段)来暴露数据,即字段永远是 private 或 protected 的。 字段只在类内部使用,类之间交换数据,永远只用属性。
  • 小结:使用属性有以下好处:

    1、首先是接口的稳定性:可以在不改变公共接口调用的情况下,将简单的自动实现属性修改为具有验证,异常记录等复杂逻辑的属性。
    2、可以进行精细的访问控制,比如在访问器中设置属性的权限实现外部只读,内部可写的安全属性。体现了封装的重要性。

索引器(Indexer)

什么是索引器

C# 中的索引器是一种特殊的类成员,它让对象的实例可以像数组一样通过下标访问。简单来说,它让您可以用类似 myObject[0] 的方式来获取或设置值,而不是通过方法调用。

如何使用索引器

索引器的基本语法是:

public element-type this[int index]
{
    get { return value; } // 获取值
    set { /* 设置值 */ } // 设置值
}

例如,可以创建一个类,让它像数组一样操作:

public class MyList
{
    private int[] array = new int[10];
    public int this[int index]
    {
        get { return array[index]; }
        set { array[index] = value; }
    }
}

使用时,像这样:

MyList list = new MyList();
list[0] = 10;
Console.WriteLine(list[0]); // 输出:10
索引器与属性的对比

索引器和属性有相似之处,但也有区别:

  • 属性通过名称访问(如 myProperty),索引器通过索引访问(如 myObject[0])。
  • 属性可以是静态的,索引器必须是实例成员。
  • 索引器的 get 和 set 访问器带有参数,而属性的 get 没有参数。
应用场景

索引器常用于自定义集合类或需要类似数组访问的对象,例如管理学生成绩:

public class Course
{
    private int chinese, english, math;
    public int this[string subject]
    {
        get { /* 返回对应科目成绩 */ }
        set { /* 设置对应科目成绩 */ }
    }
}

常量

常量是 C# 中使用 const 关键字声明的固定值,程序运行期间不会改变。例如,数学中的 π(3.14159)或最大尝试次数(如 3)可以定义为常量。它们必须在声明时初始化,且一旦设置后不可修改。

如何声明常量?
声明常量的语法是 const 数据类型 常量名 = 值;,例如:

const int MaxValue = 100;
const string CompanyName = "Microsoft";
常量类型可以是整数(如 int)、浮点数(如 double)、字符(如 char)、字符串(如 string)或布尔值(如 bool)。

常量的用途
常量适合表示固定不变的值,如数学常量、配置参数等,避免硬编码数字,提高代码可读性和维护性。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值