02010501 类的基本概念
02010501 类的基本概念
1. 什么是类
- 类 → 是一个能存储数据并执行代码的数据结构,它包含数据成员和函数成员。
- 数据成员存储与类或类的实例相关的数据,它包含如下内容
- 字段
- 常量
- 函数成员:它执行代码,它包含如下内容
- 方法
- 属性
- 构造函数
- 析构函数
- 运算符
- 索引器
- 事件
- 数据成员存储与类或类的实例相关的数据,它包含如下内容
2. 声明类
- 类的声明定义新类的特征和成员,类的声明并不创建类的实例,但是创建用于生成类实例的模板,类的声明提供如下内容:
- 类的名称
- 类的成员
- 类的特征
class MyClass
{
成员声明
}
说明:
1. class是关键字。
2. MyClass是类名。
3. {}内包含了类成员的声明,{}内部组成了类的主体。
3. 类成员
- 字段和方法是重要的类成员,字段是数据成员,方法是函数成员。
3.1 字段
- 字段是隶属于类的变量,它可以是任何类型(预定义类型或用户定义类型)。字段和所有变量一样用来保存数据,字段有如下特征:
- 可以被写入
- 可以被读取
- 声明一个字段的语句
class MyClass{
int MyInt; // int字段的类型,MyInt是字段的名称。
}
- C#在类型的外部不能声明全局变量。
3.2 显示和隐式字段初始化
- 字段初始化语句是字段声明的一部分,由一个等号后面跟着一个求值表达式组成,字段初始化值必须是编译时可确定的。
class MyClass{
int MyInt = 10; // 字段初始化语句
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 声明多个字段
int MyInt01, MyInt02;
- 字段如果没有初始化语句,字段的值会被编译器设为默认值,默认值由字段的类型决定。
- 值类型(11种)默认值都是0
- bool类型的默认值是false
- 引用类型的默认值是null
3.3 方法
- 方法是具有名称的可执行代码块,当方法被调用(call/invoke)时,它执行自己所含的代码,有些方法返回一个值到它们被调用的位置。
- 声明方法的语法包括如下部分:
- 返回类型 → 它声明了方法返回值的类型,如果一个方法没有返回值,那么返回类型被指定为void。
- 名称 → 这个方法的名称。
- 参数列表 → 它至少由一对空的()组成,如果有参数将被列到()中间。
- 方法体 → 它由一对{}组成,大括号内包含执行的代码。
class MyClass
{
void MyFunc01() // 返回类型为void,参数列表为无参。
{
执行的代码
}
}
- C#中没有全局函数声明在类型外部,C#中方法没有默认的返回类型(所有方法必须包含返回类型或void)。
4. 创建变量和类的实例
- 类的声明是创建类的实例的模板,一旦类被声明,就可以创建类的实例。
- 要创建类的实例,需要从声明一个类类型的变量开始,如果这个变量没有初始化,那么它的值是未定义的。
5. 为数据分配内存
5.1 类类型变量用来保存引用
MyClass myClass; // 声明类类型变量myClass
说明:
1. 声明类类型的变量所分配的内存是用来保存引用的,而不是用来保存对象实际数据的。
2. 要为实际数据分配内存,需要用到new运算符。
5.2 对象创建表达式

- new运算符为任意指定类型分配并初始化内存,它依据类型的不同从栈或者堆里分配内存。使用new运算符组成一个对象创建表达式,它的组成如下:
- 关键字new
- 要分配内存的实例的类型名称
- 成对的圆括号,可能包括参数也可能没有参数(后面章节会讨论)
- 对象创建表达式语句
new MyClass(); // 对象创建表达式
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
Myclass myClass; // 声明引用变量
myClass = new MyClass(); // 为类对象分配内存并赋值给变量
说明:
说明:
1. 如果将内存分配给一个引用类型,则对象创建表达式返回一个引用,这个引用存放在类型变量分配的内存里面。
2. 这个引用指向在堆中被分配并初始化的对象实例。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 将声明引用变量和对象创建表达式合并的写法
MyClass myClass = new MyClass();
5.3 实例成员
class MyClass
{
成员变量
乘以方法
}
class Program
{
static viod Main()
{
MyClass myClass01 = new MyClass(); // 创建类对象,并将类对象引用赋值给变量myClass01
MyClass myClass02 = new MyClass(); // 创建类对象,并将类对象引用赋值给变量myClass02
MyClass myClass03 = new MyClass(); // 创建类对象,并将类对象引用赋值给变量myClass03
}
}
说明:每一个类对象里面都包含有数据成员(成员变量和成员方法),每个对象的数据成员称之为实例成员。
6. 访问修饰符
- 从类的内部,任何函数成员都可以使用成员的名称访问类中任意的其它成员。
- 访问修饰符是成员声明的可选部分,指明程序的其它部分如何访问成员。
// 字段的访问修饰符语句
访问修饰符 类型 标识符;
// 方法的访问修饰符语句
访问修饰符 返回类型 方法名()
{
...
}
-
成员访问控制的5种修饰符
-
private → 私有的
-
public → 公共的
-
protected → 受保护的
-
internal → 内部的(后续章节讲解)
-
protected internal → 受保护内部的(后续章节讲解)
-
7. 私有访问和公有访问
- 私有成员只能从声明它的类的访问,其它的类看不见或无法访问它们。
- 私有访问是默认的访问级别,如果一个成员在声明时不写访问修饰符,那它默认就是私有的。
- 还可以使用private访问修饰符显示的将一个成员声明为私有。
- 显式的声明私有和隐式的声明私有在语法上没有不同,两种形式是等价的。
- 实例的公有成员可以被程序的其它对象访问,必须使用public访问修饰符指定公有访问。
class MyClass
{
int MyInt; // 默认为私有字段,直接可以在内的内部使用。
private string MyStr; // 显式的声明为私有字段,直接可以在内的内部使用。
public double MyDouble; // 声明为公有字段,可以通过创建类的实例,在类的外部使用。
void MyFunc01() // 默认为私有方法,直接可以在类的内部使用。同时该方法可以访问类中所有字段
{
...
}
private void MyFunc01() // 显式的声明为私有方法,直接可以在类的内部使用。同时该方法可以访问类中所有字段
{
...
}
public void MyFunc03() // 声明为公有方法,可以通过类的实例在类的外部使用该方法。
{
...
}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 从类的外部访问实例成员
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo01
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.MyFunc();
Console.WriteLine(myClass.MyStr);
Console.ReadLine();
}
}
class MyClass
{
int MyInt = 10;
public string MyStr = "Qinway";
public void MyFunc()
{
Console.WriteLine(MyInt);
}
}
}
控制台输出
10
Qinway
疑问:在类的外部通过类对象myClass访问类的公有方法MyFunc,但是这个公有方法使用了类内部私有的成员MyInt,并没有报错?
说明:要从类的外部访问实例成员,必须包含变量名称和成员名称,中间用“.”进行 分隔,这个"."称为点运算符。
结尾
书籍:C#图解教程
著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔
译:窦衍森;姚琪琳
ISBN:978-7-115-51918-4
版次:第5版
发行:人民邮电出版社
※敬请购买正版书籍,侵删请联系85863947@qq.com※
※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※