首页 > 自考资讯 > 培训提升

学习笔记之C#基础——结构和类

2026 08 14 01:19:59

学*笔记之C#基础——结构和类

结构

是从过程化程序设计中保留下来的一种数据类型,而类则是面向对象程序设计中的最基本、也是最重要的一个概念。结构是一种值类型,通常用来封装一组相关的变量,结构中可以包括构造函数、常量、字段、方法、属性、运算符、事件和嵌套类型等。结构实际是将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。

结构的声明:

结构修饰符 struct 结构名 { }

对象

在面向对象中,算法与数据结构被看作一个整体,称为对象。现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合二为一来描述,所以可以用下面的等式来定义对象和程序。

对象=(算法+数据结构),程序=(对象+对象+……)。

从上面的等式可以看出,程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体。现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。

不能将所谓的一个事物描述成一类事物,如一只鸟不能称为鸟类,如果需要对同一类事物统称,就不得不说明类这个概念。类就是同一类事物的统称,如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称,如鸟类、家禽类、人类等。类是构造对象时所依赖的规范,如一只鸟具有一对翅膀,它可以通过这对翅膀飞行,而基本上所有的鸟都具有翅膀这个特性和飞行的技能,这样的具有相同特性和行为的一类事物就称为类,类的思想就是这样产生的。

更为恰当的描述是:类是世间事物的抽象称呼,而对象则是这个事物相对应的实体。

封装

封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易直接操作此数据结构,而只能执行类允许公开的数据。这样就避免了外部对内部数据的影响,提高了程序的可维护性。

继承

类与类之间同样具有关系,如一个百货公司类与销售员类相联系,类之间的这种关系被称为关联。关联是描述两个类之间的一般二元关系,例如,一个百货公司类与销售员类就是一个关联,学生类与教师类也是一个关联。两个类之间的关系有很多种,继承是关联中的一种。当处理一个问题时,可以将一些有用的类保留下来,当遇到同样问题时拿来复用。继承性主要利用特定对象之间的共有属性。

多态

多态性允许以统一的风格编写程序,以处理种类繁多的已存在的类以及相关类。该统一风格可以由父类来实现,根据父类统一风格的处理,就可以实例化子类的对象。由于整个事件的处理都只依赖于父类的方法,所以日后只要维护和调整父类的方法即可,这样就降低了维护的难度,节省了时间。

类(Class)实际上是对某种类型的对象定义变量和方法的原型,它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。类是对象概念在面向对象编程语言中的反映,是相同对象的集合。类描述了一系列在概念上有相同含义的对象,并为这些对象统一定义了编程语言上的属性和方法。比如水果就可以看作一个类,苹果、梨、葡萄都是该类的子类(派生类),苹果的生产地、名称(如富士苹果)、价格、运输途径相当于该类的属性,苹果的种植方法相当于类方法。类是C#中功能最为强大的数据类型,像结构一样,类也定义了数据类型的数据和行为。

类的声明:

类修饰符 Class 类名 { }

构造函数和析构函数

构造函数和析构函数是类中比较特殊的两种成员函数,主要用来对对象进行初始化和回收对象资源。一般来说,对象的生命周期从构造函数开始,以析构函数结束。如果一个类含有构造函数,在实例化该类的对象时就会调用,如果含有析构函数,则会在销毁对象时调用。构造函数的名字和类名相同,析构函数和构造函数的名字相同,但析构函数要在名字前加一个波浪号(~)。

构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。

析构函数是以类名加“~”来命名的。.NET Framework类库有垃圾回收功能,当某个类的实例被认为是不再有效,并符合析构条件时,.NET Framework类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收。

对象的创建及使用

对象可以认为是在一类事物中抽象出某一个特例,通过这个特例来处理这类事物出现的问题。在C#语言中通过new操作符来创建对象。前文在讲解构造函数时介绍过每实例化一个对象就会自动调用一次构造函数,实质上这个过程就是创建对象的过程。准确地说,可以在C#语言中使用new操作符调用构造函数创建对象。

当创建对象时,自动调用构造函数,也就是说,在C#语言中初始化与创建是被捆绑在一起的。每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象变成了垃圾,由.NET自带的垃圾回收机制处理。

