
开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载ByteRate是 Humanizer 中专门用于表达传输速率的类型它将一个数据量ByteSize与一个测量时间间隔TimeSpan组合在一起并自动归一化为每秒或每分钟、每小时的速率进行人类可读的格式化例如4 MB/s、15 MB/min。读完本文你将掌握ByteRate的构造方式、三种Humanize重载的用法与参数语义、底层速率换算原理以及它支持的显式单位系统ByteSizeUnitSystem与比较/相等语义。ByteRate 是什么定位与设计目的ByteRate在 Humanizer 的Bytes模块中扮演字节数量 测量间隔的复合角色。官方 API 参考 Humanizer.ByteRate.md 对其定位的表述是Class to hold a ByteSize and a measurement interval, for the purpose of calculating the rate of transfer即保存一个ByteSize字节数量和一个测量间隔用于计算传输速率。它继承自System.Object其完整实现位于 src/Humanizer/Bytes/ByteRate.cs。从源码结构看ByteRate同时实现了三个接口ByteRate.cspublic class ByteRate(ByteSize size, TimeSpan interval) : IComparableByteRate, IEquatableByteRate, IComparable这意味着它不仅能格式化速率文本还能像普通值类型一样参与排序CompareTo、相等比较Equals/GetHashCode可以安全放入SortedSetT、字典键等需要确定性排序的容器。这一点在测试文件 tests/Humanizer.Tests/Bytes/ByteRateTests.cs 中有专门的用例覆盖见下文比较与相等语义一节。创建 ByteRate构造函数与 Per 扩展方法构造函数签名ByteRate的构造函数接受字节数量 测量间隔两个参数public ByteRate(Humanizer.ByteSize size, System.TimeSpan interval);size类型为 ByteSize表示传输的字节数量interval类型为System.TimeSpan表示这些字节所跨越的测量时间间隔。推荐方式Per扩展方法日常使用中更推荐通过ByteSize.Per(TimeSpan)扩展方法创建速率对象它由 ByteSizeExtensions.cs 提供public static ByteRate Per(this ByteSize size, TimeSpan interval) new(size, interval);典型用法using Humanizer; // 直接构造 var rate1 new ByteRate(ByteSize.FromMegabytes(15), TimeSpan.FromSeconds(60)); // 扩展方法更符合直觉的15 MB 每 60 秒读法 var rate2 ByteSize.FromMegabytes(15).Per(TimeSpan.FromSeconds(60));两种写法等价。Per的语义即文档注释所述Turns a quantity of bytes in a given interval into a rate that can be manipulated将给定间隔内的字节数量转换为可操作的速率。两个只读属性Size 与 IntervalByteRate暴露两个只读属性ByteRate.cs属性类型含义SizeByteSizeQuantity of bytes即字节数量IntervalSystem.TimeSpanInterval that bytes were transferred in即字节传输所跨越的时间间隔两者均在构造时通过主构造函数初始化且只读{ get; }因此ByteRate是不可变对象创建后Size与Interval不能再被修改这保证了速率对象在多线程环境下的安全共享。核心方法Humanize 系列重载一Humanize(TimeUnit timeUnit TimeUnit.Second)默认重载返回默认格式的速率字符串public string Humanize(Humanizer.TimeUnit timeUnit Humanizer.TimeUnit.Second);参数timeUnit是计算速率所用的时间单位默认是每秒per second。它内部直接委托给完整重载见 ByteRate.cs。重载二Humanize(string? format, TimeUnit timeUnit TimeUnit.Second, CultureInfo? culture null)完整重载三个参数的含义依据 API 文档与 ByteRate.cs参数类型说明formatstring?用于格式化字节数量的字符串格式传给ByteSize.HumanizetimeUnitTimeUnit计算速率所用的时间单位默认每秒cultureCultureInfo?使用的区域设置若为null则使用当前线程的 UI 文化实现细节如下public string Humanize(string? format, TimeUnit timeUnit TimeUnit.Second, CultureInfo? culture null) { var displayInterval timeUnit switch { TimeUnit.Second TimeSpan.FromSeconds(1), TimeUnit.Minute TimeSpan.FromMinutes(1), TimeUnit.Hour TimeSpan.FromHours(1), _ throw new NotSupportedException(timeUnit must be Second, Minute, or Hour), }; return new ByteSize(Size.Bytes / Interval.TotalSeconds * displayInterval.TotalSeconds) .Humanize(format, culture) / timeUnit.ToSymbol(culture); }从源码可以提炼出两条关键原理归一化换算无论测量间隔是 0.1 秒还是 60 秒内部一律先算出字节/秒Size.Bytes / Interval.TotalSeconds再乘以目标展示单位对应的秒数1 秒 / 60 秒 / 3600 秒得到该展示单位下的等效字节数交给ByteSize.Humanize选择最合适的单位如 KB、MB、GB并格式化。时间单位限制只支持Second、Minute、Hour三种TimeUnit。传入其他枚举值如Millisecond、Day、Week、Month、Year会抛出NotSupportedException。TimeUnit枚举定义见 src/Humanizer/Localisation/TimeUnit.cs。符号拼接结果由字节数量文本 / 时间单位符号拼接而成。时间符号通过 TimeUnitToSymbolExtensions.cs 的ToSymbol扩展方法获得Second→s、Minute→min、Hour→h并支持按culture本地化。覆盖默认输出ToStringToString()直接返回Humanize()的结果ByteRate.cs因此把一个速率对象直接放进字符串插值或日志输出就会得到默认每秒格式的可读文本。测试 ByteRateTests.cs 验证了400 B每秒的速率ToString()结果为400 B/s。实战验证测试用例给出的输出行为以下是测试文件 tests/Humanizer.Tests/Bytes/ByteRateTests.cs 中用[UseCulture(en)]固定英语文化后的真实行为可以直接作为使用预期默认格式每秒输入字节间隔秒期望输出4001400 B/s4 × 102414 KB/s4 × 1024 × 102414 MB/s4 × 2 × 1024 × 102424 MB/s8 MB 在 2 秒内 → 4 MB/s4 × 10240.140 KB/s跨间隔归一化15 × 60 × 1024 × 10246015 MB/s900 MB 在 60 秒内注意最后一例测量间隔为 60 秒但默认展示单位是每秒因此 900 MB/60s 被归一化回 15 MB/s。指定时间单位输入MB测量间隔秒展示单位期望输出11Second1 MB/s160Minute1 MB/min13600Hour1 MB/h110Second102.4 KB/s可见timeUnit决定的是展示口径1 MB 在 10 秒内归一化后为 102.4 KB/秒输出102.4 KB/s。格式化参数输入字节间隔秒展示单位format期望输出198546519841Secondnull18.49 GB/s198546519841Second#.##18.49 GB/sformat直接透传给ByteSize.Humanize因此支持标准 .NET 数值格式字符串如0.##、#.##用来控制字节数值的小数位精度。显式单位系统HumanizeWithUnitSystem除两个Humanize重载外当前源码还提供了HumanizeWithUnitSystem方法ByteRate.cs用于在输出速率时显式选择字节单位体系public string HumanizeWithUnitSystem( ByteSizeUnitSystem unitSystem, string? format null, TimeUnit timeUnit TimeUnit.Second, CultureInfo? culture null)ByteSizeUnitSystem枚举定义于 src/Humanizer/Bytes/ByteSizeUnitSystem.cs有三个取值值说明Legacy 0Humanizer 传统混合单位KBTB 为二进制1024 进制PB/EB 为十进制1000 进制DecimalSi 1十进制 SI 单位相邻单位相差 1000 倍如 kB、MB、GBBinaryIec 2二进制 IEC 单位相邻单位相差 1024 倍如 KiB、MiB、GiB行为要点依据 ByteRate.cs 与 XML 文档注释传入Legacy时直接回退到Humanize(format, timeUnit, culture)保持既有行为传入DecimalSi/BinaryIec时会先做间隔归一化ScaleForExplicitUnitSystem再调用ByteSize.HumanizeWithUnitSystem按指定体系格式化最后同样拼接/与时间符号在显式体系下带 SI/IEC 前缀的单位 token 匹配不区分大小写但bbit与Bbyte依然严格区分大小写输出使用规范符号大小写。测试 ByteRateTests.cs 覆盖了精确位级缩放的场景例如9007199254740993 b在 1 秒内输出9007199254740993 b/s、在 2 秒内输出4503599627370497 b/s带符号的有理数向上取整以及Interval.Ticks 0或字节/位不精确对应时的 Legacy 回退行为。这些测试说明在DecimalSi/BinaryIec下ByteRate会尽量保持位级精度的整数缩放避免浮点误差。比较与相等语义按每秒字节数归一化ByteRate的比较与相等判断并不直接比较Size或Interval而是比较归一化后的每秒字节数BytesPerSecond见 ByteRate.csdouble BytesPerSecond Size.Bytes / Interval.TotalSeconds;由此带来几个值得注意的行为均有测试佐证见 ByteRateTests.cs跨间隔可比400 B / 10s与800 B / 20s都归一化为 40 B/s因此CompareTo返回 0、Equals为真、GetHashCode相等测试ComparesNormalizedRates与EqualsNormalizedRates。区分运行时类型Equals要求other?.GetType() GetType()ByteRate.cs即只有运行时类型完全相同的实例才可能相等子类实例即使速率相同也不相等且SortedSetByteRate会将其视为两个不同元素测试EqualityAndComparisonDistinguishRuntimeTypes。非 ByteRate 对象CompareTo(object?)对null返回 1对非ByteRate类型抛出ArgumentException测试UntypedComparisonRejectsOtherTypes。这意味着你可以把速率对象放入SortedSetByteRate按速率大小自动排序也可以直接作为字典键使用。使用注意事项结合 scenarios/byte-sizes-and-rates.mdx 的指引与源码实现实际使用时应注意测量间隔应为正、非零Size.Bytes / Interval.TotalSeconds是核心归一化公式若Interval为TimeSpan.Zero会出现除零语义问题。显式单位系统路径在Interval.Ticks 0时会回退到浮点字节换算ByteRate.cs但业务上仍应构造正间隔。时间单位仅限秒/分/时Humanize与HumanizeWithUnitSystem只接受Second、Minute、Hour其他TimeUnit值抛NotSupportedException。单位进制默认是二进制Humanizer 的KB、MB、GB、TB使用 1024 进制即 KiB、MiB 等含义并非 SI 十进制单位需要十进制输出时应使用HumanizeWithUnitSystem(ByteSizeUnitSystem.DecimalSi, ...)。b与B大小写敏感小写b表示位bit大写B表示字节byte其他单位后缀不区分大小写。格式化输出不是序列化契约Humanize的结果是给人看的展示文本跨版本可能变化应始终以ByteSize/ByteRate对象作为模型值参与计算与存储。延伸阅读ByteRate API 参考当前版本ByteSizeExtensions API含 Per 与 Humanize 系列扩展方法ByteRate 源码实现ByteSize.Per 扩展方法定义ByteRate 测试用例字节大小与传输速率场景指南赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Humanizer ByteRate 使用指南基于 ByteSize 与时间间隔的传输速率计算与格式化Humanizer ByteRate 使用指南基于 ByteSize 与时间间隔的传输速率计算与格式化 导读 在处理下载进度、网络吞吐、文件复制耗时等场景时开发工具Humanizer ByteRate 全解析在 .NET 中用 ByteSize 与 TimeSpan 计算和格式化传输速率Humanizer ByteRate 全解析在 .NET 中用 ByteSize 与 TimeSpan 计算和格式化传输速率 ByteRate 是 Human开发工具Humanizer ByteRate 使用指南在 .NET 中计算与格式化数据传输速率Humanizer ByteRate 使用指南在 .NET 中计算与格式化数据传输速率 本篇指南以 Humanizer 2.14.1 文档中的 ByteRat开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考