



{"id":181,"date":"2023-04-05T09:25:28","date_gmt":"2023-04-05T09:25:28","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=181"},"modified":"2023-08-23T16:22:31","modified_gmt":"2023-08-23T16:22:31","slug":"c-design-patterns-and-best-practices","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/","title":{"rendered":"C# Design Patterns and Best Practices"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Design patterns are tried and tested solutions to common software design problems. They can help improve the structure, efficiency, and maintainability of your code. In this article, we will explore a variety of design patterns and best practices in C# programming. By the end of this guide, you will have a deeper understanding of how to make your C# code more robust and scalable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Creational Patterns<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Creational design patterns deal with object creation mechanisms. They provide more control and flexibility over object instantiation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.1. Singleton Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Singleton pattern ensures that a class has only one instance and provides a global point of access to that instance. It is useful when you need to enforce that only one object of a particular class should exist.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">sealed<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Singleton<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">readonly<\/span> Lazy&lt;Singleton&gt; lazyInstance = <span class=\"hljs-keyword\">new<\/span> Lazy&lt;Singleton&gt;(() =&gt; <span class=\"hljs-keyword\">new<\/span> Singleton());\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> Singleton Instance =&gt; lazyInstance.Value;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-title\">Singleton<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> { }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">1.2. Factory Method Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Factory Method pattern allows creating objects without specifying their concrete types. Instead, a factory method creates objects based on a parameter or a configuration value.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IProduct<\/span> { }\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductA<\/span> : <span class=\"hljs-title\">IProduct<\/span> { }\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteProductB<\/span> : <span class=\"hljs-title\">IProduct<\/span> { }\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ProductFactory<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> IProduct <span class=\"hljs-title\">CreateProduct<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> productType<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">switch<\/span> (productType)\r\n        {\r\n            <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">\"A\"<\/span>:\r\n                <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductA();\r\n            <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">\"B\"<\/span>:\r\n                <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ConcreteProductB();\r\n            <span class=\"hljs-keyword\">default<\/span>:\r\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">\"Invalid product type\"<\/span>, <span class=\"hljs-keyword\">nameof<\/span>(productType));\r\n        }\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">2. Structural Patterns<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Structural patterns define relationships between classes or objects, simplifying their interactions and promoting code reusability.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.1. Adapter Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Adapter pattern allows classes with incompatible interfaces to work together by wrapping an existing class with a new interface.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">ITarget<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">GetRequest<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Adaptee<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">GetSpecificRequest<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Specific request\"<\/span>;\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Adapter<\/span> : <span class=\"hljs-title\">ITarget<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> Adaptee _adaptee;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Adapter<\/span>(<span class=\"hljs-params\">Adaptee adaptee<\/span>)<\/span>\r\n    {\r\n        _adaptee = adaptee;\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">GetRequest<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> _adaptee.GetSpecificRequest();\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.2. Decorator Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Decorator pattern allows adding new functionality to an existing object without altering its structure. It involves a set of decorator classes that mirror the type of the objects they extend.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IComponent<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Operation<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteComponent<\/span> : <span class=\"hljs-title\">IComponent<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Operation<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"ConcreteComponent\"<\/span>;\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">abstract<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Decorator<\/span> : <span class=\"hljs-title\">IComponent<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">protected<\/span> <span class=\"hljs-keyword\">readonly<\/span> IComponent _component;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected<\/span> <span class=\"hljs-title\">Decorator<\/span>(<span class=\"hljs-params\">IComponent component<\/span>)<\/span>\r\n    {\r\n        _component = component;\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">virtual<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Operation<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> _component.Operation();\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteDecoratorA<\/span> : <span class=\"hljs-title\">Decorator<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">ConcreteDecoratorA<\/span>(<span class=\"hljs-params\">IComponent component<\/span>) : <span class=\"hljs-title\">base<\/span>(<span class=\"hljs-params\">component<\/span>)<\/span> { }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Operation<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">$\"ConcreteDecoratorA(<span class=\"hljs-subst\">{<span class=\"hljs-keyword\">base<\/span>.Operation()}<\/span>)\"<\/span>;\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Behavioral Patterns<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Behavioral patterns define the communication between objects and how they interact with each other.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1. Observer Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Observer pattern allows an object, called the subject, to notify other objects, called observers, about changes in its state. The observer pattern promotes a decoupling between the subject and its observers, which can simplify the code and improve maintainability.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IObserver<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Update<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>;\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">ISubject<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Attach<\/span>(<span class=\"hljs-params\">IObserver observer<\/span>)<\/span>;\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Detach<\/span>(<span class=\"hljs-params\">IObserver observer<\/span>)<\/span>;\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Notify<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteSubject<\/span> : <span class=\"hljs-title\">ISubject<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> List&lt;IObserver&gt; _observers = <span class=\"hljs-keyword\">new<\/span> List&lt;IObserver&gt;();\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">string<\/span> _state;\r\n\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> State\r\n    {\r\n        <span class=\"hljs-keyword\">get<\/span> =&gt; _state;\r\n        <span class=\"hljs-keyword\">set<\/span>\r\n        {\r\n            _state = <span class=\"hljs-keyword\">value<\/span>;\r\n            Notify();\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Attach<\/span>(<span class=\"hljs-params\">IObserver observer<\/span>)<\/span>\r\n    {\r\n        _observers.Add(observer);\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Detach<\/span>(<span class=\"hljs-params\">IObserver observer<\/span>)<\/span>\r\n    {\r\n        _observers.Remove(observer);\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Notify<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> observer <span class=\"hljs-keyword\">in<\/span> _observers)\r\n        {\r\n            observer.Update(State);\r\n        }\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteObserver<\/span> : <span class=\"hljs-title\">IObserver<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Update<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>\r\n    {\r\n        Console.WriteLine(<span class=\"hljs-string\">$\"Received update: <span class=\"hljs-subst\">{message}<\/span>\"<\/span>);\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">3.2. Strategy Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Strategy pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. It allows the algorithm to be selected at runtime.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IStrategy<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span> a, <span class=\"hljs-keyword\">int<\/span> b<\/span>)<\/span>;\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteStrategyAdd<\/span> : <span class=\"hljs-title\">IStrategy<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span> a, <span class=\"hljs-keyword\">int<\/span> b<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> a + b;\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteStrategyMultiply<\/span> : <span class=\"hljs-title\">IStrategy<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span> a, <span class=\"hljs-keyword\">int<\/span> b<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> a * b;\r\n    }\r\n}\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Context<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> IStrategy _strategy;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Context<\/span>(<span class=\"hljs-params\">IStrategy strategy<\/span>)<\/span>\r\n    {\r\n        _strategy = strategy;\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SetStrategy<\/span>(<span class=\"hljs-params\">IStrategy strategy<\/span>)<\/span>\r\n    {\r\n        _strategy = strategy;\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">ExecuteStrategy<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span> a, <span class=\"hljs-keyword\">int<\/span> b<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> _strategy.Execute(a, b);\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Best Practices<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1. SOLID Principles<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SOLID is an acronym that represents a set of five design principles for writing maintainable and scalable software. They are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Single Responsibility Principle (SRP)<\/strong>: A class should have only one reason to change.<\/li>\n\n\n\n<li><strong>Open\/Closed Principle (OCP)<\/strong>: Software entities should be open for extension but closed for modification.<\/li>\n\n\n\n<li><strong>Liskov Substitution Principle (LSP)<\/strong>: Subtypes must be substitutable for their base types.<\/li>\n\n\n\n<li><strong>Interface Segregation Principle (ISP)<\/strong>: Many client-specific interfaces are better than one general-purpose interface.<\/li>\n\n\n\n<li><strong>Dependency Inversion Principle (DIP)<\/strong>: High-level modules should not depend on low-level modules; both should depend on abstractions.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.2. Code Reusability and Composition<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Compose your application by reusing existing code and combining smaller, independent components. This practice encourages modularity, making your code easier to understand, maintain, and extend.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.3. Dependency Injection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency Injection (DI) is a technique for achieving Inversion of Control (IoC) between classes and their dependencies. It promotes loose coupling and improves testability. In C#, you can use DI frameworks like <strong>Autofac<\/strong>, Unity, or the built-in <strong>Microsoft.Extensions.DependencyInjection<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Example Exercise: Implementing a File Conversion System Using C# Design Patterns<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In this example exercise, we will implement a file conversion system using various C# design patterns and best practices. Our system will be able to convert between different file formats, such as TXT, JSON, and XML. We will utilize the Factory Method, Strategy, and Singleton patterns in our implementation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Define the File Conversion Interface<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a common interface that all file converters will implement.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IFileConverter<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Convert<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input<\/span>)<\/span>;\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2. Implement Concrete File Converters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create concrete file converter classes for TXT, JSON, and XML formats.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-comment\">\/\/ Converter for TXT to JSON format<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TxtToJsonConverter<\/span> : <span class=\"hljs-title\">IFileConverter<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Convert<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-comment\">\/\/ Implementation for converting TXT to JSON<\/span>\r\n    }\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ Converter for TXT to XML format<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TxtToXmlConverter<\/span> : <span class=\"hljs-title\">IFileConverter<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Convert<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-comment\">\/\/ Implementation for converting TXT to XML<\/span>\r\n    }\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ Converter for JSON to XML format<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JsonToXmlConverter<\/span> : <span class=\"hljs-title\">IFileConverter<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Convert<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-comment\">\/\/ Implementation for converting JSON to XML<\/span>\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Implement File Converter Factory (Factory Method Pattern)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a factory class that will instantiate the appropriate file converter based on the input and output formats.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileConverterFactory<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> IFileConverter <span class=\"hljs-title\">CreateConverter<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> inputFormat, <span class=\"hljs-keyword\">string<\/span> outputFormat<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">if<\/span> (inputFormat == <span class=\"hljs-string\">\"TXT\"<\/span> &amp;&amp; outputFormat == <span class=\"hljs-string\">\"JSON\"<\/span>)\r\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> TxtToJsonConverter();\r\n        <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (inputFormat == <span class=\"hljs-string\">\"TXT\"<\/span> &amp;&amp; outputFormat == <span class=\"hljs-string\">\"XML\"<\/span>)\r\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> TxtToXmlConverter();\r\n        <span class=\"hljs-keyword\">else<\/span> <span class=\"hljs-keyword\">if<\/span> (inputFormat == <span class=\"hljs-string\">\"JSON\"<\/span> &amp;&amp; outputFormat == <span class=\"hljs-string\">\"XML\"<\/span>)\r\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> JsonToXmlConverter();\r\n        <span class=\"hljs-keyword\">else<\/span>\r\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> ArgumentException(<span class=\"hljs-string\">\"Invalid input-output format combination\"<\/span>);\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Implement the File Conversion Context (Strategy Pattern)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a context class that will use the selected file converter to perform the file conversion.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileConversionContext<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> IFileConverter _fileConverter;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SetConverter<\/span>(<span class=\"hljs-params\">IFileConverter fileConverter<\/span>)<\/span>\r\n    {\r\n        _fileConverter = fileConverter;\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Convert<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">if<\/span> (_fileConverter == <span class=\"hljs-literal\">null<\/span>)\r\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> InvalidOperationException(<span class=\"hljs-string\">\"File converter is not set\"<\/span>);\r\n\r\n        <span class=\"hljs-keyword\">return<\/span> _fileConverter.Convert(input);\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Implement the File Conversion Manager (Singleton Pattern)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a file conversion manager class that will manage the file conversion operations. This class will be a singleton to ensure that only one instance exists.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">sealed<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileConversionManager<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">readonly<\/span> Lazy&lt;FileConversionManager&gt; lazyInstance = <span class=\"hljs-keyword\">new<\/span> Lazy&lt;FileConversionManager&gt;(() =&gt; <span class=\"hljs-keyword\">new<\/span> FileConversionManager());\r\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> FileConversionManager Instance =&gt; lazyInstance.Value;\r\n\r\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> FileConversionContext _fileConversionContext = <span class=\"hljs-keyword\">new<\/span> FileConversionContext();\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-title\">FileConversionManager<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> { }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">Convert<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> input, <span class=\"hljs-keyword\">string<\/span> inputFormat, <span class=\"hljs-keyword\">string<\/span> outputFormat<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">var<\/span> converter = FileConverterFactory.CreateConverter(inputFormat, outputFormat);\r\n        _fileConversionContext.SetConverter(converter);\r\n        <span class=\"hljs-keyword\">return<\/span> _fileConversionContext.Convert(input);\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">6. Use the File Conversion Manager<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Utilize the <strong><code>FileConversionManager<\/code><\/strong> to perform file conversions.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">string<\/span> inputText = <span class=\"hljs-string\">\"Example input data\"<\/span>;\r\n        <span class=\"hljs-keyword\">string<\/span> inputFormat = <span class=\"hljs-string\">\"TXT\"<\/span>;\r\n        <span class=\"hljs-keyword\">string<\/span> outputFormat = <span class=\"hljs-string\">\"JSON\"<\/span>;\r\n\r\n        <span class=\"hljs-keyword\">try<\/span>\r\n        {\r\n            <span class=\"hljs-keyword\">string<\/span> convertedData = FileConversionManager.Instance.Convert(inputText, inputFormat, outputFormat);\r\n            Console.WriteLine(<span class=\"hljs-string\">$\"Converted data: <span class=\"hljs-subst\">{convertedData}<\/span>\"<\/span>);\r\n        }\r\n        <span class=\"hljs-keyword\">catch<\/span> (Exception ex)\r\n        {\r\n            Console.WriteLine(<span class=\"hljs-string\">$\"Error occurred: <span class=\"hljs-subst\">{ex.Message}<\/span>\"<\/span>);\r\n        }\r\n    }\r\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this example exercise, we have demonstrated the implementation of a file conversion system using various C# design patterns and best practices, such as the Factory Method, Strategy, and Singleton patterns. The FileConversionManager, FileConversionContext, and FileConverterFactory classes work together to perform file conversions between different formats, such as TXT, JSON, and XML. This approach allows for easy extensibility, as adding support for new formats would only require the creation of new converter classes and updating the factory method accordingly.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Design patterns are tried and tested solutions to common software design problems. They can help improve the structure, efficiency, and maintainability of your code. In this article, we will explore a variety of design patterns and best practices in C# programming. By the end of this guide, you will have a deeper understanding of how [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8,4],"tags":[],"class_list":["post-181","post","type-post","status-publish","format-standard","category-csharp","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C# Design Patterns and Best Practices<\/title>\n<meta name=\"description\" content=\"Discover advanced C# design patterns and best practices, including creational, structural, and behavioral patterns.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C# Design Patterns and Best Practices\" \/>\n<meta property=\"og:description\" content=\"Discover advanced C# design patterns and best practices, including creational, structural, and behavioral patterns.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-05T09:25:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-23T16:22:31+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"C# Design Patterns and Best Practices\",\"datePublished\":\"2023-04-05T09:25:28+00:00\",\"dateModified\":\"2023-08-23T16:22:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/\"},\"wordCount\":741,\"commentCount\":0,\"articleSection\":[\"C#\",\"Programming Languages\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/\",\"name\":\"C# Design Patterns and Best Practices\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2023-04-05T09:25:28+00:00\",\"dateModified\":\"2023-08-23T16:22:31+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"Discover advanced C# design patterns and best practices, including creational, structural, and behavioral patterns.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/c-design-patterns-and-best-practices\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"C#\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/csharp\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"C# Design Patterns and Best Practices\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1782562654\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1782562654\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1782562654\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C# Design Patterns and Best Practices","description":"Discover advanced C# design patterns and best practices, including creational, structural, and behavioral patterns.","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:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/","og_locale":"en_US","og_type":"article","og_title":"C# Design Patterns and Best Practices","og_description":"Discover advanced C# design patterns and best practices, including creational, structural, and behavioral patterns.","og_url":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/","article_published_time":"2023-04-05T09:25:28+00:00","article_modified_time":"2023-08-23T16:22:31+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"C# Design Patterns and Best Practices","datePublished":"2023-04-05T09:25:28+00:00","dateModified":"2023-08-23T16:22:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/"},"wordCount":741,"commentCount":0,"articleSection":["C#","Programming Languages"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/","url":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/","name":"C# Design Patterns and Best Practices","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2023-04-05T09:25:28+00:00","dateModified":"2023-08-23T16:22:31+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"Discover advanced C# design patterns and best practices, including creational, structural, and behavioral patterns.","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/c-design-patterns-and-best-practices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"C#","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/csharp\/"},{"@type":"ListItem","position":4,"name":"C# Design Patterns and Best Practices"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1782562654","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1782562654","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1782562654","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=181"}],"version-history":[{"count":4,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":622,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/181\/revisions\/622"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}