面向过程和面向对象编程
在类出现之前,例如C语言,是没有类的概念的。C语言这类没有类,没有对象的变成,称为:面向过程编程。
面向过程编程:程序就是一系列的指令序列,核心是优化执行步骤
现在有了类:就可以面向对象编程
面向对象编程:程序就是一系列的封装好的类,核心是把数据 + 操作数据的函数打包到逻辑相关的单元中,这个单元就是类(class)。
类的定义
类是包括存储的数据、可执行的代码的一种数据结构,包含两类成员:
- 数据成员(Data Members) 存储对象属性数据: 字段 (Fields)、常量 (Constants)
- 函数成员(Function Members) 执行对象行为逻辑 :如方法、属性、构造函数、析构函数、运算符、索引器、事件
类是封装了逻辑关联数据与函数的集合,用于映射现实 / 抽象世界中的事物。
一句话概括,类是有数据和函数组成的一种数据机构,通过它可以创建对象,通过对象可以访问数据和成员,在类的内部也可以访问数据和成员。
类的声明
class 关键字仅定义类模板,不会创建对象实例;模板包含三部分:类名、类成员、类特性。
语法
class 类名
{
// 成员声明(字段、方法等,顺序无强制要求)
}Code language: C# (cs)
类声明也常被称为类定义(class definition)
class Program
{
static void Main(string[] args)
{
AddCalculator addCalculator = new AddCalculator();
SubCalculator subCalculator = new SubCalculator();
}
}
class AddCalculator
{
public int A { get; set; }
public int B { get; set; }
public int Add()
{
return A + B;
}
}
class SubCalculator
{
public int A { get; set; }
public int B { get; set; }
public int Subtract()
{
return A - B;
}
}Code language: C# (cs)
上面例子,下面声明了两个类一个用来算加法,一个用来算减法,然后主程序Main函数里面去使用它们来创建实例。
本内容是来自foxdevelop.com
类的声明,不一定要从上到下的,也就是你可以把类的声明放到下面,然后在上面的主函数中调用完全是可以的,因为类只是一个模板蓝图,代码不是从上往下执行的,它是从Main函数开始,用到那个类,就去找这个蓝图。

