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;能…