C#笔记10 类:基础
——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。
写在前边
*复习:类型是一种模版,C#提供了15种预定义类型,还可以创建自己的用户定义类型,有6种类型:
- 类类型(class)
- 结构类型(struct)
- 数组类型(array)
- 枚举类型(enum)
- 委托类型(delegate)
- 接口类型(interface)
类在C#中是个很大的主题,关于它的讨论将会延伸至接下来的几篇
1. 什么是类
1).类是一种活动的数据结构
程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,称之为类
2).类是一种能存储数据并执行代码的数据结构,它包含:
- 数据成员——存储数据
包括:字段、常量 - 函数成员——执行代码
包括:方法,属性,构造函数,索引,运算符,事件,析构函数
3).类是复杂数据类型(引用类型)
*引用类型:需要一段存储实际的数据,一段引用(存放在栈中),指向数据在堆中存放的位置
所以类需要我们先定义出类型(声明),才能去使用它的数据(实例化,使用)
2.类的声明
1).创建用于创建实例的模版,包括:类的名称,类的成员,类的特征
<access specifier> class MyClass //访问修饰符 <access specifier>
{
int MyField;
}
2).访问修饰符指定了对类及其成员的访问规则。如果没有指定,则使用默认的访问标识符。
类的默认访问修饰符是 internal,成员的默认访问标识符是 private。
访问修饰符:
- 公有的pubilc :任何公有成员可以被外部的类访问。
- 私有的private :只有同一个类中的函数可以访问它的私有成员。
- 受保护的protected :该类内部和继承类中可以访问。
- 内部的internal : 同一个程序集的对象可以访问。
- 内部受保护的protected internal :protected和 internal 的并集,符合任意一条都可以访问。
- 还可以指定类是:
抽象的(关键字abstrac,不能实例化,只能继承,可以有抽象成员)或
密封的(关键字sealed,不能继承,只能实例化)
3).类成员可以在类主体内部以任何顺序声明
3.类的成员
从类的定义中已知类包含数据成员和函数成员,所以字段和方法,是最重要的类成员类型。字段是数据成员,方法是函数成员。
3.1 字段
字段初始化:
- 显示初始化
在类中直接进行了变量的初始化(赋值) - 隐式初始化
如果没有初始化语句,根据字段的类型,数值类型的默认值为0,bool类型为false,引用类型为null
例如,下面的代码声明了2个字段
class MyClass
{
int F1; //隐式初始化,默认值为0
string F2 = "ab"; //显示初始化,值为"ab"
}
3.2 方法
方法是具有名称的可执行代码块,当方法被调用时,它执行自己所含的代码,然后返回到调用它的代码。有些方法返回一个值到它们被调用的位置。
声明一个简单的方法:
- 返回类型
- 名称
- 参数列表
- 方法体
例如,下面的代码声明一个类,类中包含一个名称为PrintNum的简单方法
class SimpleClass
{
void PrintNum() //没有返回值,参数列表为空
{
ConsoleWriteLine("1"); //{}内为方法体
}
}
方法可以声明在类,结构体,接口中,关于复杂方法的使用后续还会有详细笔记
4.类的实例化
- 声明类以后,系统为类变量的引用在栈中分配内存
- 实例化类的过程是为实际数据分配内存
new运算符:
为任意指定类型的实例分配并初始化内存,根据类型的不同从栈或堆里分配。
new TypeName()
Dealer theDealer; //声明引用变量
theDealer = new Dealer(); //为类对象分配内存
上边代码中的两步也可以结合到一起
Dealer theDeale = new Dealer(); //声明并初始化
——上图出自 人民邮电出版社《C#2008 C#图解教程》第4章
5.类成员的访问
5.1 类内部访问成员
类内部的成员间可以自由地互相访问
类内部的方法,作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。
class Box
{
private double length;
public void setLength( double len )
{
length = len;
}
}
5.2 类外部访问成员
类中可能包含静态成员和非静态成员,这里先讨论非静态成员,静态成员会在后边和静态类放在一起,目前可以简单理解为: 不含有static关键字的类和成员都是非静态的
点(.)运算符:
如果要访问类的成员,要使用点(.)运算符
点运算符链接了对象的名称和成员的名称
例:
class Box
{
public double length; // 长度
public double breadth; // 宽度
public double height; // 高度
}
class Boxtester
{
static void Main()
{
Box Box1 = new Box(); // 声明 Box1,类型为 Box
Box Box2 = new Box(); // 声明 Box2,类型为 Box
double volume = 0.0; // 体积
// Box1 详述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// Box2 详述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// Box1 的体积
volume = Box1.height * Box1.length * Box1.breadth;
Console.WriteLine("Box1 的体积: {0}", volume);
// Box2 的体积
volume = Box2.height * Box2.length * Box2.breadth;
Console.WriteLine("Box2 的体积: {0}", volume);
Console.ReadKey();
}
}
//代码来自 菜鸟教程 https://www.runoob.com/csharp/csharp-class.html
控制台输出结果:
Box1 的体积: 210
Box2 的体积: 1560
写在最后
C#代码的组织结构
- 解决方案(solution):项目之家
- 项目(project):程序文件之家
- 程序文件(.cs):命名空间之家
- 命名空间(namespace):类之家
- 类(class):方法之家
- 主方法(Main):语句之家
C# 程序结构
一个 C# 程序主要包括以下部分:
- 命名空间声明(Namespace declaration)
- 类Class
- Class 方法
- Class 属性
- 一个 Main 方法
- 语句(Statements)& 表达式(Expressions)
- 注释