字段(成员变量)
什么是字段?
字段:是一种表示对象或类型(类与结构体)关联的变量
字段是变量,即存储数据的,但是与局部变量不同
字段是类型的成员,旧称“成员变量”
实例字段:用来帮助实例存储字段,实例字段的组合表示了实例(对象)当前状态。
静态字段:表示类型(类与结构体)的状态,使用static修饰。
描述某个学生的年龄,成绩就是实例字段。描述学生类型中的对象总数,是静态字段
namespace ConsoleApp1 { class Student { public int Age;//实例字段,描述一个学生对象 public int Score;//实例字段 public static int Amount;//静态字段,学生类型有多少个学生 public static int Average_score;//静态字段 public Student() { Student.Amount++; } } internal class Program { static void Main(string[] args) { Student student1 = new Student(); student1.Age = 15; student1.Score = 60; Student student2 = new Student(); student2.Age = 16; student2.Score = 90; Student student3 = new Student(); student3.Age = 16; student3.Score = 70; } } }
字段的声明
字段声明出现再类体里面,而语句是在方法体内。不要混淆字段与语句。
字段的初始化:系统会给字段(成员变量)默认值。也可手动初始化,一是直接在字段上(赋值)初始化器,二是在构造函数中初始化(赋值)。推荐前者。
修饰字段的标识符有:
new
public
protected
internal
private
static
readonly(只读)
volatile
实例只读字段:一旦初始化值,就不能改
public readonly int ID;
静态只读字段
示例:
namespace ConsoleApp2
{
struct Color
{
public int Red;
public int Green;
public int Blue;
}
class Brush
{
public static readonly Color c = new Color() { Red = 0, Green = 0, Blue = 0 };
}
internal class Program
{
static void Main(string[] args)
{
}
}
}
属性
什么是属性
属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态。
一杯霸王茶姬 对象温度特征为100度,则其就是很烫的状态
熊猫这个物种类型,总数特征只有几十,则其是物种稀少的状态
属性是字段的自然扩展
从命名上看,field更偏向于实例对象在内存中的布局,property更偏向于反映现实世界对象的特征:
对外:暴露数据,数据是可以存储在字段里的,也可以是动态计算出来的
对内:保护字段不被非法值”污染”
属性由Get/Set方法对进化而来(属性是C#特有)
Get/Set方法示例:
class Student
{
private int age;
public int GetAge()
{
return this.age;
}public void SetAge(int value)
{
if (value > 120 && value < 0)
{
this.age = value;
}
else
{
throw new Exception("年龄值有误");
}
}
}
}
属性示例:(简化Get/Set方法)
namespace ConsoleApp3
{
internal class Program
{
static void Main(string[] args)
{
Student student1 = new Student();
student1.Age=39;
}
}
class Student
{
public int age;
public int Age
{
get { return this.age; }
//value为上下文关键字,系统设定它为传进来的数据,不用声明
set
{
if (value <= 120 && value >= 0)
{
this.age = value;
}
else
{
throw new Exception("年龄值有误");
}
}
}
}
}
又一个”语法糖”——属性背后的秘密
编写简单,实际系统有相关复杂的操作。
属性的声明 ※(需复习)
set和get方法使用的变量是属性名,而不是字段名
完整声明----后台(back)成员变量与访问器(注意使用code snippet和refactor工具)
快捷键法 :输入propfull tab两下。
简略声明----只有访问器(查看IL代码)
快捷键法 :输入propfull tab两下。
动态计算值的属性
注意实例属性和静态属性
属性的名字一定是名词
只读属性一 只有getter没有setter
尽管语法上正确,几乎没有人使用”只写属性”,因为属性的主要目的是通过向外暴露数据而表示对象/类型的状态
属性与字段的关系
二般情况下,它们都用于表示实体(对象或类型)的状态
属性大多数情況下是字段的包装器(wrapper)
建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected的
索引器
索引器是这样的一种成员:它使对象能与数组一样进行索引
indexer再tab两下,快捷生成。
在C#中,索引器是一种特殊的属性,它允许我们将数组、集合或其他自定义类型的元素通过类似于数组的方式访问,无需指定下标变量。通常,索引器会使用两个参数,一个用于获取元素(读索引器),另一个用于设置元素(写索引器)。例如,你可以使用myList[index] = value
这样的语法来操作列表,这里的index
就是索引器。索引器提供了一种更加方便和直观的方式来访问数据,增强了程序的灵活性。
C#中的索引器通常是通过this[]
关键字声明的,并且需要实现get
和set
访问器方法。比如:
public class MyCustomClass
{
private List<int> _values;
// 索引器的声明和读取部分
public int this[int index]
{
get { return _values[index]; }
}
// 索引器的写入部分
public void this[int index] = value
{
_values[index] = value;
}
}