c#平时作业

简述面向对象的基本思想

面向对象程序设计(OOP)的基本思想是从现实中的事物为中心思考问题认识问题,使得软件的开发的方法与过程尽可能接近人类认识世界,解决问题的方法和过程。

面向对象程序设计模拟自然界认识和处理事物的方法,将数据和对数据的操作方法放在一起,形成一个相对独立的整体——对象(object)。而对象正是面向对象技术的基本单位,以对象代表一个现实世界中的客观事物,再找出同类型对象的共有属性和行为,形成类,这一过程称为抽象,抽象正是面向对象编程的本质,而类是其关键。在面向对象程序设计中类是通过外部接口与外界发生关系,避免被外界函数意外改变,对象与对象之间通过消息进行通信,这样就保证了数据的独立性与安全性,它使得一个复杂的软件系统可以通过定义一组 相对独立的模块来实现,这些独立模块彼此之间只需交换那些为了完成系统功能所必 须交换的信息。当模块内部实现发生变化而导致代码修改时,只要对外接口操作的功能 不变,就不会给软件系统带来影响,所以OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。

与面向过程相比,面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数;而面向对象将程序设计看作是一组对象的集合,每个对象都可以接收消息、处理数据,并与其他对象进行交互,利用对象的方法与属性解决问题。二者均可实现代码重用和模块化编程,面向过程简单直接,容易理解,面向对象虽然复杂,但是模块化程度更高。从开发角度来看,面向对象比面向过程复杂,但面向对象维护和扩展功能更好。

从现实世界中客观存在的事物为基础来编写软件系统,并在程序实现中运用人类的思考方式,强调直接以问题域中的事物为中心来认识问题,思考问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位,。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。

什么是装箱、拆箱?

C#中数据类型分为值类型和引用类型,而所有的数据类型均继承与基类System.Object,所以值类型和引用类型的值可以通过显式或隐式转换,而C#中将值类型与引用类型之间的相互转换称为装箱和拆箱。

装箱:装箱简单来说是将一个值类型变量转换为引用类型变量或者是将值类型变量转换为对象。如C# ToString 方法用于将任意的数据类型转换成字符串类型:
在这里插入图片描述
深入来说装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换,隐式转换总会成功,装箱的作用是在垃圾回收堆中存储值类型,之说以要进行装箱是因为为了保证程序的通用性,我们往往定义一个Object的参数的方法,该Object可支持任意为型,以便通用,当我们要把一个值类型如上述的整型k传入时,就需要进行装箱。在程序中装箱往往通过以下三步实现,新分配托管堆内存然后将值类型的实例字段拷贝到新分配的内存中最后返回托管堆中新分配对象的地址,这个地址就是一个指向对象的引用了。所以装箱只是保存原值类型值的一个副本,当原值类型发生改变时,进行装箱的引用类型的值往往不会改变。

拆箱:拆箱简单来说就是将一个引用类型显式转换为值类型或者说将对象转换为与之类型兼容的值类型。如将装箱例子中的w再利用parse显示转换为整型q
在这里插入图片描述
深入来说拆箱是从object类型到值类型或从接口类型到实现该接口的值类型的显示转换,在拆箱中检查对象实例,确保它是给定值类型的一个装箱值然后将该值从实例复制到值类型变量中,也就是检查对象实例的本质。其中拆箱必须显式转换,而显示转换不一定可以成功,所以拆箱也不一定成功。如果为待拆箱对象为null,程序还会抛出NullReferenceException异常。

装箱和拆箱虽然满足了两种类型之间的转换,但是从装箱的过程中不难看出,每次装箱时要在堆中创建一个新的对象,当量特别大是肯定会大大影响程序的效率,另外装箱操作会导致数据在堆和栈上进行拷贝,频繁的装箱操作会性能损失。而相比而言拆箱过程对性能损耗还是比较小的,所以我们应该尽量避免装箱操作。

简述C#语言的异常处理机制,分析常见的异常类。

异常处理机制:异常又称例外,时程序运行过程中的非正常事件,是程序错误的一种,为保证程序正常运行,.NET平台提供的一种结构化异常技术,在程序中检测、捕获和处理异常的过程,以防止程序在遇到错误时崩溃或产生不受控制的行为。当发生异常时创建一个异常对象,由一段代码引出异常对象,另一段代码捕获并处理。具体分为以下三种异常处理结构:

1、try-catch:程序运行时,如果引发了异常,就抛出一个异常对象,此时程序中断正常运行,系统会检查引发异常的语句,以确定它是否在 try 块中。如果是,则按照 catch 块出现的先后顺序进行扫描,根据 catch 块中的异常参数类型找出最先与之匹配的 catch 块,然后执行该catch 块中的异常处理程序,之后不再执行其他 catch 块,而是从最后一个 catch 块之后的第一条语句处恢复执行。

2、try-catch-finally:与try-catch捕获并处理异常的方法相同,区别是不管程序运行是否中断,finally中的内容总是被执行。

3、try-finally:只捕获但是不处理异常。

其中要注意在寻找与异常匹配的 catch 块时,是按照 catch 块代码的先后顺序来扫描处理的,因此,以异常子类作为异常参数的 catch 块必须放在以异常基类作为异常参数的 catch 块之前,以保证以异常子类作异常参数的catch可以被执行到。

