类定义

面向过程和面向对象编程

在类出现之前,例如C语言,是没有类的概念的。C语言这类没有类,没有对象的变成,称为:面向过程编程

面向过程编程:程序就是一系列的指令序列,核心是优化执行步骤

现在有了类:就可以面向对象编程

面向对象编程:程序就是一系列的封装好的类,核心是把数据 + 操作数据的函数打包到逻辑相关的单元中,这个单元就是类(class)

类的定义

类是包括存储的数据、可执行的代码的一种数据结构,包含两类成员:

  1. 数据成员(Data Members) 存储对象属性数据: 字段 (Fields)、常量 (Constants)
  2. 函数成员(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#的类型和默认值的对照关系,是字段中的默认值,局部变量必须程序员初始化的。

基本值类型

数据类型默认值说明
sbyte0有符号 8 位整数
byte0无符号 8 位整数
short0有符号 16 位整数
ushort0无符号 16 位整数
int0有符号 32 位整数
uint0无符号 32 位整数
long0L有符号 64 位整数
ulong0UL无符号 64 位整数
float0.0f单精度浮点数
double0.0d双精度浮点数
decimal0.0m高精度十进制小数
char'\0'(空字符,ASCII 0)单个字符
boolfalse布尔类型
枚举 Enum基础整型 0 对应枚举项枚举底层是整数,默认 0
结构体 struct所有字段各自取默认值自定义值类型,整体清零

引用类型

所有引用类型默认值统一为 null,代表不指向堆中任何对象。

也就是没有保存任何的内存地址,还记得我们前面画的四意图中的,引用类型存储000001 01010,这个就是堆中的内存地址,如果是null,就是没有保存任何一个内存地址。

类型分类示例类型默认值
内置引用类型stringobjectnull
自定义类 classPerson Student null
数组(任意维度)int[]string[,]null
委托 / 事件ActionFunc、自定义 delegatenull
接口 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? numnull
bool? flagnull
decimal? pricenull
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++ 的成员函数;调用后执行内部代码并返回调用处,分「有返回值」「无返回值」两类。

方法四要素

  1. 返回类型:无返回值写void
  2. 方法名
  3. 参数列表:空参也必须带()
  4. 方法体:{}包裹执行代码

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. 引用类型基础特性

类属于引用类型,内存分为两块:

  1. 栈 (Stack):存储引用变量(内存地址指针)
  2. 堆 (Heap):存储对象真实数据

2. 分步创建对象

1 仅声明引用变量(只分配栈内存,无堆数据)
Robot robot; 
// 仅栈上开辟引用空间,值为未定义,堆中无对象
Code language: JavaScript (javascript)
上面代码,相当于栈中有一个变量,用来存储Robot的引用(堆的内存地址),但是现在是null,空的

2 new 运算符分配堆内存

new 类型名();Code language: JavaScript (javascript)
  1. 在堆分配内存、自动初始化所有字段默认值
  2. 返回堆对象的引用地址,赋值给栈变量
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)

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注