类成员
字段(Fields)
字段是隶属于类的变量,可以是内置类型 / 自定义类型,支持读写数据。
类型 字段名;
class MyClass
{
int MyField; // int类型字段MyField
}Code language: C# (cs)
关键区别于 C/C++:C# 不存在全局变量,所有字段必须写在类型(类 / 结构体)内部。
字段初始化规则
(1)隐式初始化(无赋值)
编译器自动赋予该类型默认值,默认值根据类型不同而不同。
int F1; // 默认 0
string F2; // 默认 nullCode language: JavaScript (javascript)
下面是C#的类型和默认值的对照关系,是字段中的默认值,局部变量必须程序员初始化的。
基本值类型
| 数据类型 | 默认值 | 说明 |
|---|---|---|
sbyte | 0 | 有符号 8 位整数 |
byte | 0 | 无符号 8 位整数 |
short | 0 | 有符号 16 位整数 |
ushort | 0 | 无符号 16 位整数 |
int | 0 | 有符号 32 位整数 |
uint | 0 | 无符号 32 位整数 |
long | 0L | 有符号 64 位整数 |
ulong | 0UL | 无符号 64 位整数 |
float | 0.0f | 单精度浮点数 |
double | 0.0d | 双精度浮点数 |
decimal | 0.0m | 高精度十进制小数 |
char | '\0'(空字符,ASCII 0) | 单个字符 |
bool | false | 布尔类型 |
枚举 Enum | 基础整型 0 对应枚举项 | 枚举底层是整数,默认 0 |
结构体 struct | 所有字段各自取默认值 | 自定义值类型,整体清零 |
引用类型
所有引用类型默认值统一为 null,代表不指向堆中任何对象。
也就是没有保存任何的内存地址,还记得我们前面画的四意图中的,引用类型存储000001 01010,这个就是堆中的内存地址,如果是null,就是没有保存任何一个内存地址。
| 类型分类 | 示例类型 | 默认值 |
|---|---|---|
| 内置引用类型 | string、object | null |
自定义类 class | Person Student | null |
| 数组(任意维度) | int[]、string[,] | null |
| 委托 / 事件 | Action、Func、自定义 delegate | null |
接口 interface | 任意接口变量 | null |
例子
string str; // 默认 null
Student jason; // 自定义类,默认 null
int[] arr; // 数组,默认 null
Action callback; // 委托,默认 nullCode language: JavaScript (javascript)
可空类型(Nullable / T?)
对于基本数据类型,在后面增加一个?,就变成另外一种类型,允许为空。也就是连默认值都没有,上面我们说int age; 如果不赋值默认是0.但是我们希望,连值都没有,这时候可以这样int? age2; 那么这个age2就是可空的,也就是你可以给它赋null值,int? age2 = null;
可空类型是包装后的 ValueType,默认值为 null,代表 “无有效值”
| 声明写法 | 默认值 |
|---|---|
int? num | null |
bool? flag | null |
decimal? price | null |
class Test
{
int a; // 自动 = 0
string b; // 自动 = null
bool c; // 自动 = false
}Code language: JavaScript (javascript)
(2)显式初始化
声明时用=赋值,赋值表达式必须编译时可确定值,(也就是不允许值是随机的,或者是用户录入的)
int days = 25;
string word = "foxdevelop";Code language: JavaScript (javascript)
(3)同类型多字段简写
同类型可逗号分隔批量声明,不能混合不同类型
int player, blood = 25;
string title, subTitle = "hi well come to foxdevelop.com";Code language: JavaScript (javascript)
方法(Methods)
方法定义
方法是可复用、具名的可执行代码块,对应 C++ 的成员函数;调用后执行内部代码并返回调用处,分「有返回值」「无返回值」两类。
方法四要素
- 返回类型:无返回值写
void - 方法名
- 参数列表:空参也必须带
() - 方法体:
{}包裹执行代码
class Program
{
static void Main(string[] args)
{
Robot robot = new Robot();
robot.SayHello();
}
}
class Robot
{
public void SayHello()
{
Console.WriteLine("Hello erveryone");
Console.WriteLine("Welcome to visit foxdevelop.com");
}
}Code language: C# (cs)
public void SayHello() 前面的public 是修饰符,表示这个函数是可以在类的外面访问的(通过对象名.函数名)。如果没有public,则默认是private,是私有的,私有的函数,只能在类体内部访问。类体的外面无法访问,就算使用对象名,比如robot,页无法访问

创建类变量与实例
1. 引用类型基础特性
类属于引用类型,内存分为两块:
- 栈 (Stack):存储引用变量(内存地址指针)
- 堆 (Heap):存储对象真实数据
2. 分步创建对象
1 仅声明引用变量(只分配栈内存,无堆数据)
Robot robot;
// 仅栈上开辟引用空间,值为未定义,堆中无对象
Code language: JavaScript (javascript)

2 new 运算符分配堆内存
new 类型名();Code language: JavaScript (javascript)
- 在堆分配内存、自动初始化所有字段默认值
- 返回堆对象的引用地址,赋值给栈变量
robot = new Robot ();
Code language: JavaScript (javascript)

class Program
{
static void Main(string[] args)
{
Robot robot;
robot = new Robot();
}
}
class Robot
{
void SayHello()
{
Console.WriteLine("Hello erveryone");
Console.WriteLine("Welcome to visit foxdevelop.com");
}
}Code language: C# (cs)
3. 声明实例化一步完成
Robot robot = new Robot ();Code language: C# (cs)
class Program
{
static void Main(string[] args)
{
Robot robot = new Robot();
}
}Code language: C# (cs)