Skip to content

style: idiomatic cleanups in small metadata/storage utility files - #414

Merged
twcclegg merged 2 commits into
mainfrom
style/core-small-utilities
Aug 26, 2026
Merged

style: idiomatic cleanups in small metadata/storage utility files#414
twcclegg merged 2 commits into
mainfrom
style/core-small-utilities

Conversation

@twcclegg

Copy link
Copy Markdown
Owner

Summary

Part of an ongoing sweep applying idiomatic-C# readability cleanups across the codebase (same spirit as #409): pattern matching (is null/is not null), dropping Yoda conditions, expression-bodied trivial members. No behavior change, no Java-parity changes — same logic, nicer expression.

Files touched: AreaCodeMapStorageStrategy.cs, DefaultMapStorage.cs, FlyweightMapStorage.cs, LeniencyExtensions.cs, LocaleData.cs, LocaleNames.cs, MetadataLoader.cs, MetadataManager.cs, MetadataSource.cs, PhoneNumberMatch.cs, TimezoneMapDataReader.cs.

(Util.cs, RegexCache.cs, MissingMetadataException.cs, PhoneNumberFormat.cs, PhoneNumberType.cs, InternalRegexOptions.cs, PhoneRegex.cs, NumberParseException.cs, BuildPrefixMapFromBin.cs were reviewed and left untouched — already idiomatic.)

Test plan

  • dotnet build csharp/PhoneNumbers.slnx — clean, 0 warnings (repo has TreatWarningsAsErrors)
  • dotnet test csharp/PhoneNumbers.Test — 414/414 passing on net8.0 and net10.0

is-null patterns, ??-style null checks, drop Yoda conditions, and
expression-bodied trivial accessors across the smaller PhoneNumbers/
support files. No behavior change.
@codecov

codecov Bot commented Aug 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.87879% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 87.38%. Comparing base (e75ae83) to head (bdd3894).
⚠️ Report is 6 commits behind head on main.

Files with missing lines Patch % Lines
csharp/PhoneNumbers/PhoneNumberMatch.cs 57.14% 1 Missing and 2 partials ⚠️
csharp/PhoneNumbers/LocaleNames.cs 50.00% 0 Missing and 1 partial ⚠️

❌ Your patch check has failed because the patch coverage (87.87%) is below the target coverage (90.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #414      +/-   ##
==========================================
- Coverage   87.42%   87.38%   -0.04%     
==========================================
  Files          41       41              
  Lines        3856     3852       -4     
  Branches      990      992       +2     
==========================================
- Hits         3371     3366       -5     
  Misses        283      283              
- Partials      202      203       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread csharp/PhoneNumbers/PhoneNumberMatch.cs Fixed
@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

📊 Benchmark Results

Commit: bdd3894 · Full run · Linux ubuntu-24.04-arm

Both sides were measured on the same runner in the same job, so the numbers are
comparable. Treat sub-percent differences as noise.

PR branch

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
InputDigitPerKeystroke 1000 4.649 ms 0.0400 ms 0.0355 ms 54.6875 3.88 MB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]     : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  Job-AMQORM : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Runtime=.NET 10.0  InvocationCount=1  IterationCount=20  
LaunchCount=1  RunStrategy=ColdStart  UnrollFactor=1  
WarmupCount=1  

