返回题库高级 .NET 刷题C# 选择题 · 第 30 / 50 篇

C# 试题 30:日期时间、Guid 与 Random

0581 以下代码输出什么?

难度: 实战

var a = new DateTime(2026, 8, 1, 12, 0, 0, DateTimeKind.Utc);
var b = new DateTime(2026, 8, 1, 12, 0, 0, DateTimeKind.Local);

Console.WriteLine(a == b);
  • A. TrueDateTime== 只比较 Ticks,忽略 Kind
  • B. FalseKind 不同导致比较结果不同
  • C. 编译失败,DateTime 不能比较
  • D. 运行抛 ArgumentException
查看答案与解析

正确答案A

解析: DateTime 的相等运算符只比较内部 Ticks,Kind(Utc/Local/Unspecified)不参与比较,因此两个同一时刻、不同 Kind 的 DateTime 相等。

关键点: 认为 Kind 影响相等性是资深开发者最常见的 DateTime 误区之一。

0582 以下代码输出什么?

难度: 进阶

var a = new DateTimeOffset(2026, 8, 1, 8, 0, 0, TimeSpan.FromHours(8));
var b = new DateTimeOffset(2026, 8, 1, 0, 0, 0, TimeSpan.Zero);

Console.WriteLine(a == b);
Console.WriteLine(a.EqualsExact(b));
  • A. True / True
  • B. True / False== 按 UTC 时刻比较,EqualsExact 还要求偏移一致
  • C. False / True
  • D. False / False
查看答案与解析

正确答案B

解析: DateTimeOffset==<> 都基于 UtcTicks2026-08-01 08:00+08:002026-08-01 00:00+00:00 是同一个绝对时刻,所以 ==TrueEqualsExact 额外比较 Offset,偏移不同返回 False

关键点: 偏移不同不代表时刻不同;需要“连偏移也一致”时用 EqualsExact

0583 以下代码输出什么?

难度: 实战

DateTimeOffset utc = DateTimeOffset.UtcNow;

Console.WriteLine(utc.DateTime.Kind == DateTimeKind.Utc);
Console.WriteLine(utc.UtcDateTime.Kind == DateTimeKind.Utc);
  • A. True / True
  • B. False / False
  • C. False / TrueDateTime 属性返回 Kind 为 Unspecified 的 DateTime
  • D. True / False
查看答案与解析

正确答案C

解析: DateTimeOffset.DateTime 返回的 DateTimeKind 永远是 Unspecified,即使偏移为零;只有 UtcDateTime(Kind=Utc)和 LocalDateTime(Kind=Local)带明确语义。把 .DateTime 直接当 UTC 用是典型陷阱。

关键点: .DateTime.UtcDateTime.LocalDateTime 三者 Kind 语义不同。

0584 以下代码输出什么?

难度: 进阶

var dto = DateTimeOffset.FromUnixTimeSeconds(0);

Console.WriteLine(dto.Offset == TimeSpan.Zero);
Console.WriteLine(dto.UtcDateTime.Year);
  • A. False / 1970
  • B. True / 1,Unix 时间从 0001-01-01 起算
  • C. False / 1970
  • D. True / 1970,Unix 时间戳返回偏移为零的 UTC 表示
查看答案与解析

正确答案D

解析: FromUnixTimeSeconds(0) 对应 1970-01-01T00:00:00+00:00OffsetTimeSpan.Zero,UTC 年份为 1970。

关键点: Unix 时间戳的 0 点是 1970-01-01 UTC,返回的 DateTimeOffset 偏移为零。

0585 以下代码输出什么?

难度: 进阶

var d = new DateTime(2026, 8, 1, 12, 0, 0);
var utc = DateTime.SpecifyKind(d, DateTimeKind.Utc);

Console.WriteLine(d.Kind == DateTimeKind.Unspecified);
Console.WriteLine(utc.Ticks == d.Ticks);
  • A. True / True,默认 Kind 是 Unspecified,SpecifyKind 只改 Kind 不改 Ticks
  • B. True / False
  • C. False / True
  • D. False / False
