类是一种数据结构,它可以包含数据成员(常量和变量)、函数成员(方法、属性、构造函数、析构函数等)和嵌套类型。
在 C# 语言中创建的任何项目都有类的存在,通过类能很好地体现面向对象语言中封装、继承、多态的特性。
类定义的语法形式并不复杂,记住class是定义类的关键字。
- 类定义的具体语法形式如下:
- 访问权限修饰符 修饰符 class 类名
- {
- 类的成员
- }
- ------------------------------------
- public static class 类名
- {
- 字段;
- 属性;
- 方法;
- }
- 类就是个模子,确定了对象应该具有的属性和方法。
- 对象是根据类创建出来的。
创建好了一个类之后,我们还需要创建这个类的对象。那么,我们管创建这个类的对象过程称之为类的实例化。使用关键字 new
尽管可以在一个命名空间中定义多个类,但不建议使用这种方式,最好是每一个文件定义一个类,这样方便阅读和查找。
用户不仅可以在控制台应用程序中添加类,在之后的学习中我们还将会介绍的其他类型的应用程序中也可以添加类,添加的方法是类似的。
类名用于描述类的功能,因此在定义类名时最好是具有实际意义,这样方便用户理解类中描述的内容。
在同一个命名空间下类名必须是唯一的。
类的定义包括类头和类体两部分,其中类头是使用class关键字定义的类名,而类体是用一对大括号括起来的。在类体中主要定义类的成员,类的成员包括字段、属性、方法、构造函数等。
1、字段
字段就是程序开发中常见的常量或变量,它是类的一个构成部分,它使得类可以封装数据
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
-
- namespace _20220731_2
- {
- class Program
- {
- static double r;
- const double PI = 3.14;
- static void Main(string[] args)
- {
- Console.Write("请输入半径");
- Program.r = Convert.ToDouble(Console.ReadLine());
- Console.WriteLine("面积为:" + PI * Math.Pow(r, 2));
- Console.ReadKey();
- }
- }
- }
字段属于类级别的变量,在未初始化时,C#将其初始化为默认值,但不会将局部变量初始化为默认值。
- class Program
- {
- static int i;
- static void Main(string[] args)
- {
- Console.WriteLine(i);
- Console.ReadKey();
- }
- }
- //结果为0
如果将上述代码中的i的定义放入到Main方法中,在运行时会报错误。
2、属性
属性是对现实实体特征的抽象,提供对类或对象的访问。类的属性描述的是状态信息,在类的实例中,属性的值表示对象的状态值。C#中的属性具有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句,因此属性提供了一种机制把读取和写入对象的某些特性与一些操作关联起来,开发人员可以像适用公共数据成员一样使用属性。
- 访问权限修饰符 类型 属性名
- {
- get{get访问器体}
- set{set访问器体}
- }
访问权限修饰符:指定属性的访问级别。
类型:指定属性的类型,可以是任何预定义或自定义类型。
属性名:一种标识符,命名规则与变量相同,但是属性名的第一个字母通常都需要大写。
get访问器:相当于一个具有属性类型返回值的无参数方法,它除了作为赋值的目标,当在表达式中引用属性时,还将调用该属性的get访问器获取属性的值。get访问器需要用return语句来返回,并且所有的return语句都必须返回一个可隐式转换为属性类型的表达式。
set访问器:相当于一个具有单个属性类型值参数和void返回类型的方法。set访问器的隐式参数始终命名为value。当一个属性作为赋值的目标被引用时,就会调用set访问器,所传递的参数将提供新值。由于set访问器存在隐式的参数value,因此,set访问器中不能自定义名称为value的局部变量或常量。
根据是否存在get访问器和set访问器,属性可以分为以下几种:
备注:属性的主要用途是限制外部类对类中成员的访问权限,定义在类级别上。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace _20220801_1
- {
- class Program
- {
- private int age;
- public int AAA
- {
- get { return age; }
- set { age = value; }
- }
- static void Main(string[] args)
- {
- Program x1 = new Program();
- Console.Write("请输入年龄");
- x1.age = Convert.ToInt16(Console.ReadLine());
- Console.WriteLine(x1.age);
- Console.ReadKey();
- }
- }
- }
在C#中支持自动实现的属性,即在属性的get访问器和set访问器中没有任何逻辑。使用自动实现的属性,就不能在属性设置中进行属性的有效验证。另外,如果要使用自动实现的属性,则必须同时拥有get访问器和set访问器。如果只有其中一种,则会出现错误。
1、修饰符是用于限定类型以及类型成员的声明的一种符号。
2、修饰符的分类
有三种:访问修饰符、类修饰符、成员修饰符。
作用:限定类型以及类型成员。
1、访问权限修饰符
①定义:访问修饰符就是类,属性和方法的定义分级制度,即用于设定对类的访问限制类型。
②包括:
访问权限修饰符 | 应用范围 | 访问范围 |
private | 所有类或成员 | 只能在本类中访问 |
protected | 类和内嵌类的所有成员 | 在本类和其子类中访问 |
internal | 类和内嵌类的所有成员 | 在同一程序集中访问 |
pritected internal | 类和内嵌类的所有成员 | 在同一程序集和子类中访问 |
public | 所有类或成员 | 任何代码都可以访问 |
public:公共的,访问不受限制。 private:私有,访问限于包含类,即只能在当前类的内部进行访问,出了这个类就访问不到了。 internal:内部访问,访问限于当前程序集。 protected:受保护的,访问限于包含类或派生自包含类的类型。 protected internal:允许在同一个项目中的类访问,还允许其他项目中子类访问其成员变量和成员函数。 private protected:访问限于包含类或当前程序集中派生自包含类的类型。 自 C# 7.2 之后可用。
备注:除使用 命名空间中不允许出现访问修饰符。 命名空间没有任何访问限制。
|
2、类修饰符
类修饰符:修饰符是对类本身特点的描述,包括 abstract、sealed 和 static。
abstract:是抽象的意思,使用它修饰符的类不能被实例化,即可以被指示一个类只能作为其它类的基类。 |
sealed:指示一个类不能被继承。 |
static:修饰类时表示该类是静态类,不能够实例化该类的对象,该类的成员为静态。 |
3、成员修饰符
abstract:指示该方法或属性没有实现. |
const:指定域或局部变量的值不能被改动. |
event:声明一个事件. |
extern:指示方法在外部实现. |
override:对由基类继承成员的新实现. |
readonly:指示一个域只能在声明时以及相同类的内部被赋值. |
Partial:在整个同一程序集中定义分部类和结构 |
Virtual:用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象 |
New:作修饰符,隐藏从基类成员继承的成员,在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。作运算符,用于创建对象和调用构造函数。 |
4、其他修饰符(不知道如何定义,与类修饰符用在相同地方,等回头再改)
unsafe:修饰某个方法为虚方法,以便在其继承类中可重写此方法。一般与override和new搭配使用。 |
volatile:特征修饰符,指示字段可由操作系统、硬件或并发执行线程等在程序中进行修改。volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。 |
async:使用 async 修饰符可将方法、lambda 表达式或匿名方法指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法 。 |