Method Mean Error StdDev Allocated
CreateInstance 425.7 μs 136.5 μs 157.1 μs 119.48 KB
CreateInstanceAndLoadAllRegions 7,135.9 μs 434.3 μs 500.2 μs 1620.34 KB
FirstRegionLookup 466.0 μs 154.9 μs 178.4 μs 124.54 KB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
ExtractPossibleNumber_CleanInput 1000 21.60 μs 0.014 μs 0.012 μs - -
ExtractPossibleNumber_WithLeadingJunk 1000 38.47 μs 0.057 μs 0.051 μs 0.6714 48360 B

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
FindNumbers_Valid 100 143.4 μs 0.21 μs 0.18 μs 0.9766 70.71 KB
FindNumbers_StrictGrouping 100 319.9 μs 0.80 μs 0.67 μs 1.4648 124.84 KB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
GetDescriptionForNumber 1000 1,458.95 μs 5.302 μs 4.960 μs 1.9531 196.59 KB
GetDisplayCountry 1000 18.60 μs 0.037 μs 0.031 μs 0.0916 7.56 KB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
ParseValidateAndFormatPhoneNumbers 1000 2,925.1 μs 58.08 μs 64.56 μs 7.8125 577.71 KB
ParseOnly 1000 440.4 μs 0.62 μs 0.58 μs 4.8828 348.13 KB
ParseNationalFormat 1000 775.3 μs 1.52 μs 1.27 μs 5.8594 431.36 KB
ParseWithExtension 1000 1,125.3 μs 1.92 μs 1.70 μs 13.6719 957.38 KB
ValidateOnly 1000 774.8 μs 3.52 μs 3.29 μs - 41.11 KB
FormatOnly 1000 1,082.5 μs 2.53 μs 2.24 μs 1.9531 187.91 KB
PR base

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
InputDigitPerKeystroke 1000 4.951 ms 0.0617 ms 0.0547 ms 54.6875 3.88 MB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]     : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  Job-AMQORM : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Runtime=.NET 10.0  InvocationCount=1  IterationCount=20  
LaunchCount=1  RunStrategy=ColdStart  UnrollFactor=1  
WarmupCount=1  

Method Mean Error StdDev Allocated
CreateInstance 427.9 μs 123.9 μs 142.7 μs 119.48 KB
CreateInstanceAndLoadAllRegions 7,177.9 μs 462.8 μs 532.9 μs 1620.34 KB
FirstRegionLookup 485.7 μs 175.4 μs 202.0 μs 124.54 KB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
ExtractPossibleNumber_CleanInput 1000 21.63 μs 0.018 μs 0.016 μs - -
ExtractPossibleNumber_WithLeadingJunk 1000 38.65 μs 0.092 μs 0.077 μs 0.6714 48360 B

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
FindNumbers_Valid 100 143.3 μs 0.44 μs 0.37 μs 0.9766 70.71 KB
FindNumbers_StrictGrouping 100 316.4 μs 1.24 μs 1.03 μs 1.4648 124.84 KB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
GetDescriptionForNumber 1000 1,461.75 μs 10.692 μs 10.001 μs 1.9531 196.59 KB
GetDisplayCountry 1000 18.61 μs 0.042 μs 0.038 μs 0.0916 7.56 KB

BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
Neoverse-N2, 4 physical cores
.NET SDK 10.0.400
  [Host]    : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a
  .NET 10.0 : .NET 10.0.11 (10.0.11, 10.0.1126.37416), Arm64 RyuJIT armv8.0-a

Job=.NET 10.0  Runtime=.NET 10.0  

Method PhoneNumberCount Mean Error StdDev Gen0 Allocated
ParseValidateAndFormatPhoneNumbers 1000 3,343.9 μs 116.78 μs 344.32 μs 7.8125 577.71 KB
ParseOnly 1000 438.8 μs 0.76 μs 0.71 μs 4.8828 348.13 KB
ParseNationalFormat 1000 779.0 μs 1.68 μs 1.49 μs 5.8594 431.36 KB
ParseWithExtension 1000 1,126.6 μs 1.20 μs 1.06 μs 13.6719 957.38 KB
ValidateOnly 1000 747.8 μs 10.46 μs 9.78 μs - 41.11 KB
FormatOnly 1000 1,098.7 μs 2.90 μs 2.72 μs 1.9531 187.92 KB

CodeQL (cs/equals-uses-as) flagged the "is" type check in Equals: it
treats any subclass as a match, which can break Equals' symmetry
contract if a subclass adds its own comparable state. Switch to a
strict GetType() check, matching the standard fix for this pattern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@twcclegg
twcclegg merged commit dd1629d into main Aug 26, 2026
7 of 8 checks passed
@twcclegg
twcclegg deleted the style/core-small-utilities branch August 26, 2026 14:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants