码农小白 C#篇
深入理解类Ⅰ(类成员)
1、类成员
类成员的类型
数据成员 | 函数成员(执行代码) |
---|---|
字段 | 方法 |
常量 | 属性 |
构造函数 | |
析构函数 | |
运算符 | |
索引 | |
事件 |
2、实例类成员
类成员可以关联一个类实例,也可以关联到类的整体,即所有类的实例。可以认为每个类的实例都拥有着各自的各个类成员的副本,这些成员叫实例成员。
class A
{
public int number;
}
class Program
{
static void Main()
{
A a1 = new A();
A a2 = new A();
a1.number = 18; a2.number = 2020;
Console.WriteLine("a1.number = {0}, a2.number = {1}", a1.number, a2.number);
}
}
输出结果
a1.number = 18, a2.number = 2020
3、静态成员
1、静态字段
静态字段被所有实例共享,所有实例对其访问的是同一地址。
静态字段不被实例也可访问
类名.字段名
可以用static 修饰符将字段说明为静态字段
用一个例子说明: 一个班的班费是班里所有人共享的,同学A花了5元买垃圾袋,同学B花了16元买笔记本,
那么现在剩余的班费 = 原班费 - 5 - 16
因为班费是共享的,所有每个人的可用班费都改变了
class A
{
int number1; //声明实例字段
static int number2 = 5; //声明静态字段
}
2、静态函数
同静态字段,静态方法独立于任何类实例。即使没有也能被调用
类名.方法名();
class MyMathf
{
static int Add(int a, int b) //声明静态方法
{
return a + b;
}
}
4、从外部访问静态成员
class A
{
int number1; //声明实例字段
static int number2 = 5; //声明静态字段
static int Add(int a, int b) //声明静态方法
{
return a + b;
}
}
class Program
{
static void Main()
{
Console.WriteLine(A.number2); //访问静态字段
int tmp = A.Add(5, 9);
Console.WriteLine(tmp); //调用静态方法
}
}
5、关于静态成员的补充
即使类没有实例,也存在静态成员,并且可以访问。
可以声明为静态的类成员类型
数据成员 | 函数成员(执行代码) |
---|---|
√ 字段 | √ 方法 |
常量 | √ 属性 |
√ 构造函数 | |
√ 析构函数 | |
√ 运算符 | |
索引 | |
√ 事件 |
6、成员常量
class Myclass
{
const int number = 99; //定义一个常量,值为99
}
成员常量也可像访问静态字段一样访问,但成员常量不能声明为静态
7、属性
属性是代表类实例或类中的一个数据项的成员。
属性常用于类的封装
1、属性声明和访问器
- set访问器:用于数据的写入,返回类型为void
- get访问器:用于数据的读取,返回类型与属性类型相同
class A
{
public int Var1 //声明属性
{
set {...} //set访问器
get {...} //get访问器
}
}
2、属性关联字段和属性的使用
class A
{
private int var1; //字段
public int Var1 //关联var1字段
{
set //set访问器
{
var1 = value; //写入var1
}
get //get访问器
{
return var1; //读取var1
}
}
}
calss Program
{
static void Main()
{
A a1 = new A();
//a1.var1 = 5; //错误,var1为私有字段,不可访问
a1.Var1 = 5; //属性Var1的写入
Console.WriteLine(a1.Var1); //属性Var1的读取
}
}
输出结果
5
3、对属性执行其他计算(重点)
访问器不局限于仅仅对关联数据的传输。
class Myclass
{
private int year; //定义 年龄 字段
public int Year1 //关联var1字段
{
set
{
if(value < 0)
year = 0; //确保年龄不为负数
else
year = value;
}
get
{
if(year > 18)
return = 18; //对年龄进行保密
else
return var1;
}
}
}
4、只读和只写属性
有时我们不希望他人更改或读取我们的数据,就需要对属性进行只读或只写封装。
int Var1
{
get {...} //属性的只读封装
}
int Var2
{
set {...} //属性的只写封装
}
5、属性的自动实现
class A
{
public int Var1
{
get; set;
}
}
6、静态属性
class A
{
public static int Var1
{
get {...}
set {...}
}
}