Skip to content

style: minor idiomatic cleanups in protobuf-style data model classes - #415

Merged
twcclegg merged 1 commit into
mainfrom
style/data-model-classes
Aug 26, 2026
Merged

style: minor idiomatic cleanups in protobuf-style data model classes#415
twcclegg merged 1 commit into
mainfrom
style/data-model-classes

Conversation

@twcclegg

Copy link
Copy Markdown
Owner

Summary

Part of an ongoing sweep applying idiomatic-C# readability cleanups (same spirit as #409) across the codebase.

Phonemetadata.cs, PhoneNumberDesc.cs, NumberFormat.cs, and PhoneMetadataCollection.cs are hand-ported equivalents of Java's protobuf-generated message classes — #nullable disable, [GeneratedCode], a rigid Builder pattern. Deliberately left the Builder/protobuf-mirroring structure untouched here (no records, no init-only properties, no restructuring) since that would fight the intentional generated-code parity and make future re-generation/comparison harder.

Only trivial, purely local idioms applied:

  • == null / != null guard clauses → is null / is not null (mechanical, ~75 occurrences across the four files)
  • var other = obj as T; if (other == null) return false;if (obj is not T other) return false; in the four Equals(object) overrides (same pattern already used for MetadataFilter.Equals in style: small idiomatic-C# cleanups (no behavior change) #409)

No behavior change.

Test plan

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

Convert `== null`/`!= null` guard clauses and `x as T; if (x == null)`
casts to `is null`/`is not T x` pattern matching in PhoneNumberDesc,
NumberFormat, PhoneMetadataCollection, and Phonemetadata. Purely local,
behavior-preserving idiom swaps — the Builder/protobuf-mirroring
structure of these hand-ported message classes is untouched.
@codecov

codecov Bot commented Aug 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 33.33333% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 87.43%. Comparing base (e75ae83) to head (7ff33e7).

Files with missing lines Patch % Lines
csharp/PhoneNumbers/NumberFormat.cs 0.00% 0 Missing and 1 partial ⚠️
csharp/PhoneNumbers/PhoneMetadataCollection.cs 0.00% 1 Missing ⚠️
csharp/PhoneNumbers/PhoneNumberDesc.cs 66.66% 0 Missing and 1 partial ⚠️
csharp/PhoneNumbers/Phonemetadata.cs 0.00% 0 Missing and 1 partial ⚠️

❌ Your patch check has failed because the patch coverage (33.33%) 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     #415      +/-   ##
==========================================
+ Coverage   87.42%   87.43%   +0.01%     
==========================================
  Files          41       41              
  Lines        3856     3853       -3     
  Branches      990      991       +1     
==========================================
- Hits         3371     3369       -2     
+ Misses        283      282       -1     
  Partials      202      202              

☔ 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.

@github-actions

Copy link
Copy Markdown

📊 Benchmark Results

Commit: 7ff33e7 · 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.282 ms 0.0074 ms 0.0066 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 391.7 μs 108.3 μs 124.7 μs 119.48 KB
CreateInstanceAndLoadAllRegions 7,004.6 μs 363.5 μs 418.7 μs 1620.34 KB
FirstRegionLookup 441.3 μs 129.1 μs 148.7 μ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.028 μs 0.026 μs - -
ExtractPossibleNumber_WithLeadingJunk 1000 38.07 μs 0.107 μs 0.100 μ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 141.1 μs 0.36 μs 0.34 μs 0.9766 70.71 KB
FindNumbers_StrictGrouping 100 325.7 μs 0.64 μs 0.57 μ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,375.18 μs 2.102 μs 1.755 μs 1.9531 196.59 KB
GetDisplayCountry 1000 18.47 μs 0.026 μs 0.023 μ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,485.1 μs 4.05 μs 3.38 μs 7.8125 577.71 KB
ParseOnly 1000 433.0 μs 0.31 μs 0.26 μs 4.8828 348.13 KB
ParseNationalFormat 1000 771.9 μs 1.82 μs 1.70 μs 5.8594 431.36 KB
ParseWithExtension 1000 1,104.3 μs 1.99 μs 1.55 μs 13.6719 957.38 KB
ValidateOnly 1000 718.9 μs 1.50 μs 1.33 μs - 41.11 KB
FormatOnly 1000 1,085.5 μs 2.00 μs 1.87 μs 1.9531 187.92 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.286 ms 0.0096 ms 0.0090 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 398.6 μs 98.43 μs 113.4 μs 119.48 KB
CreateInstanceAndLoadAllRegions 7,053.9 μs 375.15 μs 432.0 μs 1620.34 KB
FirstRegionLookup 435.5 μs 131.10 μs 151.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 20.90 μs 0.021 μs 0.019 μs - -
ExtractPossibleNumber_WithLeadingJunk 1000 38.24 μs 0.061 μs 0.054 μ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 144.1 μs 0.30 μs 0.28 μs 0.9766 70.71 KB
FindNumbers_StrictGrouping 100 316.7 μs 0.71 μs 0.63 μ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,359.57 μs 2.630 μs 2.332 μs 1.9531 196.59 KB
GetDisplayCountry 1000 18.51 μs 0.019 μs 0.017 μ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 Median Gen0 Allocated
ParseValidateAndFormatPhoneNumbers 1000 2,549.3 μs 6.04 μs 5.65 μs 2,546.7 μs 7.8125 577.71 KB
ParseOnly 1000 438.5 μs 0.43 μs 0.39 μs 438.5 μs 4.8828 348.13 KB
ParseNationalFormat 1000 777.3 μs 1.35 μs 1.26 μs 777.0 μs 5.8594 431.36 KB
ParseWithExtension 1000 1,112.7 μs 2.12 μs 1.88 μs 1,112.4 μs 13.6719 957.38 KB
ValidateOnly 1000 740.7 μs 14.40 μs 16.01 μs 754.3 μs - 41.11 KB
FormatOnly 1000 1,095.2 μs 2.02 μs 1.79 μs 1,095.1 μs 1.9531 187.92 KB

@twcclegg
twcclegg merged commit bd3197a into main Aug 26, 2026
7 of 8 checks passed
@twcclegg
twcclegg deleted the style/data-model-classes branch August 26, 2026 14:07
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.

1 participant