文档库 最新最全的文档下载
当前位置:文档库 › C#简答题答案

C#简答题答案

第二章:C#编程基础 三、简答题 1、变量是什么?它是怎么存储数据的? 变量(Variable)是指用于容纳一个值在内存中的一块专属的存储位置。必须为每一个变量指定 一个唯一的名称,使用这个唯一的名称访问这个变量中存储的值。 2、引用类型的变量和数值类型的变量有什么不同之处? 数值类型的变量和引用类型的变量, 两者最根本区别在于: 数值类型的变量本身包含他们的数据, 而引用类型的变量包含的是,指向包含数据的内存的引用或者叫句柄。对于数值类型,每个变量 有一份自己的数据复制,因而也就不能通过操作其中的一个来影响到另一个。而对于引用类型, 两个变量有可能引用同一个对象, 因而也就可能通过操作其中的一个变量来影响也被另一个变量 引用的对象 4 怎么改变数据类型?什么地方需要强制转换数据类型? C#提供了两个类型转换的形式:隐式类型转换和强制显示类型转换。数据从“小类型”到“大 类型”的转换时为隐式类型转换,从“大类型”到“小类型”的转换为显式类型转换,显示类型 转换需要如“ (type)data”一般的括号转换操作符。也就是说,将被转换的数据类型包含在目标 的数据类型取值范围之内,就可以使用隐式类型转换。反之则必须使用显式类型转换。但是需要 注意的是,使用显式类型转换时,数所转换后的结果可能会与想象中的结果不一致,这是“大类 型”的存储字节要比“小类型”的存储字节多。如果强制转换,可能发生数据丢失的情况。 5 跳转语句和条件分支语句有什么不同之处? 条件语句又称为条件选择语句,他判定一个表达式的结果是真假(是否满足条件) ,根据结果判 断是执行那个语句块。条件语句分为 If 语句和 Switch 语句两种方法。 很多的时候,我们需要程序从一个语句块转到别一个语句块,因为 C#提供了许多可以立即跳转 程序另一行代码执行的语句,这些跳转语句包括:Goto 语句、Break 语句和 Continue 语句。 6 循环语句都有什么特点,有什么共通之处? 循环语句是让程序重复的执行某个程序块, 直到某个特定的条件表达式结果为假才结束执行语句 块。 While, do-While, For 循环语句,虽然格式不同,但它们有着共同的特点,都实用于循环结构的程 序设计。在程序设计的过程中,都具有如下三条内容: (1) 循环体的设计。 (2) 循环条件的设计。 (3) 循环入口的初始化工作。 循环体语句的正确执行,依赖于循环的条件,循环的条件依赖循环入口时的初始化工作,一环紧 扣一环。 循环体中按排哪些语句,要从分析具体问题入手,前后呼应,合乎逻辑。并且能确保循环能

够终 止。而且结论正确。 While, do-While 语句的使用, 它的循环条件的改变, 要靠程序员在循环体中去有意安排某些语句。 而 For 语句却不必。 使用 For 语句时, 若在循环体中想去改变循环控制变量, 以期改变循环条件。 无异于画蛇添足。 While 循环,do-While 循环适用于未知循环的次数的场合,而 For 循环适用于已知循环次数的场 合。使用哪一种循环又依具体的情况而定。
凡是能用 For 循环的场合,都能用 While, do-While 循环实现,反之则未必。 7、枚举类型有什么样的优势,在程序中是怎么处理数据的? Enum 类型(枚举类型)是一组命名常量的集合,或者说是用户定义的整数类型的集合。在声名 一个枚举的时候, 要指定该枚举可以包含的一组可接受的实例值。 同时可以创建一系列的容易记 忆的名称,让程序更容易理解。每一种枚举都有一种类型,除 Char 之外的所有整型都可以作为 枚举类型的基本类型。 枚举访问时所用的修饰符遵守访问修饰符和类或结构的访问修饰符的规则。 声明为命名空间成员 的枚举可以有 Public 或 Internal 访问属性。枚举使用 New 关键字修饰时,则表时他隐藏一个被 继承的成员。并且枚举不能派生。
第三章:对象和类型 三、简答题 1 简述类和结构的异同。 类是对一系列具有相同性质对象的抽象,是对对象共同特征的描述。类是 C#中的一种重要的复 合数据类型,是组成 C#程序的基本要素,它封装了一类对象的状态和方法。而结构是 C#程序员 用来定义自己的值类型的最普遍的机制。 结构比枚举更强大, 因为它提供函数、 字段、 构造函数、 操作符和访问控制。 结构是 C#程序员用来定义自己的值类型的最普遍的机制。结构与类有很多相似之处:结构可以 实现接口,并且可以具有与类相同的成员类型。然而,结构在几个重要方面不同于类:结构为值 类型而不是引用类型,并且结构不支持继承。结构的值存储在“堆栈上”或“内存” 。 2、简要说明 public、private 和 protected 修饰符的访问权限。 public : 公共成员,完全公开,没有访问限制。 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 3、简单介绍构造函数和析构函数。 构造函数是在实例化对象时自动调用的函数,它们必须与所属的类同名,且不能有返回类型,每 个类都有自己的构造函数。通常使用构造函数来初始化字段的值。 析构函数类似于构造函数,但是在 CLR 检测到不再需要某个对象时调用。在声明析构函数时, 它的名称必须与类名相同,但前面有一个~符号。 声明的语法格式为:~类名(){撤销实例的

