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#编程基础

  1. 入口点: C# 程序的入口方法名称为 Main()
  2. 返回类型: 可以不显式使用 return 关键字的返回类型是 void
  3. 格式化输出: Console.WriteLine("{0}+{1}={2}", 1, 2, 3) 的输出结果为 1+2=3
  4. 数组排序: 使用 System.Array.Sort() 方法。

3. 面向对象高级

  1. 类定义: 使用 class 关键字。
  2. 构造函数: 名称必须与类名相同;创建对象时系统最先执行构造函数。
  3. 参数数组: 调用方法时可以传入个数不同实参的是 params 参数数组。
  4. 密封类: 使用 sealed 修饰的类不能被继承。
  5. 抽象类: abstract 修饰,不可实例化
    • 例子: 只能实例化“旺财(狗)”,不能实例化“动物”。
  6. 继承语法: 派生类指定基类使用冒号 (如 class Dog : Animal)。
  7. 基类访问: 派生类访问基类成员使用 base 关键字。
  8. 单继承: C# 类只能继承一个基类,但可以实现多个接口。
  9. 继承定义: 继承是从基类继承属性和行为的过程,而不是基于已有类创建新类。
  10. 接口成员: 可包括方法、属性、事件、索引器。不包含常量
  11. 接口修饰符: 接口默认为 public(为了可访问性),而非 private。
  12. 异常抛出: 使用 throw 语句。

4. Winform基础

  1. 事件: 常用事件不包括“销毁事件”。

5. 文件操作

  1. 判断文件是否被占用: 使用 File.Move 方法捕获异常。

    try {
        // 尝试移动到自身,若文件被占用则抛出异常
        File.Move(filePath, filePath);
        Console.WriteLine("文件未在使用。");
    } catch (IOException ex) {
        Console.WriteLine("文件正在使用中。");
    }
    
  2. FileInfo类: 可实现创建、删除、复制 (CopyTo)、移动 (MoveTo)、判断存在 (Exists)。

  3. 路径: C:\data\text.doc 的文件名是 text.doc

6. C#常用类 & 正则表达式

  1. 正则匹配: /[m][e]/gi 匹配字符串 programmer 的结果是 me
    • [m][e]:匹配字符 m 和 e。
    • g:全局匹配。
    • i:忽略大小写。
  2. 量词: 正则表达式中与 + (至少一次) 功能相同的是 {1,}
  3. 转义: 反斜杠 \ 用于转义特殊字符。

二、填空题 (共15道)

复习重点: 关键代码片段与术语

1. 基础与环境

  1. 优先级: 使用括号 () 提升操作符优先级。
  2. 数据类型: 分为 值类型引用类型
  3. 类型转换: 自动类型转换、强制类型转换、使用方法转换(如 Convert)。
  4. 选择语句: if 语句和 switch 语句。
  5. 排序: 内置排序功能调用 System.Array.Sort()

2. 面向对象

  1. 抽象类: 只能作为基类,不能实例化
  2. 三大特征: 封装、继承、多态
  3. 静态变量: 无须创建对象,通过 类名 直接调用。
  4. 异常根类: System.Exception
    • System.ApplicationException:针对自定义异常。
    • System.SystemException:针对系统异常。
  5. 命名空间: 引用需要使用 using 关键字。
  6. 访问修饰符: protected internal 访问限于当前程序集或所在类的派生类。

3. Winform & 常用类

  1. 窗体属性: 可通过“属性窗口”或代码修改。
  2. 菜单栏: 使用 MenuStrip 控件。
  3. 随机数: Random 类的 NextDouble() 生成 [0,1) 的随机小数。
  4. 数学类: Math.Ceiling() 用于求小于目标数的最大整数(向上取整)。

4. 文件与集合

  1. IO空间: 文件操作类都在 System.IO 命名空间中。
  2. 读取文件: StreamReader.ReadToEnd() 用于读取所有数据。
  3. 集合区别: 数组存同类型;非泛型集合存各类对象 (object)。
  4. 泛型集合: 定义在 System.Collections.Generic 命名空间。

5. 其他

  1. 正则验证: 验证英文、数字、下划线的正则:^\w+$ (注:题目中写的是^1W+$可能是笔误,通常是\w)。
  2. LINQ: 筛选使用 where,联接使用 join

三、判断题 (共15道)

序号 题目内容 答案
C#入门
1 VS中一个解决方案只能包含一个项目。
2 VS中一个解决方案可以包含多个项目。
3 新建项目时,会默认生成一个解决方案。
基础语法
4 标识符可用中文字符。
5 注释是为了提高可读性,C#提供 ///*...*/
6 注释语句也可以被执行,只不过没有输出结果。
7 whiledo 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<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();
    }
}