常见的异常类:.NET框架类库中预定义了大量的异常类,每个异常类代表了一种异常错误。Exception是所有异常类的基类,位于System命名空间下SystemException 和ApplicationException是直接继承自Exception的异常类型,分布为系统异常和自定义异常。

常见的系统异常:

ArgumentOutOfRangeException:参数值超出类型的范围而引发的异常。

ArithmeticException:出现算术上溢或者下溢, 因类型转换,算数运算或转换操作中的错误而引发的异常。

ArgumentNullException:一个空参数传递给方法,该方法不能接受该参数

DivideByZeroException:除法除数为零而引发的异常。

FormatException:参数格式不符合调用的规范而引发的异常。

FidleAccessException:试图非法访问类中的私有字段或受保护的字段而引发的异常。

IndexOutOfRangeException:数组索引超出范围。

InvalidCastException:无效的类型转换或显式转换引发的异常。

NullReferenceException:空引用异常,当试图在引用为null的对象上调用方法或访问属性时引发

OutOfMemoryException:内存超限而引发的异常。

OutflowException:因算术运算、类型转换导致溢出而引发的异常。

自定义异常:自定义异常用于指出程序中可能存在的特定异常,自定义异常时需要使其派生与ApplicationException。

class MyException : System.ApplicationException

{

public MyException() { }

public MyException(string msg) : base(msg) { }

}

此外在程序我们还可以通过关键字throw来引发异常:

if (someCondition)

{

throw new MyCustomException(“This is a custom exception.”)

}

简述重载(Overload)、重写(Override)的思想及实现方法。

1、重载:对不同数据类型的相同处理。方法的重载就是在同一个类下声明的两个以上名称相同的方法,但是参数类型或者个数不同。方法重载中的每个方法的返回值类型可以相同也可以不同,但是参数列表不能相同,其参数列表不同体现在三个方面:一是参数个数不同,二是参数类型不同,三世参数顺序不同。重载可以用来提供更加灵活的方法调用方式,增加代码的可读性和可维护性。如下代码就是对方法k的重载,两个方法k中的参数个数不同,实现对不同数据类型的相同处理

using System;

namespace ex1_1

{

    class Zly

    {

        public void k()

        {

            Console.WriteLine("我没有参数");

        }

        public void k(int x)

        {

            Console.WriteLine("我有一个参数");

        }

    }

    class program

    {

      static void Main(string[] args)

        {

            Zly z = new Zly();

            z.k();

            z.k(1);

        }

    }

}

方法重载的主要好处就是不用为了对不同的参数类型或参数个数,而写多个函数。多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。而重载的最直接作用是方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写过个函数名或方法名的重复步骤。

2、重写:使派生类中的实例完全替换掉基类的成员,派生类的方法完全覆盖基类中的方法。重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。重写的实现方法是首先在基类中用Virtual关键字标识虚拟成员,然后在派生类中使用Override关键字重写基类中的虚拟成员。例如下代码对方法k进行重写,在通过基类引用指向派生类的对象实现重写,使得派生类的实例完全替换来自基类的成员,所以最后的输出结果z1.k()是0,而z2.k()是1。

using System;

namespace ex1_1

{

    class Zly

    {

        public virtual void k()

        {

            Console.WriteLine("0");

        }

    }

    class Khc : Zly

    {

        public override void k()

        {

            Console.WriteLine("1");

        }

    }

    class program

    {

        static void Main(string[] args)

        {

            Zly z1 = new Zly();

            Zly z2 = new Khc();

            z1.k();

            z2.k();

        }

    }

}

什么是事件、消息?分析其在C# Windows程序设计中的角色。

在C#中,事件(Event)和消息(Message)都是用于实现程序交互的重要机制,它们是C#面向对象程序设计中不可或缺的核心部分。

事件:事件是类的成员,它使类和对象具有消息通知的能力,用于对象或类间的动作协调与信息传递,事件的实现是在委托类型变量前加上event关键字,其本质是用来对委托类型的变量进行封装,类似于类的属性对字段的封装,事件的使用一般分为触发事件和响应事件两部分,而事件的触发一般是我们使用者的一些操作如鼠标点击,键盘按键等,或者一些系统产生的提示通知,这些操作需要能被控件识别,相应的每一个控件都有它可以识别的事件,而应用程序要对其操作发生时产生的响应也就是响应事件。在Windows窗口程序设计中,事件特别重要。例如,当用户点击窗口的按钮时,会触发一个“点击”事件。程序员可以通过编写事件处理器来响应这些事件,以实现程序的交互功能。

消息:消息是Windows操作系统用来在应用程序之间进行通信的一种机制。Windows将各种不同的输入(如键盘按键、鼠标移动等)转化为特定的消息,并将其发送给相应的窗口。消息也可以理解为Windows发出的一个通知,告诉应用程序某个事件发生了。例如你单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序,即消息是运行中的指令操作,对象与对象之间通过消息传递完成实现一些操作功。

在C# Windows程序设计中,Windows应用程序是由事件驱动的,用户执行操作时,窗体或控件将向应用程序发送一个事件,而编程人员可以在应用程序中编写特定方法处理事件,程序接收到事件时,将调用此方法。例如Load 事件:第一次直接或间接调用Show方法显示窗体时,窗体进行且只进行一次加载,并且在加载操作完成后会引发Load 事件;Click事件:单击窗体时,将会引发窗体的Click事件。总而言之,事件和消息在c# Windows程序设计中扮演着极其重要的角色,是windows编程的重要组成。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值