查看答案与解析

正确答案A

解析: new DateTime(...)Kind 默认是 UnspecifiedDateTime.SpecifyKind 只替换 Kind 标记,不移动任何刻度,因此 Ticks 不变。很多人误以为 SpecifyKind 会“换算”成 UTC。

关键点: SpecifyKind 是改标签,不是换算时刻。

0586 以下代码输出什么?

难度: 实战

var a = new Guid("10000000-0000-0000-0000-000000000000");
var b = new Guid("00000001-0000-0000-0000-000000000000");

Console.WriteLine(a.CompareTo(b));
  • A. -1
  • B. 0
  • C. 1
  • D. 抛 FormatException
查看答案与解析

正确答案C

解析: Guid.CompareTo 按内部字段顺序比较:先比第一组 4 字节的数值,再比两组 UInt16,最后逐字节比后 8 字节。"10000000" 组数值 0x10000000 大于 "00000001" 组的 0x00000001,返回 1。按字符串序或把首组按小端字节解释都会得出相反结论。

关键点: Guid 的比较不是字符串序,也不是内存字节的小端序。

0587 关于时间数据的持久化存储,哪项做法最稳妥?

难度: 实战

  • A. 一律存本地时间,展示时不再转换
  • B. 存储 UTC 或带偏移的 DateTimeOffset,只在展示层转换到目标时区
  • C. 用 DateTime.Now 写入数据库并依赖服务器时区
  • D. 存 Unix 毫秒数但不记录时区
查看答案与解析

正确答案B

解析: 存储端用 UTC(或保留偏移的 DateTimeOffset)能让绝对时刻无歧义,展示层按用户时区转换;存本地时间且不记录偏移,跨时区或夏令时迁移后无法还原正确时刻。

关键点: 存储面向“时刻”,展示面向“本地时间”,两者之间必须显式转换。

0588 以下代码输出什么?

难度: 进阶

var r1 = new Random(2026);
var r2 = new Random(2026);

Console.WriteLine(r1.Next() == r2.Next());
  • A. False,每次调用 Next 结果都不同
  • B. 编译失败
  • C. 运行结果不确定
  • D. True,相同种子产生完全相同的序列
查看答案与解析

正确答案D

解析: Random 是确定性伪随机生成器:相同种子、相同算法产生相同序列,因此两个 Random(2026) 的首次 Next() 相等。种子常用于可复现测试。

关键点: 固定种子 = 可复现序列;这不是 bug,而是特性。

0589 以下代码输出什么?

难度: 实战

var r = new Random();

Console.WriteLine(r.Next(5, 5));
  • A. 抛 ArgumentOutOfRangeException
  • B. 0
  • C. 5,区间 [min, max) 为空时返回 minValue
  • D. 结果不确定
查看答案与解析

正确答案C

解析: Next(minValue, maxValue) 返回 [minValue, maxValue) 内的值;min == max 时区间为空,实现按 Sample() * range + min 计算,range == 0 直接返回 minValue(5)。只有 min > max 才抛 ArgumentOutOfRangeException

关键点: 边界相等合法且返回下界,上界超下界才抛异常。

0590 以下代码输出什么?

难度: 进阶

var sw = Stopwatch.StartNew();
Thread.Sleep(50);

Console.WriteLine(sw.ElapsedMilliseconds >= 50);
  • A. False,Sleep 不保证时长
  • B. True,Stopwatch 基于单调计时源测量
  • C. 运行抛异常
  • D. 取决于系统时钟是否被 NTP 调整
查看答案与解析

正确答案B

解析: Stopwatch 默认使用高分辨率单调计时源(Stopwatch.IsHighResolution 为 true 时基于 QueryPerformanceCounter),不受系统时钟调整影响;Thread.Sleep(50) 至少睡 50ms,因此耗时不小于 50。

