C#
选择题 10道 c#开发入门2道 c#编程基础2道 面向对象高级1道 Winform基础1道 c#常用类1道 文件操作2道 正则表达式1道
一、选择题 (共10道)
复习重点: 概念理解与核心语法
1. C#开发入门
- .NET运行环境: 包括 CLR (Common Language Runtime) 和 BCL (Base Class Library)。
- CLR:核心组件,负责内存管理、类型安全、异常处理等。
- BCL:可重用的类库(字符串处理、网络、IO等)。
- 快捷键:
- F5:调试运行
- Ctrl+F5:不调试直接运行
- 项目文件: C#项目的必要文件后缀是
.cs。
2. C#编程基础
- 入口点: C# 程序的入口方法名称为
Main()。 - 返回类型: 可以不显式使用 return 关键字的返回类型是
void。 - 格式化输出:
Console.WriteLine("{0}+{1}={2}", 1, 2, 3)的输出结果为1+2=3。 - 数组排序: 使用
System.Array.Sort()方法。
3. 面向对象高级
- 类定义: 使用
class关键字。 - 构造函数: 名称必须与类名相同;创建对象时系统最先执行构造函数。
- 参数数组: 调用方法时可以传入个数不同实参的是
params参数数组。 - 密封类: 使用
sealed修饰的类不能被继承。 - 抽象类:
abstract修饰,不可实例化。- 例子: 只能实例化“旺财(狗)”,不能实例化“动物”。
- 继承语法: 派生类指定基类使用冒号
:(如class Dog : Animal)。 - 基类访问: 派生类访问基类成员使用
base关键字。 - 单继承: C# 类只能继承一个基类,但可以实现多个接口。
- 继承定义: 继承是从基类继承属性和行为的过程,而不是基于已有类创建新类。
- 接口成员: 可包括方法、属性、事件、索引器。不包含常量。
- 接口修饰符: 接口默认为
public(为了可访问性),而非 private。 - 异常抛出: 使用
throw语句。
4. Winform基础
- 事件: 常用事件不包括“销毁事件”。
5. 文件操作
-
判断文件是否被占用: 使用
File.Move方法捕获异常。try { // 尝试移动到自身,若文件被占用则抛出异常 File.Move(filePath, filePath); Console.WriteLine("文件未在使用。"); } catch (IOException ex) { Console.WriteLine("文件正在使用中。"); } -
FileInfo类: 可实现创建、删除、复制 (
CopyTo)、移动 (MoveTo)、判断存在 (Exists)。 -
路径:
C:\data\text.doc的文件名是text.doc。
6. C#常用类 & 正则表达式
- 正则匹配:
/[m][e]/gi匹配字符串programmer的结果是me。[m][e]:匹配字符 m 和 e。g:全局匹配。i:忽略大小写。
- 量词: 正则表达式中与
+(至少一次) 功能相同的是{1,}。 - 转义: 反斜杠
\用于转义特殊字符。
二、填空题 (共15道)
复习重点: 关键代码片段与术语
1. 基础与环境
- 优先级: 使用括号
()提升操作符优先级。 - 数据类型: 分为 值类型 和 引用类型。
- 类型转换: 自动类型转换、强制类型转换、使用方法转换(如
Convert)。 - 选择语句:
if语句和switch语句。 - 排序: 内置排序功能调用
System.Array.Sort()。
2. 面向对象
- 抽象类: 只能作为基类,不能实例化。
- 三大特征: 封装、继承、多态。
- 静态变量: 无须创建对象,通过 类名 直接调用。
- 异常根类:
System.Exception。System.ApplicationException:针对自定义异常。System.SystemException:针对系统异常。
- 命名空间: 引用需要使用
using关键字。 - 访问修饰符:
protected internal访问限于当前程序集或所在类的派生类。
3. Winform & 常用类
- 窗体属性: 可通过“属性窗口”或代码修改。
- 菜单栏: 使用 MenuStrip 控件。
- 随机数:
Random类的NextDouble()生成[0,1)的随机小数。 - 数学类:
Math.Ceiling()用于求小于目标数的最大整数(向上取整)。
4. 文件与集合
- IO空间: 文件操作类都在
System.IO命名空间中。 - 读取文件:
StreamReader.ReadToEnd()用于读取所有数据。 - 集合区别: 数组存同类型;非泛型集合存各类对象 (
object)。 - 泛型集合: 定义在
System.Collections.Generic命名空间。
5. 其他
- 正则验证: 验证英文、数字、下划线的正则:
^\w+$(注:题目中写的是^1W+$可能是笔误,通常是\w)。 - 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 父窗体与子窗体?
- 主窗体: 设置属性
IsMdiContainer = true。 - 子窗体: 代码中设置
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 查询的三种方式?
- 查询表达式 (类 SQL)。
- 方法语法 (链式调用)。
- 混合语法。
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<string> List = new List<string>(); // 修正了原本题目缺失的泛型部分
List.Add("1");
List.Add("2");
List.Add(3); // 错误点
- 结果: 错。
- 分析: 定义为
List<string>,无法添加整型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)
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!)
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以内完数
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)
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();
}
}
💬 评论