当用户使用new操作符创建一个对象后,可以使用“对象.类成员”来获取对象的属性和行为。前文已经提到过,对象的属性和行为在类中是通过类成员变量和成员方法的形式来表示的,所以当对象获取类成员时,也就相应地获取了对象的属性和行为。

public class math { public int Add (int a ,int b) { return a + b; } public double Add(double a, double b) { return a + b; } public double Add(double a, double b,double c) { return a + b+c; } } class Program { static void Main(string[] args) { math js1 = new math(); //创建一个对象 Console.WriteLine("结果为:"+ js1.Add(2,3)); math js2 = new math(); //创建另一个对象 Console.WriteLine("结果为:" + js2.Add(4, 6)); } }

this关键字

先看一段代码

private void setName(String name) { this.name=name; }

在上述代码中可以看到,成员变量与在setName()方法中的形式参数的名称相同,都为name,那么该如何在类中区分使用的是哪一个变量呢?在C#语言中规定使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法,如在上述代码中,this.name指的就是Book类中的name成员变量,而this.name=name语句中的第二个name则指的是形参name。实质上setName()方法实现的功能就是将形参name的值赋予成员变量name。

this可以调用成员变量和成员方法,但C#语言中最常规的调用方式是使用“对象.成员变量”或“对象.成员方法”进行调用。既然this关键字和对象都可以调用成员变量和成员方法,那么this关键字与对象之间具有怎样的关系呢?

事实上,this引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,如上面代码的情况,就要添加this关键字明确引用的是类成员还是局部变量或方法参数。如果省略this关键字,直接写成name=name,那只是把参数name赋值给参数变量本身而已,成员变量name的值没有改变,因为参数name在方法的作用域中覆盖了成员变量name。

类的面向对象特性

类的封装

C#中可使用类来达到数据封装的效果,这样就可以使数据与方法封装成单一元素,以便于通过方法存取数据。除此之外,还可以控制数据的存取方式。在面向对象编程中,大多数都是以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。设计类时,不希望直接存取类中的数据,而是希望通过方法来存取数据,这样就可以达到封装数据的目的,方便以后的维护升级,也可以在操作数据时多一层判断。

封装还可以解决数据存取的权限问题,可以使用封装将数据隐藏起来,形成一个封闭的空间,然后可以设置哪些数据只能在这个空间中使用,哪些数据可以在空间外部使用。一个类中包含敏感数据,有些人可以访问,有些人不能访问,如果不对这些数据的访问加以限制,后果将会非常严重。所以在编写程序时,要对类的成员使用不同的访问修饰符,从而定义它们的访问级别。

类的继承

继承是面向对象编程最重要的特性之一。任何类都可以从另外一个类继承,这就是说,这个类拥有它继承的类的所有成员。在面向对象编程中,被继承的类称为父类或基类。C#中提供了类的继承机制,但只支持单继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。

利用类的继承机制,用户可以通过增加、修改或替换类中的方法对这个类进行扩充,以适应不同的应用要求。利用继承,程序开发人员可以在已有类的基础上构造新类,这一性质使类支持分类的概念。在日常生活中很多东西都很有条理,那是因为它们有着很好的层次分类。如果不用层次分类,则需要对每个对象都定义其所有的性质。使用继承后,每个对象就可以只定义自己的特殊性质,每一层的对象只需定义本身的性质,其他性质可以从上一层继承下来。

继承的基本思想是基于某个父类的扩展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。

继承一个类时,类成员的可访问性是一个重要的问题。子类(派生类)不能访问基类的私有成员,但是可以访问其公共成员。这就是说,只要使用public声明类成员,就可以让一个类成员被基类和子类(派生类)同时访问,同时也可以被外部的代码访问。为了解决基类成员访问问题,C#还提供了另一种可访问性:protected,只有子类(派生类)才能访问protected成员,基类和外部代码都不能访问protected成员。

在继承中还有一种特殊的重写方式,子类与父类的成员方法返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊重写方式被称为重构。

类的多态

多态使子类(派生类)的实例可以直接赋予基类的变量(这里不需要进行强制类型转换),然后直接就可以通过这个变量调用子类(派生类)的方法。利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。

多态是同一个行为具有多个不同表现形式或形态的能力。多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自 Object。

版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除

猜你喜欢