c#中Random類、DateTime類、String類

C# 中 Random 類分析

Random 類用于生成偽隨機數,位于 System 命名空間。它的核心機制是基于一個種子值 (seed),通過算法生成看似隨機的數列。相同種子會生成相同的隨機數序列,這在需要可重現的隨機場景中很有用。

核心特點
  1. 種子與隨機性

    • 默認構造函數使用當前時間戳作為種子,因此每次運行生成不同序列。

    • 若顯式指定種子(如 new Random(123)),則生成確定性序列。

    Random rnd1 = new Random(1);
    Random rnd2 = new Random(1);
    Console.WriteLine(rnd1.Next() == rnd2.Next()); // 輸出 True
  2. 線程安全

    • Random 實例非線程安全,多線程環境需外部同步(如鎖)。

    • 推薦每個線程使用獨立的 Random 實例,或使用線程安全的 System.Random.Shared(.NET 6+)。

  3. 生成范圍

    • Next():生成 0 到 int.MaxValue 之間的整數。

    • Next(int max):生成 0 到 max-1 之間的整數。

    • Next(int min, int max):生成 [min, max) 區間的整數(含 min,不含 max)。

  4. 浮點數生成

    • 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),不可變。

核心特點
  1. 三種類型

    • DateTimeKind.Utc:協調世界時(如 DateTime.UtcNow)。

    • DateTimeKind.Local:本地時間(如 DateTime.Now)。

    • DateTimeKind.Unspecified:未指定時區的時間(默認)。

  2. 常用屬性

    DateTime now = DateTime.Now;
    Console.WriteLine(now.Year); ? ? // 年
    Console.WriteLine(now.Month); ? ?// 月
    Console.WriteLine(now.DayOfWeek); // 星期幾(枚舉)
  3. 日期運算

    • 使用 AddDays(), AddHours(), AddMonths() 等方法返回新的 DateTime

    DateTime tomorrow = DateTime.Now.AddDays(1);
  4. 比較與差值

    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 互轉
  1. 解析字符串

    DateTime.Parse("2023-10-01"); ? ? ? // 自動解析
    DateTime.ParseExact("20231001", "yyyyMMdd", null); // 指定格式
  2. 格式化輸出

    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 數組的封裝。

核心特點
  1. 不可變性

    string s = "hello";
    s.ToUpper(); // 返回新字符串 "HELLO",原 s 不變
  2. 字符串池(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
  3. 常用操作

    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 和插值)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88825.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vscode 下載遠程服務器失敗解決方法

今天在使用 vscode 連接遠程主機時&#xff0c;突然再次遇到這個問題&#xff0c;按照以往的經驗&#xff0c;直接按照這個博主的文章其實就能解決&#xff0c;但是不知道為什么&#xff0c;今天這個方案失效了&#xff0c;然后卸載安裝服務器和本機的vscode什么的也都試過了&a…

【算法】貪心算法:檸檬水找零C++

文章目錄前言題目解析算法原理代碼示例策略證明前言 題目的鏈接&#xff0c;大家可以先試著去做一下再來看一下思路。 860. 檸檬水找零 - 力扣&#xff08;LeetCode&#xff09; 題目解析 首先我們要認真去拿到題目中的關鍵有用信息。 認真的去閱讀題目給的示例&#xff0c;然…

27.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--幣種服務(一)

從本篇文章開始&#xff0c;我們將用兩篇內容詳細介紹幣種服務的實現。幣種服務本身結構較為簡單&#xff0c;核心功能包括內置幣種的初始化、幣種匯率的同步以及匯率的查詢。在本篇中&#xff0c;我們將重點講解如何實現內置幣種的初始化功能&#xff0c;為后續的服務打下基礎…

(2)從零開發 Chrome 插件:實現 API 登錄與本地存儲功能

從零開發 Chrome 插件&#xff1a;實現 API 登錄與本地存儲功能 Chrome 插件作為瀏覽器功能的重要擴展&#xff0c;能極大提升用戶的工作效率。本文將以一個「登錄功能插件」為例&#xff0c;帶你從零構建一個可調用 API 驗證身份、并將用戶信息存儲在本地的 Chrome 插件。 基…

Flink時間窗口詳解

一、引言在大數據流處理的領域中&#xff0c;Flink 的時間窗口是一項極為關鍵的技術&#xff0c;想象一下&#xff0c;你要統計一個電商網站每小時的訂單數量。由于訂單數據是持續不斷產生的&#xff0c;這就形成了一個無界數據流。如果沒有時間窗口的概念&#xff0c;你就需要…

寬帶接入,網線插入電腦的經驗

