C# 学习之路(类的基本概念)
类是一种活动的数据结构
程序的数据和功能被组织为逻辑上相关的数据项和函数封装的集合,并称为类
类包含数据成员和函数成员:
数据成员:存储与类或类的实例相关的数据(类体内的变量,字段)
函数成员:执行代码,通常会模拟类所表示的现实世界事物的功能和操作(类体内的函数,方法)
一个 C# 类可以有任意的数目的数据成员和成员函数。成员可以是 9 种成员类型的任意组合
类的声明定义新类的特征和成员。它并不创建类的实例,但创建用于创建实例的模板。类的声明提供下列内容:
- 类的名称
- 类的成员
- 类的特征
关键字 类名 class MyExcellentClass { 成员声明 }
字段和方法是最重要的的类成员类型。字段是数据成员,方法是函数成员。
字段是隶属于类的变量。
可以是任何类型,无论是预定义类型还是用户定义类型
和所有变量一样,字段是用来保存数据的(可以被写入和读取)
class MyClass { 类型 字段名 int MyField; }
C# 在类型的外部不能声明全局变量,所有的变量都必须在类型声明内部声明
因为字段属于变量,所以字段的初始化和变量的初始化相同。
字段初始化是字段声明的一部分
初始化值必须是编译时可确定的
如果没有初始化语句,字段的值会被编译器设为默认值,默认值由字段的类型决定。(每种值类型的默认值为 0,但 bool 的默认值为 false,引用类型的默认值为 null)
class MyClass { int i1, i2 = 3; double d1; string s1; } Console.WriteLine($"i1 = {i1}, i2 = {i2}, d1 = {d1}, s1 = {s1}"); //输出 (s1 为 null 所以没有输出) i1 = 0, i2 = 3, d1 = 0, s1 =
可以通过用逗号分隔名称的方式,在同一条语句种声明多个相同类型的字段。
int F1 = 1, F3; string F2 = "abc";
方法是具有名称的可执行代码块,可以从程序的很多不同地方执行,甚至从其他程序中执行。
当方法被调用时,它执行自己所含的代码,然后返回到调用它的代码并继续执行调用代码。(和C++的函数类似)
声明方法包括以下组成部分:
返回类型:声明方法返回值的类型(int、double、void…)
名称:方法名
参数列表:由一对空的圆括号组成,如果有参数,将被列在圆括号里
方法体:由一对大括号组成,大括号内包含执行代码
class SimpleClass { 返回值 参数列表 void PrintNums(){ Console.WriteLine("1"); } }
C# 没有全局函数
类的声明只是用于创建类的实例的蓝图,一旦类被声明,就可以创建类的实例。
类是引用类型,所以需要为数据引用和实际数据都申请内存
数据的引用保存在一个类类型的变量中,要创建类的实例,需要从声明一个类类型的变量开始。
class Dealer { ...... } class Program { static void Main() { Dealer theDealer; //声明Dealer类型的变量theDealer,因为没有初始化,所以值是未定义 } }
声明类类型的变量所分配的内存是用来保存引用的,而不是用来保存类对象实际数据的。要为实际数据分配内存,需要使用
new
运算符。
new 运算符为任意指定类型的实例分配并初始化内存
使用 new 运算组成一个对象创建表达式,如下所示:
2.1 关键字
new
2.2 要分配内存实例的类型名称
2.3 成对的圆括号
关键字 类型名 圆括号 new TypeName()
如果将内存分配给一个引用类型,则对象创建表达式返回一个引用,指向堆中被分配并初始化的对象实例
class Dealer { ...... } class Program { static void Main() { Dealer theDealer = new Dealer(); } }
类声明相当于蓝图,通过这个蓝图想创建多少个类的实例都是可以的。
- 实例成员:类的每个实例都是不同的实体,有着自己的一组数据,不同于同类的其它实例
- 静态成员:实例成员是默认类型,但也可声明与类而不是实例相关的成员
从类的内部,任何函数成员都可以使用名称访问类中的任意其它成员。
访问修饰符是成员声明的可选部分,指明程序的其它部分任何访问成员。下面是字段和方法声明的语法:
字段:访问修饰符 类型 标识符;
public int k = 0;
方法:访问修饰符 返回类型 方法名(){…}
static void Program { ....... }
5 种成员访问控制
私有的(private) 共有的(public) 受保护的(protected) 内部的(internal) 受保护内部的(protected internal)
私有成员只能从声明它的类的内部访问,其它的类看不见或无法访问他们。
- 私有访问是默认的访问级别,如果一个成员在声明是不带访问修饰符,那就是私有成员。
- 可以使用
private
访问修饰符显示地将一个成员声明为私有,隐式声明(不带访问修饰符)和显式声明(用 private)私有成员两种形式是等价的。int MyInt1; // 隐式声明私有 private int MyInt2; // 显示声明私有
实例的公有成员可以被访问。共有成员必须使用
public
访问修饰符指定。public int Myint;
- 公有访问和私有访问图示
- 类成员为类框中的小标签框
- 私有成员完全封闭在他们的类框中
- 公有成员有一部分伸出它们的类框之外
class Program { int Member1; private Member2; public Menber3; }
- 成员访问实例
class C1 { int F1; //隐式私有字段 private int F2; //显示私有字段 public int F3; //公有字段 void DoCalc() //隐式私有方法 { ...... } public int GetVal() //公有方法 { ...... } }
class MyClass
{
// 字段
int I1 = 17, I2 = 1;;
float F1 = 10;
public string k = "abc";
// 方法
int Addval()
{
I1 += I2; // 访问私有字段
return I1;
}
public void Getval()
{
Console.WriteLine("{0}", Addval()); // 访问私有方法
}
public float Avx()
{
Console.WriteLine($"{k}");
return F1 * I1;
}
}
要从类的外部访问实例成员,必须包括变量名称和成员名称,中间用点(.)分隔。这称为点运算符
MyClass myClass = new MyClass(); float fValue = myClass.Avx();