关键点: 测耗时用 Stopwatch,别用 DateTime.Now 相减。

0591 以下代码输出什么?

难度: 进阶

int start = int.MaxValue - 1000;   // 模拟 TickCount 接近回绕点
int now = int.MinValue + 499;      // 模拟 TickCount 已回绕

Console.WriteLine(now - start);
  • A. 抛 OverflowException
  • B. -4294965796
  • C. 结果不确定
  • D. 1500,int 回绕运算在模 2³² 下恰好得到经过的毫秒数
查看答案与解析

正确答案D

解析: Environment.TickCount 是 int,每约 24.9 天回绕一次。只要经过时间小于 2³¹ 毫秒,now - start 在 unchecked 回绕下(模 2³²)仍正确给出经过毫秒数;反过来,用 now > start + timeout 判断超时在回绕时必然出错。

关键点: TickCount 相减跨回绕仍正确,直接比较则错。

0592 测量一段代码耗时,为什么推荐 Stopwatch 而不是 DateTime.Now 相减?

难度: 实战

  • A. DateTime.Now 依赖系统时钟,可能被 NTP 或手动调表改变导致耗时失真;Stopwatch 使用单调递增的计时源
  • B. DateTime.Now 的精度只有秒
  • C. Stopwatch 返回的是 CPU 周期数而不是时间
  • D. DateTime.Now 是线程不安全的
查看答案与解析

正确答案A

解析: DateTime.Now 读取的是墙上时钟,可能被 NTP 校准、夏令时或手动改时间前后调整,导致“结束减开始”出现负值或失真;Stopwatch 基于单调计时源,只度量真实经过时间。

关键点: 经过时间用单调钟,业务截止时间才用墙上钟。

0593 以下代码输出什么?

难度: 进阶

var a = new DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero);
var b = new DateTimeOffset(2025, 12, 31, 19, 0, 0, TimeSpan.FromHours(-5));

Console.WriteLine(a == b);
  • A. False,偏移不同就不相等
  • B. 编译失败
  • C. True== 比较的是 UTC 时刻
  • D. 抛 ArgumentException
查看答案与解析

正确答案C

解析:b 换算成 UTC:2025-12-31 19:00 - (-05:00)2025-12-31 19:00 + 5 小时 = 2026-01-01 00:00,与 a 的 UTC 时刻相同,==True

关键点: 负偏移同样参与 UTC 换算,比较时只看绝对时刻。

0594 多个线程并发调用同一个 Random 实例,会发生什么?

难度: 实战

Random shared = new Random();

Parallel.For(0, 100_000, _ => shared.Next());
  • A. 必然抛 AggregateException
  • B. 通常不抛异常,但内部状态存在数据竞争,可能返回重复或错误的值;应改用 Random.Shared
  • C. 编译失败,Random 不能跨线程使用
  • D. 结果完全可靠
查看答案与解析

正确答案B

解析: System.Random 不是线程安全的,内部种子状态被并发读写属于数据竞争,行为未定义(可能出现重复值、0 等),但不保证抛异常。Random.Shared 是官方提供的线程安全共享实例。

关键点: 跨线程共享 Random 实例是经典 bug;用 Random.Shared 或每线程实例。

0595 以下代码输出什么?

难度: 进阶

Guid g = Guid.NewGuid();

Console.WriteLine(g.ToString("N").Length);
Console.WriteLine(g.ToString("D").Length);
  • A. 36 / 36
  • B. 32 / 36,“N” 去掉连字符,“D” 保留连字符
  • C. 32 / 32
  • D. 38 / 36
查看答案与解析

正确答案B

解析: "D" 是默认格式:32 个十六进制字符加 4 个连字符,共 36;"N" 去掉全部连字符为 32。

关键点: 存储时用 "N" 更紧凑,解析时两种格式都能被 Guid.Parse 识别。

0596 以下代码输出什么?

