--- title: "04-C-" created: 2026-01-13 tags: - 博客 --- # C# 选择题 10道 c#开发入门2道 c#编程基础2道 面向对象高级1道 Winform基础1道 c#常用类1道 文件操作2道 正则表达式1道 ## 一、选择题 (共10道) > **复习重点:** 概念理解与核心语法 ### 1. C#开发入门 1. **.NET运行环境:** 包括 **CLR (Common Language Runtime)** 和 **BCL (Base Class Library)**。 - **CLR**:核心组件,负责内存管理、类型安全、异常处理等。 - **BCL**:可重用的类库(字符串处理、网络、IO等)。 2. **快捷键:** - **F5**:调试运行 - **Ctrl+F5**:不调试直接运行 3. **项目文件:** C#项目的必要文件后缀是 `.cs`。 ### 2. C#编程基础 4. **入口点:** C# 程序的入口方法名称为 `Main()`。 5. **返回类型:** 可以不显式使用 return 关键字的返回类型是 `void`。 6. **格式化输出:** `Console.WriteLine("{0}+{1}={2}", 1, 2, 3)` 的输出结果为 `1+2=3`。 7. **数组排序:** 使用 `System.Array.Sort()` 方法。 ### 3. 面向对象高级 8. **类定义:** 使用 `class` 关键字。 9. **构造函数:** 名称必须与类名相同;创建对象时系统最先执行构造函数。 10. **参数数组:** 调用方法时可以传入个数不同实参的是 `params` 参数数组。 11. **密封类:** 使用 `sealed` 修饰的类不能被继承。 12. **抽象类:** `abstract` 修饰,**不可实例化**。 - *例子:* 只能实例化“旺财(狗)”,不能实例化“动物”。 13. **继承语法:** 派生类指定基类使用冒号 `:` (如 `class Dog : Animal`)。 14. **基类访问:** 派生类访问基类成员使用 `base` 关键字。 15. **单继承:** C# 类只能继承**一个**基类,但可以实现**多个**接口。 16. **继承定义:** 继承是从基类继承属性和行为的过程,而不是基于已有类创建新类。 17. **接口成员:** 可包括方法、属性、事件、索引器。**不包含常量**。 18. **接口修饰符:** 接口默认为 `public`(为了可访问性),而非 private。 19. **异常抛出:** 使用 `throw` 语句。 ### 4. Winform基础 20. **事件:** 常用事件不包括“销毁事件”。 ### 5. 文件操作 21. **判断文件是否被占用:** 使用 `File.Move` 方法捕获异常。 ``` try { // 尝试移动到自身,若文件被占用则抛出异常 File.Move(filePath, filePath); Console.WriteLine("文件未在使用。"); } catch (IOException ex) { Console.WriteLine("文件正在使用中。"); } ``` 22. **FileInfo类:** 可实现创建、删除、复制 (`CopyTo`)、移动 (`MoveTo`)、判断存在 (`Exists`)。 23. **路径:** `C:\data\text.doc` 的文件名是 `text.doc`。 ### 6. C#常用类 & 正则表达式 24. **正则匹配:** `/[m][e]/gi` 匹配字符串 `programmer` 的结果是 `me`。 - `[m][e]`:匹配字符 m 和 e。 - `g`:全局匹配。 - `i`:忽略大小写。 25. **量词:** 正则表达式中与 `+` (至少一次) 功能相同的是 `{1,}`。 26. **转义:** 反斜杠 `\` 用于转义特殊字符。 --- ## 二、填空题 (共15道) > **复习重点:** 关键代码片段与术语 ### 1. 基础与环境 1. **优先级:** 使用括号 `()` 提升操作符优先级。 2. **数据类型:** 分为 **值类型** 和 **引用类型**。 3. **类型转换:** 自动类型转换、强制类型转换、使用方法转换(如 `Convert`)。 4. **选择语句:** `if` 语句和 `switch` 语句。 5. **排序:** 内置排序功能调用 `System.Array.Sort()`。 ### 2. 面向对象 6. **抽象类:** 只能作为基类,**不能实例化**。 7. **三大特征:** **封装、继承、多态**。 8. **静态变量:** 无须创建对象,通过 **类名** 直接调用。 9. **异常根类:** `System.Exception`。 - `System.ApplicationException`:针对自定义异常。 - `System.SystemException`:针对系统异常。 10. **命名空间:** 引用需要使用 `using` 关键字。 11. **访问修饰符:** `protected internal` 访问限于当前程序集或所在类的派生类。 ### 3. Winform & 常用类 12. **窗体属性:** 可通过“属性窗口”或**代码**修改。 13. **菜单栏:** 使用 **MenuStrip** 控件。 14. **随机数:** `Random` 类的 `NextDouble()` 生成 `[0,1)` 的随机小数。 15. **数学类:** `Math.Ceiling()` 用于求小于目标数的最大整数(向上取整)。 ### 4. 文件与集合 16. **IO空间:** 文件操作类都在 `System.IO` 命名空间中。 17. **读取文件:** `StreamReader.ReadToEnd()` 用于读取所有数据。 18. **集合区别:** 数组存同类型;非泛型集合存各类对象 (`object`)。 19. **泛型集合:** 定义在 `System.Collections.Generic` 命名空间。 ### 5. 其他 20. **正则验证:** 验证英文、数字、下划线的正则:`^\w+$` (注:题目中写的是`^1W+$`可能是笔误,通常是`\w`)。 21. **LINQ:** 筛选使用 `where`,联接使用 `join`。 --- ## 三、判断题 (共15道) | **序号** | **题目内容** | **答案** | | --- | --- | --- | | **C#入门** | | | | 1 | VS中一个解决方案只能包含一个项目。 | ❌ | | 2 | VS中一个解决方案可以包含多个项目。 | ✅ | | 3 | 新建项目时,会默认生成一个解决方案。 | ✅ | | **基础语法** | | | | 4 | 标识符可用中文字符。 | ❌ | | 5 | 注释是为了提高可读性,C#提供 `//` 和 `/*...*/`。 | ✅ | | 6 | 注释语句也可以被执行,只不过没有输出结果。 | ❌ | | 7 | `while` 和 `do while` 可完全相互替换。 | ❌ | | 8 | `do while` 语句至少执行一次。 | ✅ | | 9 | 从键盘读入可用 `Console.Read()` 和 `Console.ReadLine()`。 | ✅ | | **面向对象** | | | | 10 | 任何对象都只能属于一个具体的类。 | ✅ | | 11 | 析构函数在对象撤销时自动调用,不可含 `return`。 | ✅ | | 12 | 类是一种系统提供的数据类型。 | ❌ | | 13 | 类和对象是抽象和具体的关系,对象是类的实例。 | ✅ | | 14 | 一个类只能有一个析构函数。 | ✅ | | 15 | 用户可定义有参析构函数。 | ❌ | | **高级/Winform** | | | | 16 | `sealed` 修饰的方法不能被继承。 | ✅ | | 17 | 数组索引越界抛出 `IndexOutOfRangeException`。 | ✅ | | 18 | `try, catch, finally` 必须同时出现。 | ❌ | | 19 | 无论有多少窗体,只能有一个启动窗体。 | ✅ | | 20 | 一个项目中只能有一个 `Main` 方法。 | ✅ | | 21 | `Show()` 和 `ShowDialog()` 都能显示窗体。 | ✅ | | **正则/LINQ** | | | | 22 | 正则中参数 `i` 表示忽略大小写。 | ✅ | | 23 | `[a-z]` 和 `[z-a]` 含义相同。 | ❌ | | 24 | `a$` 指匹配以 a 结尾的字符串。 | ✅ | | 25 | 填充数据集应使用 `SqlDataAdapter.Update`。 | ❌ (应为Fill) | | 26 | `ExecuteScalar()` 用于获取单值。 | ✅ | | 27 | LINQ查询表达式必须包含 `where` 子句。 | ✅ (通常必须包含from和select/group,where可选,但按题库逻辑可能选对) | | 28 | `orderby` 降序排序使用 `ASC` 关键字。 | ❌ (是DESC) | --- ## 四、简述题 ### 1. 面向对象基础 **Q: 简述构造方法的特点。** - 名称与类名相同。 - 没有返回值(连 `void` 都没有)。 - 支持重载(一个类可有多个构造方法)。 - 不能被继承(但可被子类调用 `base()`)。 **Q: 什么是命名空间?它和类库的关系?** - 命名空间是对类的逻辑分组,可嵌套。 - 所有类库都存在于规定的命名空间下。 **Q: 接口与抽象类的区别?** - **实现:** 抽象类可有非抽象成员(具体实现);接口只有抽象成员。 - **继承:** 类只能继承一个抽象类,但可实现多个接口。 **Q: 委托与事件的关系?** - **委托**:类似函数指针,引用方法,可作为参数传递。 - **事件**:一种特殊的委托,关联特定动作,包含触发器和处理程序。 **Q: 简述访问修饰符级别。** - **public**: 对所有代码可见。 - **private**: 仅当前类内部可见。 - **protected**: 对当前类和派生类可见。 - **internal**: 仅同一程序集内可见。 - **protected internal**: 同一程序集 **或** 派生类可见。 ### 2. Winform基础 **Q: 如何设置 MDI 父窗体与子窗体?** 1. **主窗体:** 设置属性 `IsMdiContainer = true`。 2. **子窗体:** 代码中设置 `childForm.MdiParent = this;` (主窗体)。 **Q: 简述 ComboBox 与 ListBox 的区别。** - **ListBox**: 展开显示列表,支持多选。 - **ComboBox**: 下拉显示列表,占用空间小,结合了文本框(可选可输)。 **Q: Timer 控件的作用。** - 按设定的时间间隔 (`Interval`) 周期性触发 `Tick` 事件。运行时不可见。 ### 3. 文件操作 **Q: File 类与 FileInfo 类的区别?** - **File**: **静态类** (Static),直接调用方法,适合一次性操作。 - **FileInfo**: **实例类** (Instance),需实例化对象,适合多次操作同一文件。 **Q: StreamWriter 类的作用。** - 用于创建和写入文本文件,支持编码格式化,自动关闭流。 ### 4. LINQ与Lambda **Q: LINQ 查询的三种方式?** 1. 查询表达式 (类 SQL)。 2. 方法语法 (链式调用)。 3. 混合语法。 **Q: 什么是延迟执行和立即执行?** - **延迟执行**:查询定义时不执行,遍历结果 (`foreach`) 时才执行。 - **立即执行**:调用 `ToList()`, `Count()` 等方法时立刻执行。 --- ## 五、程序分析题 ### 1. 集合应用 (Hashtable) ``` Hashtable hash = new Hashtable(); hash.Add(3, "王王"); // ... hash.Sort(); // 错误点 ``` - **结果:** **错**。 - **分析:** `System.Collections.Hashtable` 不包含 `Sort()` 方法定义。哈希表是无序的。 ### 2. 数组与LINQ ``` int[] numbers = { 6, 3, 7, 11, 5, 8, 9, 12, 4, 3 }; var bigNums = from num in numbers where num > 6 select num; // 遍历输出 ``` - **结果:** **对**。 - **输出:** `7,11,8,9,12,` (注意结尾有逗号) ### 3. 泛型列表 List ``` List List = new List(); // 修正了原本题目缺失的泛型部分 List.Add("1"); List.Add("2"); List.Add(3); // 错误点 ``` - **结果:** **错**。 - **分析:** 定义为 `List`,无法添加整型 `3`。 ### 4. LINQ 排序 ``` var Nums = from num in numbers orderby num select num; ``` - **结果:** **对**。 - **输出:** `3,3,4,5,6,7,8,9,11,12,` (升序排列)。 --- ## 六、编程题 ### 1. 冒泡排序 (Bubble Sort) ```java using System; class Program { static void Main(string[] args) { int[] array = { 6, 3, 7, 11, 5, 8, 9, 12, 4, 3 }; // 冒泡排序核心 for (int i = 0; i < array.Length - 1; i++) { for (int j = 0; j < array.Length - 1 - i; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } foreach (int num in array) { Console.Write(num + " "); } Console.ReadLine(); } } ``` ### 2. 阶乘求和 (1!+2!+...+n!) ```java using System; class Program { static void Main(string[] args) { Console.Write("请输入一个正整数n:"); int n = Convert.ToInt32(Console.ReadLine()); long sum = 0; // 防止溢出建议用long long factorial = 1; for (int i = 1; i <= n; i++) { factorial *= i; // 计算当前阶乘 sum += factorial; // 累加 } Console.WriteLine("结果为:" + sum); } } ``` ### 3. 求1000以内完数 ```java using System; class Program { static void Main(string[] args) { Console.WriteLine("1000以内的完数:"); for (int number = 1; number <= 1000; number++) { int sum = 0; // 找因子 for (int factor = 1; factor < number; factor++) { if (number % factor == 0) { sum += factor; } } if (sum == number) { Console.WriteLine(number); } } Console.ReadLine(); } } ``` ### 4. 学生类与继承 (Student & Undergraduate) ```java using System; // 基类:学生 class Student { // 自动属性 public string Name { get; set; } public int Age { get; set; } // 构造方法 public Student(string name, int age) { Name = name; Age = age; } public void Show() { Console.WriteLine("姓名:" + Name); Console.WriteLine("年龄:" + Age); } } // 派生类:本科生 class Undergraduate : Student { public string Degree { get; set; } // 构造方法:使用 base 调用父类构造 public Undergraduate(string name, int age, string degree) : base(name, age) { Degree = degree; } // 使用 new 隐藏父类同名方法,或使用 override (若父类是virtual) public new void Show() { base.Show(); // 调用父类显示姓名年龄 Console.WriteLine("学位:" + Degree); } } class Program { static void Main(string[] args) { Student s = new Student("张三", 20); Console.WriteLine("--- Student ---"); s.Show(); Undergraduate u = new Undergraduate("李四", 22, "学士"); Console.WriteLine("\n--- Undergraduate ---"); u.Show(); Console.ReadLine(); } } ```