前言
类的成员是静态成员 (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)。
常量的用途
常量适合表示固定不变的值,如数学常量、配置参数等,避免硬编码数字,提高代码可读性和维护性。

1010

被折叠的 条评论
为什么被折叠?



