Files
My-Notes/笔记/CSharp/练习/CSharp复习题.md
T
2026-06-18 20:01:30 +08:00

794 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CSharp 复习题库(分层练习)
> 使用方式:每题都在“你的作答”填写答案;“批改区”由我批改后填写。
---
## 入门(16题)
### 入门-1 [选择]
C# 源文件常见扩展名是:A. `.cs` B. `.csharp` C. `.dotnet` D. `.clr`
**你的作答**
A
**批改区**
- 结果:✅ 正确
- 参考答案:A
### 入门-2 [选择]
`Main` 方法作为入口,正确签名之一是:A. `void main()` B. `static void Main(string[] args)` C. `public Main()` D. `int Main(void)`
**你的作答**
B
**批改区**
- 结果:✅ 正确
- 参考答案:B
### 入门-3 [选择]
下列哪个是值类型:A. `string` B. `object` C. `int` D. `Array`
**你的作答**
C
**批改区**
- 结果:✅ 正确
- 参考答案:C
### 入门-4 [选择]
`var x = 10;``x` 的编译期类型是:A. `dynamic` B. `object` C. `int` D. `long`
**你的作答**
C
**批改区**
- 结果:✅ 正确
- 参考答案:C
### 入门-5 [选择]
输出到控制台应使用:A. `Console.ReadLine` B. `Console.WriteLine` C. `Console.Open` D. `Console.Print`
**你的作答**
B
**批改区**
- 结果:✅ 正确
- 参考答案:B
### 入门-6 [填空]
用于单行注释的符号是 `____`
**你的作答**
`//`
**批改区**
- 结果:✅ 正确
- 参考答案:`//`
### 入门-7 [填空]
`if` 条件表达式的结果类型必须是 `____`
**你的作答**
`bool`
**批改区**
- 结果:✅ 正确
- 参考答案:`bool`
### 入门-8 [填空]
将字符串 `"123"``int`,可用 `int.Parse("123")``____("123", out n)`
**你的作答**
`Convert.Int32("123", out n)`
**批改区**
- 结果:❌ 错误
- 参考答案:`int.TryParse("123", out n)`
- 说明:`Convert.ToInt32` 没有 `out` 参数;带 `out` 的是 `TryParse`
### 入门-9 [判断]
`const` 字段的值可以在运行时修改。对/错
**你的作答**
**批改区**
- 结果:✅ 正确
- 参考答案:错
### 入门-10 [判断]
`string` 在 C# 中是引用类型。对/错
**你的作答**
**批改区**
- 结果:✅ 正确
- 参考答案:对
### 入门-11 [代码结果]
写出输出:
```csharp
int a = 5;
int b = 2;
Console.WriteLine(a / b);
Console.WriteLine(a / 2.0);
```
**你的作答**
`2`
`1.0`
**批改区**
- 结果:❌ 错误
- 参考答案:
```text
2
2.5
```
- 说明:`a / b` 是整数除法,结果为 `2`
### 入门-12 [代码改错]
修复下面代码使其可编译:
```csharp
Console.Writeline("Hello")
```
**你的作答**
```csharp
Console.Writeline("Hello");
```
**批改区**
- 结果:❌ 错误
- 参考答案:
```csharp
Console.WriteLine("Hello");
```
- 说明:`WriteLine``L` 需要大写。
### 入门-13 [简答]
`==``Equals` 的常见区别是什么(1-2句话)
**你的作答**
`Equals` 可以用于更复杂判断,`==` 只比较值。
**批改区**
- 结果:⚠️ 部分正确
- 参考要点:
- `==` 是运算符,可被重载;不同类型语义可能不同。
- `Equals` 是方法(实例/静态),常用于值相等判断。
-`string` 来说,`==` 比较的是内容(被重载),不是引用地址。
### 入门-14 [编程]
从控制台读取姓名和年龄,输出:`你好,张三,你明年 19 岁。`
**你的作答**
```csharp
string name = Console.Readline();
int age = int.Parse(Console.Readline());
Console.WriteLine($"你好,{name},你明年 {age} 岁。");
```
**批改区**
- 结果:❌ 错误
- 参考答案:
```csharp
string name = Console.ReadLine();
int age = int.Parse(Console.ReadLine()!);
Console.WriteLine($"你好,{name},你明年 {age + 1} 岁。");
```
- 说明:`ReadLine` 大小写错误,且“明年”应输出 `age + 1`
### 入门-15 [编程]
输入一个整数,判断奇偶并输出 `odd/even`
**你的作答**
```Csharp
int value = int.Parse(Console.ReadLine());
if( value%2 != 0 )
{
Console.WriteLine("odd");
}
else
{
Console.WriteLine("even");
}
```
**批改区**
- 结果:❌ 错误
- 主要问题:`int.TryParse(...)` 返回 `bool`,不能直接赋给 `int`
- 参考答案:
```csharp
if (int.TryParse(Console.ReadLine(), out int value))
Console.WriteLine(value % 2 == 0 ? "even" : "odd");
```
### 入门-16 [编程]
输入三个整数,输出最大值
**你的作答**
```Csharp
int[] value;
int maxValue = 0;
value[0] = int.Parse(Console.ReadLine());
value[1] = int.Parse(Console.ReadLine());
value[2] = int.Parse(Console.ReadLine());
for(int i = 0;i<2;i++)
{
if(value[i]>=value[i+1])
{
maxValue = value[i];
}
}
Console.WriteLine(maxValue);
```
**批改区**
- 结果:❌ 错误
- 主要问题:数组未初始化
- 参考答案:
```csharp
int a = int.Parse(Console.ReadLine()!);
int b = int.Parse(Console.ReadLine()!);
int c = int.Parse(Console.ReadLine()!);
int maxValue = Math.Max(a, Math.Max(b, c));
Console.WriteLine(maxValue);
```
---
## 基础(18题)
### 基础-1 [选择]
`for` 循环最适合:A. 已知次数迭代 B. 无限循环 C. 异常处理 D. 命名空间管理
**你的作答**
A
**批改区**
- 结果:✅ 正确
- 参考答案:A
### 基础-2 [选择]
`break` 在循环中的作用是:A. 跳过本次 B. 结束当前循环 C. 结束程序 D. 重启循环
**你的作答**
B
**批改区**
- 结果:✅ 正确
- 参考答案:B
### 基础-3 [选择]
`continue` 的作用是:A. 结束方法 B. 退出程序 C. 跳过本次迭代 D. 抛出异常
**你的作答**
C
**批改区**
- 结果:✅ 正确
- 参考答案:C
### 基础-4 [选择]
数组声明正确的是:A. `int arr = new int[3]` B. `int[] arr = new int[3]` C. `array<int> arr` D. `int arr[] = 3`
**你的作答**
B
**批改区**
- 结果:✅ 正确
- 参考答案:B
### 基础-5 [选择]
`List<T>` 位于命名空间:A. `System.Text` B. `System.Collections.Generic` C. `System.Linq.Expressions` D. `System.IO`
**你的作答**
B
**批改区**
- 结果:✅ 正确
- 参考答案:B
### 基础-6 [填空]
定义一个可空整型变量:`int____ x = null;`
**你的作答**
?
**批改区**
- 结果:✅ 正确
- 参考答案:`?`
### 基础-7 [填空]
声明并初始化字典:`Dictionary<string,int> d = new ____();`
**你的作答**
`Dictionary<string,int>
**批改区**
- 结果:✅ 正确
- 参考答案:`Dictionary<string,int>`
- 说明:你填的类型名是对的,只是 Markdown 里的反引号没闭合。
### 基础-8 [填空]
捕获异常的关键字是 `____`
**你的作答**
try和catch
**批改区**
- 结果:⚠️ 部分正确
- 参考答案:`catch`
- 说明:`try` 用来包裹可能抛异常的代码,真正负责捕获异常的是 `catch`。
### 基础-9 [填空]
释放非托管资源常用模式:实现 `____` 接口
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-10 [代码结果]
写出输出:
```csharp
for (int i = 0; i < 5; i++)
{
if (i == 2) continue;
if (i == 4) break;
Console.Write(i);
}
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-11 [代码结果]
写出输出:
```csharp
string s = null;
Console.WriteLine(s?.Length ?? -1);
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-12 [改错]
找出并修复问题:
```csharp
int[] nums = {1,2,3};
Console.WriteLine(nums[3]);
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-13 [简答]
`throw;` 和 `throw ex;` 的差异是什么
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-14 [编程]
用 `while` 计算 `1..n` 的和(n 从输入读取)
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-15 [编程]
统计一个字符串中元音字母个数(忽略大小写)
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-16 [编程]
手写一个方法 `bool IsPrime(int n)`
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-17 [编程]
使用 `List<int>` 去重并升序输出
**你的作答**
(待填写)
**批改区**
(待批改)
### 基础-18 [编程]
使用 `Dictionary<string,int>` 统计一句话中每个单词出现次数
**你的作答**
(待填写)
**批改区**
(待批改)
---
## 核心(18题)
### 核心-1 [选择]
面向对象三大特性不包括:A. 封装 B. 继承 C. 多态 D. 事务
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-2 [选择]
`virtual` + `override` 用于:A. 字段隐藏 B. 运行时多态 C. 命名空间引用 D. 泛型约束
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-3 [选择]
`abstract` 类:A. 可直接实例化 B. 不能包含实现 C. 不能被继承 D. 不能直接实例化
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-4 [选择]
`interface` 成员默认:A. private B. protected C. public 合同 D. internal
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-5 [选择]
泛型约束 `where T : class` 的含义是:A. 值类型 B. 引用类型 C. 必须有无参构造 D. 必须实现 IDisposable
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-6 [填空]
声明一个自动属性:`public int Age { ____; ____; }`
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-7 [填空]
只读自动属性常见写法:`public string Id { get; ____; }`
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-8 [填空]
委托声明关键字是 `____`
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-9 [填空]
事件订阅语法:`publisher.SomeEvent ____ Handler;`
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-10 [代码阅读]
输出是什么:
```csharp
class A { public virtual void M() => Console.Write("A"); }
class B : A { public override void M() => Console.Write("B"); }
A x = new B();
x.M();
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-11 [代码阅读]
输出是什么:
```csharp
int Add(int a, int b = 10) => a + b;
Console.WriteLine(Add(5));
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-12 [改错]
指出并修复:
```csharp
interface IRun { void Go() { Console.WriteLine("go"); } }
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-13 [简答]
`override` 与 `new` 隐藏成员的行为区别
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-14 [简答]
什么时候用接口,什么时候用抽象类(简述判断标准)
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-15 [编程]
设计 `Shape` 抽象类,派生 `Circle/Rectangle`,实现 `GetArea()`
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-16 [编程]
实现泛型方法 `Swap<T>(ref T a, ref T b)`
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-17 [编程]
定义一个 `event EventHandler<DataEventArgs>`,在数据变化时触发
**你的作答**
(待填写)
**批改区**
(待批改)
### 核心-18 [编程]
实现一个只读集合包装(对外不可修改,内部可维护)
**你的作答**
(待填写)
**批改区**
(待批改)
---
## 进阶(18题)
### 进阶-1 [选择]
`async/await` 中,`await` 作用是:A. 创建线程 B. 异步等待任务完成 C. 阻塞 UI 线程 D. 强制并行
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-2 [选择]
表示“一个无返回值异步操作”的常用返回类型:A. `void` B. `Task` C. `object` D. `Result`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-3 [选择]
LINQ 中用于投影的操作符:A. `Where` B. `Select` C. `Any` D. `Count`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-4 [选择]
延迟执行是 LINQ 的常见特性之一,以下通常会立即执行的是:A. `Where` B. `Select` C. `ToList` D. `OrderBy`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-5 [选择]
`using` 语句主要用于:A. 导入命名空间 B. 自动释放资源 C. 定义别名 D. 启动任务
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-6 [填空]
声明取消令牌源:`var cts = new ____();`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-7 [填空]
正则匹配常用类型:`System.Text.RegularExpressions.____`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-8 [填空]
线程安全递增可用:`Interlocked.____(ref x);`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-9 [填空]
文件全部文本读取:`File.____(path)`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-10 [代码结果]
写出输出:
```csharp
var nums = new[] {1,2,3,4,5};
var q = nums.Where(x => x % 2 == 1).Select(x => x * x);
Console.WriteLine(string.Join(",", q));
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-11 [代码结果]
判断是否死锁风险并说明一句原因:
```csharp
Task.Run(async () => { await Task.Delay(100); }).Wait();
```
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-12 [简答]
`Task.WhenAll` 与顺序 `await` 的区别
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-13 [简答]
`IEnumerable<T>` 与 `IQueryable<T>` 的核心差异
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-14 [编程]
异步读取文本文件并统计行数,支持取消(`CancellationToken`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-15 [编程]
用 LINQ 完成:给定学生列表,按班级分组后求每组平均分并降序输出
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-16 [编程]
实现一个简单缓存 `MemoryCache<TKey,TValue>`(带过期时间)
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-17 [编程]
写一个扩展方法 `IsNullOrEmptyEx(this string? s)`
**你的作答**
(待填写)
**批改区**
(待批改)
### 进阶-18 [编程]
设计一个可并发调用的计数器类,要求线程安全
**你的作答**
(待填写)
**批改区**
(待批改)