{"id":1338,"date":"2026-06-06T18:00:00","date_gmt":"2026-06-06T17:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1338"},"modified":"2026-06-08T20:21:19","modified_gmt":"2026-06-08T20:21:19","slug":"c-sharp-14-extension-members-need-restraint","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/","title":{"rendered":"C# 14 Extension Members Need Restraint"},"content":{"rendered":"<p>C# 14 extension members are useful, but they are also the sort of feature that needs taste. They can make code nicer to read. They can also make an API feel like it has secret doors everywhere.<\/p>\n<p>The Microsoft docs for <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/csharp\/whats-new\/csharp-14\">what is new in C# 14<\/a> describe extension members as a broader syntax for declaring extension properties and extension methods, including members that appear as static members of the extended type. That is powerful because it removes some of the helper-class noise that builds up around common types.<\/p>\n<p>The danger is discoverability. Extension methods were already easy to overuse. Extension properties and static extension members raise the same question: when I read this type, where does this member actually come from? If the answer is &#8220;from whatever namespace happened to be imported,&#8221; the code can get clever quickly.<\/p>\n<p>I would use extension members for stable, obvious vocabulary around types your team already treats as domain concepts. I would not use them to hide business rules or make unrelated APIs look native. The best version of this feature removes friction. The worst version turns ordinary code reading into a hunt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C# 14 extension members can reduce helper-class noise, but overuse will make APIs harder to understand.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13,25],"tags":[159,163,177,147],"class_list":["post-1338","post","type-post","status-publish","format-standard","hentry","category-programming","category-software-engineer","tag-csharp","tag-csharp-14","tag-extension-members","tag-refactoring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C# 14 Extension Members Need Restraint - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# 14 Extension Members Need Restraint - wade.one\" \/>\n<meta property=\"og:description\" content=\"C# 14 extension members can reduce helper-class noise, but overuse will make APIs harder to understand.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-06T17:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-08T20:21:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Wade\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Wade\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/\"},\"author\":{\"name\":\"Wade\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/f9dedd948575256e77a44aa1417f63de\"},\"headline\":\"C# 14 Extension Members Need Restraint\",\"datePublished\":\"2026-06-06T17:00:00+00:00\",\"dateModified\":\"2026-06-08T20:21:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/\"},\"wordCount\":193,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"csharp\",\"csharp-14\",\"extension-members\",\"refactoring\"],\"articleSection\":[\"Programming\",\"Software Engineer\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/\",\"name\":\"C# 14 Extension Members Need Restraint - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-06-06T17:00:00+00:00\",\"dateModified\":\"2026-06-08T20:21:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/06\\\/06\\\/c-sharp-14-extension-members-need-restraint\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C# 14 Extension Members Need Restraint\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/f9dedd948575256e77a44aa1417f63de\",\"name\":\"Wade\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg\",\"caption\":\"Wade\"},\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/author\\\/wade\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C# 14 Extension Members Need Restraint - wade.one","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/","og_locale":"en_GB","og_type":"article","og_title":"C# 14 Extension Members Need Restraint - wade.one","og_description":"C# 14 extension members can reduce helper-class noise, but overuse will make APIs harder to understand.","og_url":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/","og_site_name":"wade.one","article_published_time":"2026-06-06T17:00:00+00:00","article_modified_time":"2026-06-08T20:21:19+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"author":"Wade","twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Written by":"Wade","Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/"},"author":{"name":"Wade","@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/f9dedd948575256e77a44aa1417f63de"},"headline":"C# 14 Extension Members Need Restraint","datePublished":"2026-06-06T17:00:00+00:00","dateModified":"2026-06-08T20:21:19+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/"},"wordCount":193,"commentCount":0,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["csharp","csharp-14","extension-members","refactoring"],"articleSection":["Programming","Software Engineer"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/","url":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/","name":"C# 14 Extension Members Need Restraint - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-06-06T17:00:00+00:00","dateModified":"2026-06-08T20:21:19+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/06\/06\/c-sharp-14-extension-members-need-restraint\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"C# 14 Extension Members Need Restraint"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}},{"@type":"Person","@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/f9dedd948575256e77a44aa1417f63de","name":"Wade","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/94100ef7361b8aaac136b852c8df93bdd10942165a122d5c56e4466cc403e5d9?s=96&d=retro&r=pg","caption":"Wade"},"url":"https:\/\/wade.one\/blog\/author\/wade\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1307,"url":"https:\/\/wade.one\/blog\/2026\/05\/19\/c-sharp-14-extension-members-should-reduce-helper-class-noise\/","url_meta":{"origin":1338,"position":0},"title":"C# 14 Extension Members Should Reduce Helper Class Noise","author":"Wade","date":"May 19, 2026","format":false,"excerpt":"C# 14 extension members give teams a cleaner way to express extension properties and static-style helpers, but they still need restraint.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1306,"url":"https:\/\/wade.one\/blog\/2026\/05\/18\/dotnet-10-is-the-c-sharp-upgrade-that-matters\/","url_meta":{"origin":1338,"position":1},"title":".NET 10 Is the C# Upgrade That Matters","author":"","date":"May 18, 2026","format":false,"excerpt":".NET 10 matters for C# teams because it is an LTS release, not just because it brings another round of language and tooling features.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1296,"url":"https:\/\/wade.one\/blog\/2026\/05\/08\/php-8-5s-uri-extension-fixes-a-real-web-problem\/","url_meta":{"origin":1338,"position":2},"title":"PHP 8.5&#8217;s URI Extension Fixes a Real Web Problem","author":"","date":"May 8, 2026","format":false,"excerpt":"PHP 8.5's new URI extension is not flashy, but it gives PHP a better built-in answer for parsing modern URLs.","rel":"","context":"In &quot;PHP&quot;","block_context":{"text":"PHP","link":"https:\/\/wade.one\/blog\/category\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":665,"url":"https:\/\/wade.one\/blog\/2013\/09\/18\/c-mysqldatareader-one-line-function-to-return-a-row-as-an-instance-of-a-class\/","url_meta":{"origin":1338,"position":3},"title":"C# MySqlDataReader &#8211; &#8220;one line&#8221; function to return a row as an instance of a class.","author":"Wade","date":"September 18, 2013","format":false,"excerpt":"MySql in C# is rather painless using the MySQL Connector for .net, but one thing it is missing is a no-frills, no extra requirements, no pre-defined ERD return a row as an instance of a class function. Coming from a PHP background, I love the PDO function fetchObject(), it's just\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1175,"url":"https:\/\/wade.one\/blog\/2026\/04\/07\/what-good-kotlin-code-feels-like-after-too-much-java\/","url_meta":{"origin":1338,"position":4},"title":"What Good Kotlin Code Feels Like After Too Much Java","author":"Wade","date":"April 7, 2026","format":false,"excerpt":"Kotlin feels good when it removes friction instead of adding ceremony. After enough Java, that difference becomes obvious very quickly.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1140,"url":"https:\/\/wade.one\/blog\/2023\/04\/08\/upgrading-to-php-8-what-you-need-to-know\/","url_meta":{"origin":1338,"position":5},"title":"Upgrading to PHP 8: What You Need to Know","author":"Wade","date":"April 8, 2023","format":false,"excerpt":"Are you considering upgrading your website's PHP version from 7.x to 8.x? While upgrading can offer benefits like improved performance and security, it's important to be aware of potential compatibility issues that may arise. In this post, we'll explore some things to consider before making the switch. Deprecated Functions and\u2026","rel":"","context":"In &quot;PHP&quot;","block_context":{"text":"PHP","link":"https:\/\/wade.one\/blog\/category\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1338"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1338\/revisions"}],"predecessor-version":[{"id":1364,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1338\/revisions\/1364"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}