语句} 和构造函数一样,析构函数被自动调用时不能被显式地调用。使用析构函数的条件是:没有任何 代码要使用一个实例。析构函数以调用构造函数相反的顺序被调用,因此也有人叫它“逆构造函 数” 。 4、说明什么是重载构造函数,举例说明如何实现构造函数的重载。 C#构造函数的重载 C#中的构造函数也可以应用方法重载.C#中有默认构造函数,也可以定义带参 数的构造函数.构造函数必须与类同名,并且不能有返回值.所以 C#构造函数重 载相当于不同数 量的参数方法重载. class C1 { public C1() : this( " ")
{} public C1(String s) {// ……} } 5.、简要介绍 Object 类。 所有的.NET 类都派生于 System.Object。如果在定义类时没有指定其基类,那么编译器就会默认 该类派生于 Object。 其重要性在于,除了自己定义的方法和属性外,还可以访问为 Object 定义的许多公共或受保护 的成员方法,这些方法可以用于自己定义的所有其他类中。
第四章:继承和多态 三、简答题 1、简述继承和继承的类型。 继承是面向对象程序设计中一个很重要的特性, 它是关于一个类怎样从另一个类中共享特性和行 为的术语。C#中继承类称为派生类或子类,被继承类称为基类或父类。派生类能够继承基类的 所有的操作、属性(Attribute) 、特性(Property) 、事件以及这些内容的实现方法,但继承得到 的成员也受访问限制,即使派生类继承得到基类成员,也可能无法访问。通过继承,一个类可以 用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这 称为多态性。 面向对象编程中,有两种截然不同的继承类型:实现继承和接口继承。 2、简要说明如何实现继承。 基类是对派生类的抽象,派生类是对基类的具体化,是基类定义的延续。 如果类或结构在继承基类的同时也派生于接口,则用逗号分隔基类和接口。 如果在类定义中没有指定基类,C#编译器就默认 System.Objectj 是基类。 3、简述派生类中构造函数的几种情况。 派生类中构造函数分为两种情况:无参数的构造函数和带参数的构造函数。 在基类中添加一个无参数的构造函数来替换默认的构造函数,那么它可以隐式地被派生继承。 如果基类中定义了带有参数的构造函数,则此构造函数必须被继承且在派生类中实现构造函数。 同时提供将参数传递给基类构造函数的途径, 以保证在基类进行初始化时能获得必须的数据, 在 实现构造函数时使用 base 关键字。 4、说明抽象类和密封类的用法。 有时候基类并不与具体的事物相联系, 而是只表达一种抽象的概念用以为它的派生类提供一个公 共的界面

,为此 C#中引入了抽象类(abstract class)的概念。 抽象类不能实例化,而抽象方法没有执行代码,必须在非抽象的派生类中重写。显然,抽象方法 也是虚拟的(但不需要提供 virtual 关键字,如果提供了该关键字,就会产生一个语法错误) 。如 果类包含抽象方法,那么该类也必须声明是抽象的。抽象类和抽象方法都用 abstract 来声明,声 明代码如下所示: abstract class Building //声明抽象类 { private bool damaged = false; // 字段 public abstract decimal CalculateHeatingCost(); // 抽象方法 }
C#中使用 sealed 来声明密封类和密封方法。对于类来说,表示不能继承该类;对于方法来说, 表示不能重写该方法。下面是定义密封类和密封方法的实现代码: sealed class SealedClass //定义密封类 { public sealed void SealedMethod() //定义密封方法 {} } 5、简述多态性,并实现简单多态。 多态性是面向对象程序设计中的又一个重要概念。在 C#中,多态性的定义是:同一操作作用于 不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C# 中支持两种类型 的多态性:即编译时的多态性和运行时的多态性。编译时的多态性是通过重载来实现的,而运行 时的多态性通过虚成员实现。多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用 基类实际上都可能是在使用已强制转换为基类类型的派生类对象。 基类的设计者可以预测到其基 类中可能会在派生类中发生更改的方面。 6 简述接口定义,并实现简单接口派生。 从某种意义上说,接口是一种特殊的抽象类,但更甚于抽象类。抽象类是抽象单元,类中可以定 义抽象方法或已经实现的方法。接口定义了更深的特性,接口中只包含常量和方法定义,这些方 法是类必须实现的行为类型,但没有任何方法或变量的实现。创建接口时使用关键字 interface, 如下面代码所示: 修饰符 interface 接口名 { //方法或属性 } 接口的定义类似于类定义,但它的成员都是没有实现的,这与抽象类中定义方法是相同的。接口 的修饰符可以是 public、protected、protected internal、internal、private 或 new。关键字 interface 后面紧跟接口名称。
第五章:数组 三、简答题 1、数组的概念是什么? 简单数组也称之为一维数组,它是数组的最简单形式,可以包含同一类型的多个元素。他的数值 数组元素默认值为零,数组的索引由零开始。具有 n 个元素的数组索引是从 0 至 n-1。同时呢, 数组可以包含任何类型的元素,包括数组类型。但数组中的数据类型必须为相同的数据类型。 2、在程序中使用数组可以起到什么作用? 很多时候, 使用数组可以在很大程度

上缩短和简化程序代码, 因为可以通过上标和下标值来设计 一个循环,可以高效地处理多种情况。 3、如何访问数组中的元素? 数组初始化之后就可以使用索引器访问其中的元素了。 那么索引器又是什么呢?索引器可以理解 为数组的每个元素编号。对于 C#索引器目前来说,只支持整数类型的参数。索引器的开始标号 为 0,最大的索引数为元素个数减 1。
4、多维数组和锯齿数组的区别是什么? 首先定义不同 多维数组:private int[,] _multi ; 数组的数组(也即锯齿数组)private int [][] _jagged; 再次实例化不同 多维:_multi=new int [10,10]; 锯齿数组:_jagged=new int[2][]; _jagged[0]=new int[5]; _jagged[1]=new int[9]; 第 3 访问遍历方式不同: 多维: foreach(int e in _multi) { Console.Write(e.ToString()); } 锯齿数组: foreach(int[] row in _multi) { foreach(int[] e in row) { Console.Write(e.ToString()); } } 第 4 可定义维度不同 多维的每个维度固定,锯齿数组每个维度不固定,因此得名锯齿数组。 最后性能的差异: 多维:维度长度固定,利用这个特性,编译器可以生产更加高效的初始代码 锯齿:数组越大维数越多,初始化的代码越多,列方向遍历的效率低 5、接口在实现时的规则是什么? 显式实现接口成员:为了实现接口,类可以定义显式接口成员执行体。显式接口成员执行体可以 是一个方法、一个属性、一个事件或者是一个索引指示器的定义,定义与该成员对应的全权名应 保持一致。 继承接口实现接口具有不变性, 但这并不意味着接口不再发展。 派生的接口只继承了父接口的成 员方法说明,而没有继承父接口的实现,接口继承允许多继承,一个子接口可以有多个父接口。 重新实现接口: 继承了接口实现的类可以对接口进行重实现。 这个接口要求是在类定义的基类列 表中出现过的。 映射接口: 类必须为在基类表中列出的所有接口的成员提供具体的实现。 在类中定位接口成员的 实现称之为接口映射 6、Icomparer 接口和 IComparable 接口的区别是什么?
IComparable 接口与 IComparer 接口的区别在于 IComparable 接口必须由要比较的类来执行,而 IComparer 接口独立于要比较的类,同时这也是 Compare()方法定义两个比较接口的原因。 7、说明创建自定义接口的步骤。 从某种意义上说,接口是一种特殊的抽象类,但更甚于抽象类。抽象类是抽象单元,类中可以定 义抽象方法或已经实现的方法。接口定义了更深的特性,接口中只包含常量和方法定义,这些方 法是类必须实现的行为类型,但没有任何方法或变量的实现。创建接口时使用关键字 interface, 如下面代码所示: 修饰符 interface 接口名 { //方法或属性 }

第六章:类型强制转换 三、简答题 1、简述 C#支持的隐式转换类型。 隐式转换就是系统默认的、不需要加以声明就可以进行的转换。在隐式转换过程中,编译器无需 对转换进行详细检查就能够安全地执行转换。 例如从 int 类型转换到 long 类型就是一种隐式转换。 隐式转换一般不会失败,转换过程中也不会导致信息丢失。 源类型 Sbyte Byte Short Ushort Int Uint long、ulong float char 目的类型 short、int、long、float、double、decimal short、ushort、int、uint、long、ulong、float、double、decimal int、long、float、double、decimal int、uint、long、ulong、float、double、decimal long、float、double、decimal long、ulong、float、double、decimal float、double、decimal double ushort、int、uint、long、ulong、float、double、decimal
2、简述装箱和拆箱的过程。 装箱和拆箱机制使得在 C#类型系统中,任何值类型、引用类型和 object(对象)类型之间进行 转换,我们称这种转化为绑定连接。简单地说,有了装箱和拆箱的概念,对任何类型的值来说最 终我们都可以看作是 object 类型。 装箱转换: 装箱转换是指将一个值类型隐式地转换成一个 object 类型, 或者把这个值类型转换成一个被 该值类型应用的接口类型(interface-type) 。把一个值类型的值装箱,也就是创建一个 object 实例 并将这个值复制给这个 object。 拆箱转换: 和装箱转换正好相反, 拆箱转换是指将一个对象类型显式地转换成一个值类型, 或是将一个 接口类型显式地转换成一个执行该接口的值类型。 拆箱的过程分为两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把 这个实例的值复制给值类型的变量。
3、简述对象相等比较的方式。 对象相等比较的机制对于引用类型(类的实例)的比较和值类型(基本数据类型,结构或枚举的 实例)的比较来说是不同的。 System.Object 定义了对对象进行相等比较的三种不同的方式,再加上等于比较运算符(==) ,共 有 4 种相等比较的方式。 ReferenceEquals()方法 、虚拟的 Equals()方法 、静态的 Equals()方法 、比较运算符== 在进行值类型的相等比较时,采用与引用类型相同的规则:ReferenceEquals()用于比较引用, Equals()用于比较值,比较运算符可以看作是一个中间项。但最大的区别是值类型需要装箱,才 能把它们转换为引用,才能对它们执行方法。另外,Microsoft 已经在 System.ValueType 类中重 载了实例方法 Equals(),以便对值类型进行合适的相等测试。 5、简述如何重载运算符。 运算符重载是指允许用户使用用户定义的类型编写表达式的能力。 它允许用户定义的类型与预定 义的类型具有相同的功能。

运算符重载的关键是在类实例上不能总是只调用方法或属性, 有时还需要做一些其他的工作, 例 如对数值进行相加、相乘或逻辑操作,如比较对象等。但是,有许多类与运算符重载并不相关。 不恰当地使用运算符重载,会使使用类型的代码很难理解。例如,把两个 DateTime 对象相乘, 在概念上没有任何意义。 运算符重载的声明方式与普通方法的声明方式相同,使用 operator 关键字,后面紧跟相关运算符 的符号。声明代码如下所示: 修饰符 返回值类型 operator 运算符() { //重载运算符 }
第七章:字符串和正则表达式 三、简答题 1、简述 System.String 类包含哪些常用方法,并说明其作用。 方法 Compare Copy Format Insert Split Trim 作用 比较字符串的内容。 将一个字符串的内容原样不动地复制到一个新的字符串中 格式化包含各种值的字符串和如何格式化每个值的说明符 IndexOf 把一个字符串实例插入到另一个字符串实例的指定索引处 、 Join 在出现给定字符的地方,把字符串拆分为一个子字符串数组 删除首尾的空白 定位 合
字符串中第一次出现某个给定子字符串或字符的位置 并字符串数组,建立一个新字符串
2、简述 String 类和 StringBuilder 类的异同。 出于性能方面的考虑,大量的串联或所涉及其他字符串操作应通过 StringBuilder 类来执行。 StringBuilder 表示可变字符字符串,它允许我们有效的对字符串的字符执行动态操作, 有效的缩减 字符串的大小或者更改字符串中的字符。如果字符串变大,超过已经分配的字符的大小, StringBuilder 就会自动的分配一个全新的、 更大的数组, 并开始使用新的数组, 虽然 StringBuilder 对象是动态对象, 允许扩充它所封装的字符串中字符的数量, 但是您可以为它可容纳的最大字符
数指定一个值。 此值称为该对象的容量, 不应将它与当前 StringBuilder 对象容纳的字符串长度混 淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同 时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自 己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之 一来指定 StringBuilder 类的容量。 String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。 String 串联操作每次 都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时 才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况 下,编译器 甚至会 将各个 串联操作组 合到一 个操作 中。如果串 联

任意 数量的 字符串, 则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联。 2、举例说明如何对 StringBuilder 类型的字符串进行追加、插入和替换操作。 方法 Append() AppendFormat() Insert() Remove() Replace() Equals() EnsureCapacity() ToString() 作用 给当前字符串添加一个字符串 添加特定格式的字符串 在当前字符串中插入一个子字符串 从当前字符串中删除字符 在当前字符串中,用某个字符替换另一个字符,或者用当前字符串中的一个子 把给定的 StringBuilder 与 StringBuilder 进行比较。当两个 StringBuilder 相等时, 用于指定 StringBuilder 的最小的容量 把当前字符串转换为 System.String 对象(在 System.Object 中被重写)
字符串替换另一字符串 返回真,否则返回假。
//使用构造函数设置容量 StringBuilder sb2=new StringBuilder("Hello",100); //使用 Capacity 属性设置容量 StringBuilder sb3=new StringBuilder("Hello"); sb3.Capacity=100; 使用 Replace 替换字符串:Default.aspx.cs 1. //Replace 2. StringBuilder sb8=new StringBuilder("Hello"); 3. sb8=sb8.Replace("ll","r"); 使用 Insert 插入字符串:Default.aspx.cs 1. //Insert 2. StringBuilder sb6=new StringBuilder("Hello"); 3. sb6.Insert(2,"eee"); //在”He”后面插入,变为" Heeeello!" 使用 AppendFormat 追加特定格式的字符串:Default.aspx.cs 1. //AppendFormat 2. StringBuilder sb5=new StringBuilder("Today is "); 3. sb5.AppendFormat("{0:yyyy-MM-dd}",System.DateTime.Now); //形如:"Today is 2006-05-20" 使用 Append 追加字符串:Default.aspx.cs 1. //Append
2. StringBuilder sb4=new StringBuilder("Hello"); 3. sb4.Append(" World!"); //"Hello World!" 3、简述什么是正则表达式。 正则表达式并非一门专用语言, 但也可以看作是一种语言。 它可以让用户通过使用一系列普通字 符和特殊字符构建能明确描述文本字符串的匹配模式。 除了简单描述这些模式之外, 正则表达式 解释引擎通常可用于遍历匹配, 并使用模式作为分隔符来将字符串解析为子字符串, 或以智能方 式替换文本或重新设置文本格式。 正则表达式为解决与文本处理有关的许多常见任务提供了有效 而简捷的方式。 4、举例说明如何使用正则表达式。 class Class1 { static void Main( string[] args ) { string text = "Chang Chun Li Gong Da Xue Ruan Jian Xue Yuan"; string result = ""; string pattern = @"\bX\S*e\b"; foreach( Matchm in Regex.Matches(text, pattern)) {result += m.ToString();} Console.WriteLine( result ); } }
第八章:集合 三、简答题 1、有序表的概念是什么? 在程序编写的过程中,有时也会用到已经排好的顺序的表,那么就可以使用 SortedList有序表类进行处理数据了,这个类表按转键给元素排序。 2、使用字典处理数据有什么优

势? 字典是一种非常复杂的数据结构, 该数据结构允许按照某个键值来访问元素。 字典也被称为映射 或称为散列表。 该数据结构最大的优势是能够按照键值快速查找元素。 同时也可以自由添加和删 除元素,这一点与 List有点类似,但字典类型没有在内存中移动后续元素的性能开销。 3、如何将一个列表指定为只读列表? 集合创建好后,就是可读写的。当然,集合也必须是可读写的,否则将不能给它填充值。但是, 在 填 充 完 集 合 后 , 可 以 创 建 只 读 集 合 。 ArrayList 集 合 的 方 法 AsReadOnly 返 回 ReadOnlyCollection类型的对象。ReadOnlyCollection类执行的接口与 List相同,但所 有修改集合的方法和属性都抛出 NotSupportedException 异常。创建只读集合语法格式如下: ArrayList listconcent1 = ArrayList.ReadOnly(listconcent); 4、队列和栈的区别是什么? 使用栈(Stack)类创建的集合和队列创建的集合有些类似,其主要的不同之处在于,队列的处 理方式是先进先出的方式,而栈创建的集合则是后进先出的处理方式。也就是说,在栈的处理方
式中,元素以与其进入的顺序相反顺序处理。 5、字典可以分为哪几种类型的字典? HashTable 、ListDictionary、HybridDictionary、NameObjectCollectionBase、NameValueCollection、 Dictionary、SortedDictionary 6、什么是位数组? 位数组就是其元素以位标志的集合数组。因为每一元素都是一位,而不是一个对象,所以这些集 合的行为与其他集合稍有不同。一般来说,我们将位数组分为两类,一个是(BitArray)集合类 位数组,一个是(BitVector32)结构类位数组。 7、简单叙述一下队列的使用。 使用 Queue 声明一个队列,用 Queue 的 Enqueue()方法给队列添加元素,使用 Dequeue()方法删 除队列中的元素。同时我们发现在队列集合中,元素是以先进先出的顺序进行处理的。
第九章:结构化的异常处理 三、简答题 1、描述如何抛出和捕获异常。 NET Framework 提供了大量处理异常的预定义基类对象。 将可能引发异常的代码段放在 try 块中, 而将处理异常的代码放在 catch 块中。catch 块是一系列以关键字 catch 开头的语句,语句后跟异 常类型和要执行的操作。finally 块包含代码清理资源或执行要在 try 块或 catch 块末尾执行的其 他操作。无论是否产生异常,都会执行 finally 块,因为 finally 块包含了应总是执行的清理代码, 如果在 finally 块中放置了 return 语句,编译器就会标志一个错误。例如,可以在 finally 块中关 闭在 try 块中打开的连接。finally 块是可选的。如果不需要清理代码,就不需要包含此块。 抛出和捕获异常是由 try/catch 块来完

成的,它是 C# 异常处理的主要机制。try/catch 块的基本语 法如下所示: try {//有可能产生异常的代码 } catch(Exception e) {//对异常进行处理的代码 } finally {//最终将执行的代码 } 2、简述嵌套的 try 语句的执行过程。 在每个块中,.NET 运行时顺序执行 try 块,查找合适的处理程序。在每个步骤中,当退出 catch 块后,就会执行对应 finally 块中的清理代码,但不执行 finally 块外部的代码,直到找到合适的 catch 处理程序并执行为止。 3、简述发生异常时的传递顺序。 在 C#中,发生异常时,异常沿堆栈向上传递,每个 catch 块都有机会处理它,catch 语句的顺序 很重要。将针对特定异常的 catch 块放在常规异常 catch 块的前面,否则编译器可能会发出错误。 确定正确 catch 块的方法是将异常的类型与 catch 块中指定的异常名称进行匹配。如果没有特定 的 catch 块,则由可能存在的常规 catch 块捕捉异常。 要想捕获某一个被抛出的异常, 只有该异常的类型与某个 catch 语句中指定的异常类型相匹配时,
才会执行这个 catch 语句。基于类型筛选的异常处理程序指定仅捕捉特定类型的异常,从而可以 使用户更加详细地获得指定异常的信息。 假定异常是在代码块的内层 try 块中抛出的,但内层的 catch 块中没有合适的处理程序。这时通 常就要执行内层的 finally 块,但.NET 运行时只能退出内层的 try 块,才能搜索到合适的处理程 序。下一个要搜索的区域显然是外层的 catch 块。如果系统在这里找到了一个处理程序,就会执 行该处理程序,再执行外层的 finally 块,如果没有找到合适的处理程序,就会继续搜索。在这 里,执行的外层的 finally 块,因为没有更多的 catch 块,所以控制权会返回.NET 运行时。 4、简要说明 System.Exception 类的成员。 System.Exception 类 是 其 他 异 常 类 的 基 类 。 它 有 两 个 直 接 派 生 类 : ApplicationException 和 SystemException 。 当 错 误 发 生 时 , 例 如 出 现 了 数 组 越 界 错 误 , 程 序 运 行 时 环 境 就 会 抛 出 SystemExcetipn 类的适当派生类。 ApplicationException 类是由用户程序抛出, 而 而不是由运行时 环境抛出。用户所有的自定义异常类都应是 ApplicationExcepton 类的派生类。 5、简要说明.NET 中使用的内部异常类。 在.NET Framework 中,异常是从 Exception 类继承的对象。System.Exception 异常类派生于 System.Object,通常情况下不在代码中抛出这个 System.Exception 对象,因为它无法确定错误情 况的本质。但用户可以使用派生于 System.Exception 类的异常类对象来更明确表示异常。内部异 常也称为预定义异常,它是.NET 中使用的内部异常类的对象。 6、简述如何自定义异常

处理。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyException { class Program { static void Main(string[] args) { try{throw (new MyException("自定义异常"));} catch (Exception ex) { System.Console.WriteLine("异常类型:{0}", ex.GetType().ToString()); System.Console.WriteLine("异常信息:{0}", ex.Message); System.Console.WriteLine("堆栈跟踪:{0}", ex.StackTrace); } } } public class MyException : ApplicationException { public MyException(string strMsg):base(strMsg) {}
} } 在上述代码中创建了一个非常简单的自定义异常类 MyException。虽然它没有具体实现,但它继 承了 ApplicationException 类,从而继承了 Exception 类。所以它拥有 Exception 类中定义的属性 和方法。例如,在上述代码中 MyException 就使用了 Exception 类的 GetType()方法,Message 属 性和 StackTree 属性。从该实例可以看出,用户自定义异常并不能像标准异常那样被自动抛出, 而必须在程序中使用 throw 语句抛出。
第十章:Windows 窗体控件 三、简答题 1、ActiveX 控件和.NET 控件的主要区别是什么? .NET 控件是.NET 程序集,允许任何 Visual Studio 语言使用它们,而 ActiveX 控件常常在设计和 运行期间显示自己。 3、简述 Panel 控件和 Group 控件的相同点和不同点。 Panel 控件是一个能包含其它控件的控件,可以使用 Panel 控件组合控件的集合,其主要用于对 控件集合进行分组。 GroupBox 控件表示一个 Windows 控件,该控件显示围绕一组具有可选标题的控件的框架,与 Panel 控件相比该控件可以显示标题,但是却不能显示滚动条。使用 GroupBox 对窗体上的控件 集合进行逻辑分组。组框是可用于定义控件组的容器控件。 在为控件进行分组的时候, 需要标题的使用该控件, 如果不需要标题但是却需要滚动条那就使用 Panel 控件,当然这两者都不要求的情况下,是运用那一个控件都可以的,都能达到分组效果。 4、简述 ListView 控件 View 属性的值并分别说明。 Details:每个项显示在不同的行上,并带有关于列中所排列的各项的进一步信息。最左边的列包 含一个小图标和标签,后面的列包含应用程序指定的子项。列显示一个标头,它可以显示列的标 题。用户可以在运行时调整各列的大小。 LargeIcon:每个项都显示为一个最大化图标,在它的下面有一个标签。 List:每个项都显示为一个小图标,在它的右边带一个标签。各项排列在列中,没有列标头。 SmallIcon:每个项都显示为一个小图标,在它的右边带一个标签。 Tile:每个项都显示为一个完整大小的图标,在它的右边带项标签和子项信息。显示的子项信息 由应用程序指定。 此视图仅在下面的平台上受支持: Windows XP 和 Windows Serve

r 2003 系列。 在之前的操作系统上,此值被忽略,并且 ListView 控件在 LargeIcon 视图中显示。 5、简述 ListBox 控件和 CheckedListBox 控件的区别。 ListBox 控件表示用于显示项列表的 Windows 控件,该控件使得你得以向用户显示一组列表项, 用户可以单击选择这些项,CheckListBox 控件显示一个 ListBox,其中每项的左边显示一个复选 框,用户一次可以选择一项,也可以选择多项。 6、简述 PictureBox 控件 SizeMode 属性的值并做相关说明。 AutoSize:调整 PictureBox 大小,使其等于所包含的图像大小。 CenterImage:如果 PictureBox 比图像大,则图像将居中显示。如果图像比 PictureBox 大,则 图片将居于 PictureBox 中心,而外边缘将被剪裁掉。
Normal:图像被置于 PictureBox 的左上角。如果图像比包含它的 PictureBox 大,则该图像将 被剪裁掉。 StretchImage:PictureBox 中的图像被拉伸或收缩,以适合 PictureBox 的大小。 Zoom:图像大小按其原有的大小比例被增加或减小。 7、简述 RichTextBox 控件是如何加载文件的,或写出代码。 RichTextBox 控件提供具有打开和保存文件的功能的方法。LoadFile 方法使你得以将现有的 RTF 或 ASCII 文本文件加载到控件中。还可以从已打开的数据流加载数据。SaveFile 使你得以将文件 保存到 RTF 或 ASCII 文本中。与 LoadFile 方法相似,还可以使用 SaveFile 方法保存到开放式数 据流。RichTextBox 控件还提供查找文本字符串的功能。Find 方法被重载,可以同时查找控件文 本内的文本字符串以及特定字符。也可以将 RichTextBox 控件初始化为内存中存储的数据。 Private void Form1_load(object sender, EventArgs e) { richTextBox1.LoadFile(@”/home/youandme/test.rtf”); richTextBox1.Find(“Text”, RichTextBoxFinds.MatchCase); richTextBox1.ForeColor = Color.Red; richTextBox1.SaveFile(“@”/home/youandme/text.rtf”, RichTextBoxStreamType.RichText); }
第十一章:MDI 程序设计 三、简答题 1、说明 MDI 应用程序中子窗体和标准窗体的区别。 MDI 应用程序中的标准窗体显示为模态窗口对话框,即没有菜单的窗体。在本程序中“帮助” 窗体没模态对话框,在模态对话框显示时,无法在对话框与程序进行焦点的切换,除非关闭模态 对话框,焦点才会回到应用程序中。非模态对话框显示时,我们可以在任意窗体和程序之间切换 焦点。 所有子窗体均显示在 MDI 父窗体的工作区中,用户可以改变、移动子窗体的大小,但被限制在 MDI 窗体中。 2、说明 MDI 父窗体和子窗体的关系及特征。 MDI 应用程序的界面是由父窗口和子窗口组成,父窗口或称为 MDI 窗体子窗口的容器;子窗口 或被成为文档窗口显示各自的文档,所有子窗口都有相同的功能。MDI 应用程序特点很

多下面 列举一些显著的特点。下面列举一些显著的特点: 所有子窗体均显示在 MDI 父窗体的工作区中,用户可以改变、移动子窗体的大小,但被限制在 MDI 窗体中。 当最小化子窗体时, 它的图标将显示于 MDI 窗体上而不是在任务栏中。 当最小化 MDI 父窗体时, 所有子窗体页眉最小化,只有 MDI 父窗体的图标出现在任务栏中。 当最大化一个子窗体时,所有子窗体都被最大化,当前子窗体的标题与 MDI 父窗体的标题一起 显示在 MDI 父窗体的标题栏上 MDI 父窗体和子窗体都有各自的菜单,当子窗体加载时覆盖 MDI 父窗体的菜单。 3.、简述创建 MDI 应用程序的过程,以及父窗体是如何显示子窗体的。 由于父窗体是 MDI 应用程序的基础,因此要创建一个 MDI 应用程序,首先要为应用程序创建一
个父窗体,用来显示子窗体。然后再创建 MDI 子窗体,利用代码把这些子窗体载入到父窗体中 显示。 ①创建一个 Windows 应用程序 ②设置①中的窗体属性 IsMdiparents 为 True ③添加一个新项 Windows 窗体 public ParentForm() { InitializeComponent(); ChildForm child=new ChildForm(); child.Mdiparent=this; child.Show(); } 7、描述 MDI 窗体事件 Closing 的执行过程。 Closing 事件 它可以为窗体和子窗体触发。如果试图关闭子窗体,该事件仅仅被子窗体触发,如 果试图关闭 MDI 应用程序父窗体,Closing 将首先被每一个打开的 MDI 子窗体触发。如果其中 任何一个 Closing 事件被取消,Windows 将取消触发,然后继续后继的 Closing 事件。当 Closing 事件被所有的 MDI 应用程序子窗体触发之后,最后才会被 MDI 应用程序父窗体触发。

相关文档
相关文档 最新文档