难度: 进阶

Random a = Random.Shared;
Random b = Random.Shared;

Console.WriteLine(ReferenceEquals(a, b));
  • A. True,Shared 是全局共享的单个线程安全实例
  • B. False,每次访问都是新实例
  • C. 编译失败
  • D. 抛 NullReferenceException
查看答案与解析

正确答案A

解析: Random.Shared 返回同一个进程级共享实例(.NET 6+),内部使用线程安全实现,可被任意线程并发调用;与 new Random() 每实例各自有状态不同。

关键点: Shared 是“一个线程安全的共享实例”,不是“每线程一个实例”。

0597 以下代码输出什么?

难度: 实战

var dto = new DateTimeOffset(2026, 8, 1, 20, 30, 0, TimeSpan.FromHours(8));

Console.WriteLine(dto.ToUniversalTime().Hour);
Console.WriteLine(dto.UtcDateTime.Hour);
  • A. 20 / 20
  • B. 20 / 12
  • C. 12 / 12
  • D. 12 / 20
查看答案与解析

正确答案C

解析: 20:30 加 +08:00 偏移,换算成 UTC 是 12:30,两种写法都得到同一个绝对时刻,Hour 都是 12。

关键点: ToUniversalTime 与 UtcDateTime 是同一时刻的两种取法,不要重复加/减偏移。

0598 需要记录用户操作的本地时间,并希望后续能还原绝对时刻与原始偏移,应选哪种类型?

难度: 实战

  • A. DateTimeOffset,同时保存时刻与偏移,比较按 UTC 进行
  • B. DateTime(Kind = Local)
  • C. DateTime(Kind = Unspecified)
  • D. TimeOnly
查看答案与解析

正确答案A

解析: DateTimeOffset 把“绝对时刻 + 当时偏移”作为一个值保存,跨时区还原时既能得到 UTC 也能得到原偏移;Kind 只是标签,不携带偏移信息,无法还原“用户当时看到的本地时间”。

关键点: 要往返保留“偏移”就选 DateTimeOffset,DateTime 存不了偏移。

0599 以下代码输出什么?

难度: 进阶

var sw = Stopwatch.StartNew();
Thread.Sleep(20);
sw.Restart();
Thread.Sleep(20);

Console.WriteLine(sw.ElapsedMilliseconds >= 20);
  • A. False,Restart 不会清零
  • B. True,Restart 把已耗时为 0 并重新计时
  • C. 编译失败
  • D. 抛 InvalidOperationException
查看答案与解析

正确答案B

解析: Stopwatch.Restart() 等价于先 Reset()Start():清零已耗时并从当前时刻重新计时,因此第二次 Sleep(20) 后 ElapsedMilliseconds 至少 20。

关键点: 复用时用 Restart 而非 StartNew 再赋值的惯用法。

0600 以下代码输出什么?

难度: 实战

Guid a = new Guid("00000000-0000-0000-0000-000000000001");
Guid b = new Guid("00000000-0000-0000-0000-000000000001");

Console.WriteLine(a == b);
  • A. False,结构体没有定义 ==
  • B. False,比较的是引用
  • C. 编译失败
  • D. True,Guid 是值类型,== 按 16 字节内容比较
查看答案与解析

正确答案D

解析: Guid 是结构体,== 由框架定义,按 16 字节内容逐字节比较;字符串表示完全相同的两个 Guid 必然相等。

关键点: 值类型的相等是“内容相等”,Guid 的 ==Equals 语义一致。

官方资料

当前分类

C# 选择题

查看全部分类 →
  1. 28C# 试题 28:LINQ 分组与连接20 题
  2. 29C# 试题 29:迭代器与异步流20 题
  3. 30C# 试题 30:日期时间、Guid 与 Random20 题
  4. 31C# 试题 31:文件与流20 题
  5. 32C# 试题 32:释放模式与终结器20 题
ESC

输入关键词开始搜索