現在一般家里安裝移動寬帶&#xff0c;都會提供四個千兆接口的光貓路由器&#xff0c;但是要注意了 首先網線的兩端看起來一樣&#xff0c;實際上并不是&#xff0c;如果發現連接不成功&#xff0c;那么就要換一頭重新嘗試&#xff0c; 一般像說什么自動DHCP啊&#xff0c;因為…

crmeb多門店對接拉卡拉支付小程序聚合收銀臺集成全流程詳解

一、商戶注冊與配置??注冊支付平臺賬號??&#xff1a;在拉卡拉開放平臺注冊商戶賬號&#xff08;私信聯系注冊&#xff09;??創建應用??&#xff1a;獲取小程序應用ID(AppID)??配置支付參數??&#xff1a;商戶號(MID)終端號(TID)API密鑰支付回調地址二、配置拉卡拉…

C#將樹圖節點展示到NetronLight圖表中

之前寫過NetronLight開源框架 C#使用開源框架NetronLight繪制流程圖-CSDN博客 我們這里將TreeView樹圖的節點內容展示到NetronLight圖表中&#xff0c;按照樹的層次【深度Level】展示 新建窗體應用程序ShowTreeNodeToDiagram&#xff0c;將默認的Form1重命名為FormShowNode&…

精密模具大深徑比微孔尺寸檢測方案 —— 激光頻率梳 3D 輪廓檢測

引言精密模具中大深徑比微孔&#xff08;深徑比&#xff1e;20:1&#xff0c;孔徑&#xff1c;1mm&#xff09;的尺寸精度直接影響注塑件、電子元件等產品的成型質量。此類微孔具有孔徑小、深度大、表面質量要求高&#xff08;Ra≤0.1μm&#xff09;等特點&#xff0c;傳統檢測…

defer學習指南

一、源頭&#xff1a;早期管理資源&#xff08;如數據庫連接、鎖、文件句柄、網絡連接&#xff09;和狀態清理異常麻煩。 必須在每個可能的返回點&#xff08;return、err、panic&#xff09;手動重復清理代碼&#xff0c;極易遺漏且打斷主要邏輯思路&#xff01;像Java語言雖然…

NLP_知識圖譜_大模型——個人學習記錄

1. 自然語言處理、知識圖譜、對話系統三大技術研究與應用 https://github.com/lihanghang/NLP-Knowledge-Graph 深度學習-自然語言處理(NLP)-知識圖譜&#xff1a;知識圖譜構建流程【本體構建、知識抽取&#xff08;實體抽取、 關系抽取、屬性抽取&#xff09;、知識表示、知…

linux:進程詳解(1)

目錄 ?編輯 1.進程基本概念與基本操作 1.1 概念 1.2 描述進程-PCB 1.2.1PCB的基本概念 1.2.2 task_ struct 1.2.3 查看進程 2.進程狀態 2.1 Linux內核源碼展示 2.2 進程狀態查看 ?編輯 2.3 Z(zombie)-僵?進程 2.4 僵尸進程的危害 2.5 孤兒進程 3.進程優先級 …

碳中和目標下的全球產業鏈重構:深度解析與未來路徑

引言&#xff1a;氣候臨界點與產業鏈的系統性風險2023年&#xff0c;全球平均氣溫較工業化前上升1.2℃&#xff0c;南極冰蓋年消融量達1500億噸&#xff0c;極端天氣事件導致的經濟損失占全球GDP的2.3%。這一系列數據背后&#xff0c;暴露出傳統產業鏈的致命缺陷——其設計邏輯…

FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120轉RGB奇…

新手向:使用Python構建高效的日志處理系統

本文將詳細講解如何使用Python開發一個專業的日志分析工具&#xff0c;能夠自動化處理、分析和可視化各類日志文件&#xff0c;大幅提升運維效率。環境準備開發本工具需要以下環境配置&#xff1a;Python環境&#xff1a;建議Python 3.8或更高版本必要庫&#xff1a;pandas&…

大模型-量化技術

簡介 模型量化是一種重要的模型壓縮技術。其核心目標是在可控精度損失下&#xff0c;將大模型中浮點型權重&#xff08;通常為 float32 等高精度格式&#xff09;近似轉換為低精度離散值表示&#xff08;通常為 int8&#xff09;。 具體而言&#xff0c;該技術通過將模型的權重…

【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時&#xff0c;第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼&#xff0c;但未必真正理解它的原理。 本篇博客將圍繞一個經典函數&#xff1a; char *host_to_ip(const char *hostna…

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時&#xff0c;?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點&#xff1a; ?路徑搜索不精確?&#xff1a;默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中&#xff0c;性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏&#xff0c;還是 goroutine 失控&#xff0c;都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具&#xff0c;就像一把精準的手術刀&#xff0c;能…