C# 中 Random
類分析
Random
類用于生成偽隨機數,位于 System
命名空間。它的核心機制是基于一個種子值 (seed),通過算法生成看似隨機的數列。相同種子會生成相同的隨機數序列,這在需要可重現的隨機場景中很有用。
核心特點
種子與隨機性
默認構造函數使用當前時間戳作為種子,因此每次運行生成不同序列。
若顯式指定種子(如
new Random(123)
),則生成確定性序列。
Random rnd1 = new Random(1); Random rnd2 = new Random(1); Console.WriteLine(rnd1.Next() == rnd2.Next()); // 輸出 True
線程安全
Random
實例非線程安全,多線程環境需外部同步(如鎖)。推薦每個線程使用獨立的
Random
實例,或使用線程安全的System.Random.Shared
(.NET 6+)。
生成范圍
Next()
:生成 0 到int.MaxValue
之間的整數。Next(int max)
:生成 0 到max-1
之間的整數。Next(int min, int max)
:生成[min, max)
區間的整數(含 min,不含 max)。
浮點數生成
NextDouble()
:生成 0.0 到 1.0 之間的雙精度浮點數(不含 1.0)。
常見問題與優化
問題:短時間內創建多個
Random
實例可能生成相同序列(因時間種子相同)。// 錯誤示例:短時間內創建多個實例 for (int i = 0; i < 3; i++) {Console.WriteLine(new Random().Next(100)); // 可能輸出相同值 }
解決方案:復用單個
Random
實例。Random rnd = new Random(); for (int i = 0; i < 3; i++) {Console.WriteLine(rnd.Next(100)); // 正確輸出不同隨機數 }
高級需求:若需更高質量的隨機數(如密碼學場景),使用
System.Security.Cryptography.RandomNumberGenerator
。
C# 中 DateTime
類分析
DateTime
表示特定的時間點,精度為 100 納秒,存儲為自 0001 年 1 月 1 日以來的 ticks 數。它是值類型(struct
),不可變。
核心特點
三種類型
DateTimeKind.Utc
:協調世界時(如DateTime.UtcNow
)。DateTimeKind.Local
:本地時間(如DateTime.Now
)。DateTimeKind.Unspecified
:未指定時區的時間(默認)。
常用屬性
DateTime now = DateTime.Now; Console.WriteLine(now.Year); ? ? // 年 Console.WriteLine(now.Month); ? ?// 月 Console.WriteLine(now.DayOfWeek); // 星期幾(枚舉)
日期運算
使用
AddDays()
,AddHours()
,AddMonths()
等方法返回新的DateTime
。
DateTime tomorrow = DateTime.Now.AddDays(1);
比較與差值
DateTime a = DateTime.Now; DateTime b = a.AddHours(1); TimeSpan diff = b - a; Console.WriteLine(diff.TotalHours); // 輸出 1
時區處理
本地時間與 UTC:
DateTime local = DateTime.Now; DateTime utc = local.ToUniversalTime(); // 轉換為 UTC
時區轉換
:需使用TimeZoneInfo類(.NET 3.5+)。
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); DateTime chinaTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);
字符串與 DateTime 互轉
解析字符串:
DateTime.Parse("2023-10-01"); ? ? ? // 自動解析 DateTime.ParseExact("20231001", "yyyyMMdd", null); // 指定格式
格式化輸出:
DateTime now = DateTime.Now; Console.WriteLine(now.ToString("yyyy-MM-dd")); // 輸出:2023-10-01 Console.WriteLine(now.ToString("HH:mm:ss")); ? // 輸出:14:30:00
C# 中 String
類分析
String
是引用類型,但具有不可變性(immutable),所有操作都會返回新字符串。它本質是 char
數組的封裝。
核心特點
不可變性
string s = "hello"; s.ToUpper(); // 返回新字符串 "HELLO",原 s 不變
字符串池(String Intern Pool)
相同字面量的字符串共享內存:
string a = "test"; string b = "test"; Console.WriteLine(object.ReferenceEquals(a, b)); // 輸出 True
通過
string.Intern()
手動入池:
string c = string.Intern(new StringBuilder("test").ToString()); Console.WriteLine(object.ReferenceEquals(a, c)); // 輸出 True
常用操作
string s = " Hello, World! "; Console.WriteLine(s.Trim()); ? ? ?// 去除空格 Console.WriteLine(s.Contains("World")); // 檢查包含 Console.WriteLine(s.Substring(7, 5)); ? // 截取 "World"
性能優化
頻繁拼接:使用
StringBuilder
避免創建過多臨時字符串。StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) {sb.Append(i); } string result = sb.ToString(); // 高效拼接
字符串插值:比
string.Format
更簡潔高效。string name = "Alice"; string msg = $"Hello, {name}!"; // 等價于 string.Format("Hello, {0}!", name)
內存注意事項
大字符串的
Substring()
可能導致內存泄漏(.NET Framework 中),.NET Core 已修復。推薦使用
Span<char>
或Memory<char>
處理大字符串切片,避免內存復制。
三者對比總結
類 | 類型 | 核心特性 |
---|---|---|
Random | 引用類型 | 偽隨機數生成器,需注意種子和線程安全問題。 |
DateTime | 值類型 | 不可變,存儲為 ticks,支持時區轉換和格式化。 |
String | 引用類型 | 不可變,支持豐富操作,注意性能優化(如 StringBuilder 和插值)。 |