dev-notes/languages/dotnet/csharp/csharp.html

11770 lines
710 KiB
HTML
Raw Normal View History

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="author" content="Marcello Lamonaca">
<link rel="canonical" href="http://m-lamonaca.github.io/dev-notes/languages/dotnet/csharp/csharp.html">
<link rel="prev" href="../../python/libs/beautiful-soup.html">
<link rel="next" href="linq.html">
<link rel="icon" href="../../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.34">
<title>C# - Dev Notes</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.35f28582.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<script src="https://unpkg.com/iframe-worker/shim"></script>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="C# - Dev Notes" >
<meta property="og:description" content="None" >
<meta property="og:image" content="http://m-lamonaca.github.io/dev-notes/assets/images/social/languages/dotnet/csharp/csharp.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="http://m-lamonaca.github.io/dev-notes/languages/dotnet/csharp/csharp.html" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="C# - Dev Notes" >
<meta name="twitter:description" content="None" >
<meta name="twitter:image" content="http://m-lamonaca.github.io/dev-notes/assets/images/social/languages/dotnet/csharp/csharp.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="deep-orange">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#c" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../../index.html" title="Dev Notes" class="md-header__button md-logo" aria-label="Dev Notes" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6m80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3l89.3 89.4-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Dev Notes
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
C#
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="orange" data-md-color-accent="deep-orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="orange" data-md-color-accent="deep-orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/m-lamonaca/dev-notes" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../../index.html" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../../containers/docker.html" class="md-tabs__link">
Containers
</a>
</li>
<li class="md-tabs__item">
<a href="../../../databases/redis.html" class="md-tabs__link">
Databases
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../html/html.html" class="md-tabs__link">
Languages
</a>
</li>
<li class="md-tabs__item">
<a href="../../../misc/vcs/git.html" class="md-tabs__link">
Misc
</a>
</li>
<li class="md-tabs__item">
<a href="../../../linux/filesystem/file-links.html" class="md-tabs__link">
Linux
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../../index.html" title="Dev Notes" class="md-nav__button md-logo" aria-label="Dev Notes" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6m80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3l89.3 89.4-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3"/></svg>
</a>
Dev Notes
</label>
<div class="md-nav__source">
<a href="https://github.com/m-lamonaca/dev-notes" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../index.html" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Containers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Containers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../containers/docker.html" class="md-nav__link">
<span class="md-ellipsis">
Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../containers/kubernetes.html" class="md-nav__link">
<span class="md-ellipsis">
Kubernetes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Databases
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Databases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../databases/redis.html" class="md-nav__link">
<span class="md-ellipsis">
Redis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../databases/sql.html" class="md-nav__link">
<span class="md-ellipsis">
SQL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../databases/mongo-db.html" class="md-nav__link">
<span class="md-ellipsis">
MongoDB
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Languages
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Languages
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../html/html.html" class="md-nav__link">
<span class="md-ellipsis">
HTML
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../markdown.html" class="md-nav__link">
<span class="md-ellipsis">
Markdown
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../css/css.html" class="md-nav__link">
<span class="md-ellipsis">
CSS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../c/c.html" class="md-nav__link">
<span class="md-ellipsis">
C
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../kotlin/kotlin.html" class="md-nav__link">
<span class="md-ellipsis">
Kotlin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../swift/swift.html" class="md-nav__link">
<span class="md-ellipsis">
Swift
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_7" >
<label class="md-nav__link" for="__nav_4_7" id="__nav_4_7_label" tabindex="">
<span class="md-ellipsis">
Assembly
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_7">
<span class="md-nav__icon md-icon"></span>
Assembly
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../assembly/intel.html" class="md-nav__link">
<span class="md-ellipsis">
Intel
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../assembly/riscv.html" class="md-nav__link">
<span class="md-ellipsis">
RISC-V
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8" >
<label class="md-nav__link" for="__nav_4_8" id="__nav_4_8_label" tabindex="">
<span class="md-ellipsis">
Python
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8">
<span class="md-nav__icon md-icon"></span>
Python
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../python/python.html" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8_2" >
<label class="md-nav__link" for="__nav_4_8_2" id="__nav_4_8_2_label" tabindex="0">
<span class="md-ellipsis">
Modules
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_2">
<span class="md-nav__icon md-icon"></span>
Modules
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../python/modules/argparse.html" class="md-nav__link">
<span class="md-ellipsis">
argparse
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/collections.html" class="md-nav__link">
<span class="md-ellipsis">
collection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/csv.html" class="md-nav__link">
<span class="md-ellipsis">
csv
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/ftplib.html" class="md-nav__link">
<span class="md-ellipsis">
ftplib
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/itertools.html" class="md-nav__link">
<span class="md-ellipsis">
itertools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/json.html" class="md-nav__link">
<span class="md-ellipsis">
json
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/logging.html" class="md-nav__link">
<span class="md-ellipsis">
logging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/shutil.html" class="md-nav__link">
<span class="md-ellipsis">
shutil
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/smtplib.html" class="md-nav__link">
<span class="md-ellipsis">
smtplib
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/socket.html" class="md-nav__link">
<span class="md-ellipsis">
socket
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/sqlite.html" class="md-nav__link">
<span class="md-ellipsis">
sqlite
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/time-datetime.html" class="md-nav__link">
<span class="md-ellipsis">
time & datetime
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/modules/unittest.html" class="md-nav__link">
<span class="md-ellipsis">
unittest
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8_3" >
<label class="md-nav__link" for="__nav_4_8_3" id="__nav_4_8_3_label" tabindex="0">
<span class="md-ellipsis">
Libraries
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_3">
<span class="md-nav__icon md-icon"></span>
Libraries
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../python/libs/tkinter.html" class="md-nav__link">
<span class="md-ellipsis">
TKinter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/libs/numpy.html" class="md-nav__link">
<span class="md-ellipsis">
Numpy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/libs/pandas.html" class="md-nav__link">
<span class="md-ellipsis">
Pandas
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/libs/seaborn.html" class="md-nav__link">
<span class="md-ellipsis">
Seaborn
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/libs/requests.html" class="md-nav__link">
<span class="md-ellipsis">
Requests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../python/libs/beautiful-soup.html" class="md-nav__link">
<span class="md-ellipsis">
Beatiful Soup
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9" checked>
<label class="md-nav__link" for="__nav_4_9" id="__nav_4_9_label" tabindex="">
<span class="md-ellipsis">
.NET
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4_9">
<span class="md-nav__icon md-icon"></span>
.NET
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_1" checked>
<label class="md-nav__link" for="__nav_4_9_1" id="__nav_4_9_1_label" tabindex="0">
<span class="md-ellipsis">
C#
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_1_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4_9_1">
<span class="md-nav__icon md-icon"></span>
C#
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
C#
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="csharp.html" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
C#
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#basics" class="md-nav__link">
<span class="md-ellipsis">
Basics
</span>
</a>
<nav class="md-nav" aria-label="Basics">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#comments" class="md-nav__link">
<span class="md-ellipsis">
Comments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docstring-structure" class="md-nav__link">
<span class="md-ellipsis">
Docstring Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-convention" class="md-nav__link">
<span class="md-ellipsis">
Naming Convention
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#namespaces-imports-aliases" class="md-nav__link">
<span class="md-ellipsis">
Namespaces, Imports &amp; Aliases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#top-level-statementsprograms-c-9" class="md-nav__link">
<span class="md-ellipsis">
Top Level Statements/Programs (C# 9)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#main-method" class="md-nav__link">
<span class="md-ellipsis">
Main Method
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#constant-declaration" class="md-nav__link">
<span class="md-ellipsis">
Constant Declaration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assignment-operation" class="md-nav__link">
<span class="md-ellipsis">
Assignment Operation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#input" class="md-nav__link">
<span class="md-ellipsis">
Input
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#screen-output" class="md-nav__link">
<span class="md-ellipsis">
Screen Output
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#string-formatting" class="md-nav__link">
<span class="md-ellipsis">
String Formatting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#number-format-string" class="md-nav__link">
<span class="md-ellipsis">
Number Format String
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#variable-types" class="md-nav__link">
<span class="md-ellipsis">
Variable Types
</span>
</a>
<nav class="md-nav" aria-label="Variable Types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#value-type" class="md-nav__link">
<span class="md-ellipsis">
Value Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reference-type" class="md-nav__link">
<span class="md-ellipsis">
Reference Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#integer-numeric-types" class="md-nav__link">
<span class="md-ellipsis">
Integer Numeric Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#floating-point-numeric-types" class="md-nav__link">
<span class="md-ellipsis">
Floating-Point Numeric Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#biginteger" class="md-nav__link">
<span class="md-ellipsis">
BigInteger
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#binary-hexadecimal-numbers" class="md-nav__link">
<span class="md-ellipsis">
Binary &amp; Hexadecimal Numbers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boolean-type-systemboolean" class="md-nav__link">
<span class="md-ellipsis">
Boolean Type (System.Boolean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#text-type-systemchar-systemstring" class="md-nav__link">
<span class="md-ellipsis">
Text Type (System.Char &amp; System.String)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#implicit-type" class="md-nav__link">
<span class="md-ellipsis">
Implicit Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-type" class="md-nav__link">
<span class="md-ellipsis">
Dynamic Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#anonymous-types-reference-type" class="md-nav__link">
<span class="md-ellipsis">
Anonymous types (Reference Type)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#index-range-types-structs" class="md-nav__link">
<span class="md-ellipsis">
Index &amp; Range Types (Structs)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#tuples-value-type" class="md-nav__link">
<span class="md-ellipsis">
Tuples (Value Type)
</span>
</a>
<nav class="md-nav" aria-label="Tuples (Value Type)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#tuple-deconstruction" class="md-nav__link">
<span class="md-ellipsis">
Tuple Deconstruction
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#records" class="md-nav__link">
<span class="md-ellipsis">
Records
</span>
</a>
<nav class="md-nav" aria-label="Records">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#with-expressions" class="md-nav__link">
<span class="md-ellipsis">
with-expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#with-expressions-inheritance" class="md-nav__link">
<span class="md-ellipsis">
with-expressions &amp; Inheritance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#value-based-equality-inheritance" class="md-nav__link">
<span class="md-ellipsis">
Value-based Equality &amp; Inheritance
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#strings" class="md-nav__link">
<span class="md-ellipsis">
Strings
</span>
</a>
<nav class="md-nav" aria-label="Strings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#string-methods-not-in-place" class="md-nav__link">
<span class="md-ellipsis">
String Methods (Not In-Place)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#raw-string-literals" class="md-nav__link">
<span class="md-ellipsis">
Raw string literals
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#nullable-types" class="md-nav__link">
<span class="md-ellipsis">
Nullable Types
</span>
</a>
<nav class="md-nav" aria-label="Nullable Types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nullable-value-types" class="md-nav__link">
<span class="md-ellipsis">
Nullable value types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nullable-reference-types" class="md-nav__link">
<span class="md-ellipsis">
Nullable reference types
</span>
</a>
<nav class="md-nav" aria-label="Nullable reference types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nullability-of-types" class="md-nav__link">
<span class="md-ellipsis">
Nullability of types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nullable-context" class="md-nav__link">
<span class="md-ellipsis">
Nullable Context
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#null-conditional-null-coalescing-null-forgiving-operator-null-checks" class="md-nav__link">
<span class="md-ellipsis">
Null Conditional, Null Coalescing, Null Forgiving Operator, Null Checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nullable-attributes" class="md-nav__link">
<span class="md-ellipsis">
Nullable Attributes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#type-conversion" class="md-nav__link">
<span class="md-ellipsis">
Type Conversion
</span>
</a>
<nav class="md-nav" aria-label="Type Conversion">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#converting-from-any-type-to-a-string" class="md-nav__link">
<span class="md-ellipsis">
Converting from any type to a string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#number-downcasting" class="md-nav__link">
<span class="md-ellipsis">
Number Downcasting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#converting-from-a-binary-object-to-a-string" class="md-nav__link">
<span class="md-ellipsis">
Converting from a binary object to a string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#parsing-from-strings-to-numbers-or-dates-and-times" class="md-nav__link">
<span class="md-ellipsis">
Parsing from strings to numbers or dates and times
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#preprocessor-directives" class="md-nav__link">
<span class="md-ellipsis">
Preprocessor Directives
</span>
</a>
<nav class="md-nav" aria-label="Preprocessor Directives">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#error-and-warning" class="md-nav__link">
<span class="md-ellipsis">
#error and #warning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pragma" class="md-nav__link">
<span class="md-ellipsis">
#pragma
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#expressions-operators" class="md-nav__link">
<span class="md-ellipsis">
Expressions &amp; Operators
</span>
</a>
<nav class="md-nav" aria-label="Expressions & Operators">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#primary-expressions" class="md-nav__link">
<span class="md-ellipsis">
Primary Expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unary-operators" class="md-nav__link">
<span class="md-ellipsis">
Unary Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mathematical-operators" class="md-nav__link">
<span class="md-ellipsis">
Mathematical Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#relational-operators" class="md-nav__link">
<span class="md-ellipsis">
Relational Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#logical-operators" class="md-nav__link">
<span class="md-ellipsis">
Logical Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assignment" class="md-nav__link">
<span class="md-ellipsis">
Assignment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conditional-operator" class="md-nav__link">
<span class="md-ellipsis">
Conditional Operator
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#decision-statements" class="md-nav__link">
<span class="md-ellipsis">
Decision Statements
</span>
</a>
<nav class="md-nav" aria-label="Decision Statements">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#if-else-if-else" class="md-nav__link">
<span class="md-ellipsis">
If-Else If-Else
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pattern-matching" class="md-nav__link">
<span class="md-ellipsis">
Pattern Matching
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#switch" class="md-nav__link">
<span class="md-ellipsis">
Switch
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#loop-statements" class="md-nav__link">
<span class="md-ellipsis">
Loop Statements
</span>
</a>
<nav class="md-nav" aria-label="Loop Statements">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#while-loop" class="md-nav__link">
<span class="md-ellipsis">
While Loop
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#do-while-loop" class="md-nav__link">
<span class="md-ellipsis">
Do-While Loop
</span>
</a>
<nav class="md-nav" aria-label="Do-While Loop">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#for-loop" class="md-nav__link">
<span class="md-ellipsis">
For Loop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#foreach-loop" class="md-nav__link">
<span class="md-ellipsis">
Foreach Loop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#break-continue" class="md-nav__link">
<span class="md-ellipsis">
Break, Continue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#yield-statement" class="md-nav__link">
<span class="md-ellipsis">
Yield Statement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#context-statement-using-declarations" class="md-nav__link">
<span class="md-ellipsis">
Context Statement &amp; Using Declarations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#checkedunchecked-statements" class="md-nav__link">
<span class="md-ellipsis">
Checked/Unchecked Statements
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#exception-handling" class="md-nav__link">
<span class="md-ellipsis">
Exception Handling
</span>
</a>
<nav class="md-nav" aria-label="Exception Handling">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#throwing-exceptions" class="md-nav__link">
<span class="md-ellipsis">
Throwing Exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-exceptions" class="md-nav__link">
<span class="md-ellipsis">
Custom Exceptions
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#enums" class="md-nav__link">
<span class="md-ellipsis">
Enums
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#methods" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#expression-body-definition" class="md-nav__link">
<span class="md-ellipsis">
Expression Body Definition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#arbitrary-number-of-parameter-in-methods" class="md-nav__link">
<span class="md-ellipsis">
Arbitrary Number Of Parameter In Methods
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#named-arguments" class="md-nav__link">
<span class="md-ellipsis">
Named Arguments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-arguments" class="md-nav__link">
<span class="md-ellipsis">
Optional Arguments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#passing-values-by-reference-ref-out-in" class="md-nav__link">
<span class="md-ellipsis">
Passing Values By Reference (ref, out, in)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returning-multiple-values-with-tuples" class="md-nav__link">
<span class="md-ellipsis">
Returning Multiple Values with Tuples
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returning-multiple-values-w-structs-return-struct-variable" class="md-nav__link">
<span class="md-ellipsis">
Returning Multiple Values W/ Structs (Return Struct Variable)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#local-functions" class="md-nav__link">
<span class="md-ellipsis">
Local Functions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#extension-methods" class="md-nav__link">
<span class="md-ellipsis">
Extension Methods
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#iterators" class="md-nav__link">
<span class="md-ellipsis">
Iterators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#structs-custom-value-types-classes-custom-reference-types" class="md-nav__link">
<span class="md-ellipsis">
Structs (Custom Value Types) &amp; Classes (Custom Reference Types)
</span>
</a>
<nav class="md-nav" aria-label="Structs (Custom Value Types) & Classes (Custom Reference Types)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#modifiers-methods-variables" class="md-nav__link">
<span class="md-ellipsis">
Modifiers (Methods &amp; Variables)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#methods_1" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#properties-fields" class="md-nav__link">
<span class="md-ellipsis">
Properties &amp; Fields
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#object-and-collection-initializers" class="md-nav__link">
<span class="md-ellipsis">
Object and Collection Initializers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#static-class" class="md-nav__link">
<span class="md-ellipsis">
Static Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#class-members-init-order" class="md-nav__link">
<span class="md-ellipsis">
Class Members Init Order
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#indexers" class="md-nav__link">
<span class="md-ellipsis">
Indexers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#abstract-classes" class="md-nav__link">
<span class="md-ellipsis">
Abstract Classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cloning" class="md-nav__link">
<span class="md-ellipsis">
Cloning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deconstruction" class="md-nav__link">
<span class="md-ellipsis">
Deconstruction
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#operator-overloading" class="md-nav__link">
<span class="md-ellipsis">
Operator Overloading
</span>
</a>
<nav class="md-nav" aria-label="Operator Overloading">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nested-types" class="md-nav__link">
<span class="md-ellipsis">
Nested Types
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#interfaces" class="md-nav__link">
<span class="md-ellipsis">
Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#generics" class="md-nav__link">
<span class="md-ellipsis">
Generics
</span>
</a>
<nav class="md-nav" aria-label="Generics">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#multiple-generics" class="md-nav__link">
<span class="md-ellipsis">
Multiple Generics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#parameters-constraints" class="md-nav__link">
<span class="md-ellipsis">
Parameters Constraints
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#inheritance" class="md-nav__link">
<span class="md-ellipsis">
Inheritance
</span>
</a>
<nav class="md-nav" aria-label="Inheritance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#downcasting" class="md-nav__link">
<span class="md-ellipsis">
Downcasting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#inheritance-constructors" class="md-nav__link">
<span class="md-ellipsis">
Inheritance &amp; Constructors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#generics-inheritance" class="md-nav__link">
<span class="md-ellipsis">
Generics Inheritance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#covariance-contravariance-only-for-interfaces" class="md-nav__link">
<span class="md-ellipsis">
Covariance &amp; Contravariance (only for interfaces)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#delegates" class="md-nav__link">
<span class="md-ellipsis">
Delegates
</span>
</a>
<nav class="md-nav" aria-label="Delegates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#multicast-delegates" class="md-nav__link">
<span class="md-ellipsis">
Multicast Delegates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#delegate-invocation" class="md-nav__link">
<span class="md-ellipsis">
Delegate Invocation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#common-delegate-types" class="md-nav__link">
<span class="md-ellipsis">
Common Delegate Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#type-compatibility" class="md-nav__link">
<span class="md-ellipsis">
Type Compatibility
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#anonymous-functions-lambda-expressions" class="md-nav__link">
<span class="md-ellipsis">
Anonymous Functions (Lambda Expressions)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
<nav class="md-nav" aria-label="Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#registering-event-handlers" class="md-nav__link">
<span class="md-ellipsis">
Registering Event Handlers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#built-in-eventhandler-delegate" class="md-nav__link">
<span class="md-ellipsis">
Built-In EventHandler Delegate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-event-args" class="md-nav__link">
<span class="md-ellipsis">
Custom Event Args
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#assemblies" class="md-nav__link">
<span class="md-ellipsis">
Assemblies
</span>
</a>
<nav class="md-nav" aria-label="Assemblies">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#anatomy-of-an-assembly" class="md-nav__link">
<span class="md-ellipsis">
Anatomy of an Assembly
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#net-metadata" class="md-nav__link">
<span class="md-ellipsis">
.NET MEtadata
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#resources" class="md-nav__link">
<span class="md-ellipsis">
Resources
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multifile-assembly" class="md-nav__link">
<span class="md-ellipsis">
Multifile Assembly
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assembly-resolution" class="md-nav__link">
<span class="md-ellipsis">
Assembly Resolution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#self-contained-deployment" class="md-nav__link">
<span class="md-ellipsis">
Self-Contained Deployment
</span>
</a>
<nav class="md-nav" aria-label="Self-Contained Deployment">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#framework-dependent-deployment" class="md-nav__link">
<span class="md-ellipsis">
Framework-Dependent Deployment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#assembly-names" class="md-nav__link">
<span class="md-ellipsis">
Assembly Names
</span>
</a>
<nav class="md-nav" aria-label="Assembly Names">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#strong-names" class="md-nav__link">
<span class="md-ellipsis">
Strong Names
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#version" class="md-nav__link">
<span class="md-ellipsis">
Version
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#culture" class="md-nav__link">
<span class="md-ellipsis">
Culture
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#reflection" class="md-nav__link">
<span class="md-ellipsis">
Reflection
</span>
</a>
<nav class="md-nav" aria-label="Reflection">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#assembly" class="md-nav__link">
<span class="md-ellipsis">
Assembly
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#attributes" class="md-nav__link">
<span class="md-ellipsis">
Attributes
</span>
</a>
<nav class="md-nav" aria-label="Attributes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#applying-attributes" class="md-nav__link">
<span class="md-ellipsis">
Applying Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multiple-attributes" class="md-nav__link">
<span class="md-ellipsis">
Multiple Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#defining-custom-attribute-types" class="md-nav__link">
<span class="md-ellipsis">
Defining Custom Attribute Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#retrieving-attributes" class="md-nav__link">
<span class="md-ellipsis">
Retrieving Attributes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#files-streams" class="md-nav__link">
<span class="md-ellipsis">
Files &amp; Streams
</span>
</a>
<nav class="md-nav" aria-label="Files & Streams">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#position-seeking" class="md-nav__link">
<span class="md-ellipsis">
Position &amp; Seeking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#flushing" class="md-nav__link">
<span class="md-ellipsis">
Flushing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#streamreader-streamwriter-text-files" class="md-nav__link">
<span class="md-ellipsis">
StreamReader &amp; StreamWriter (Text Files)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stringreader-stringwriter" class="md-nav__link">
<span class="md-ellipsis">
StringReader &amp; StringWriter
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#files-directories" class="md-nav__link">
<span class="md-ellipsis">
Files &amp; Directories
</span>
</a>
<nav class="md-nav" aria-label="Files & Directories">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#filestream-class-binary-files" class="md-nav__link">
<span class="md-ellipsis">
FileStream Class (Binary Files)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#file-class" class="md-nav__link">
<span class="md-ellipsis">
File Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#directory-class" class="md-nav__link">
<span class="md-ellipsis">
Directory Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#path-class" class="md-nav__link">
<span class="md-ellipsis">
Path Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fileinfo-directoryinfo-filesysteminfo" class="md-nav__link">
<span class="md-ellipsis">
FileInfo, DirectoryInfo &amp; FileSystemInfo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#clr-serialization" class="md-nav__link">
<span class="md-ellipsis">
CLR Serialization
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#datetime-timespan" class="md-nav__link">
<span class="md-ellipsis">
DateTime &amp; TimeSpan
</span>
</a>
<nav class="md-nav" aria-label="DateTime & TimeSpan">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#timespan-struct" class="md-nav__link">
<span class="md-ellipsis">
TimeSpan Struct
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#memory-efficiency" class="md-nav__link">
<span class="md-ellipsis">
Memory Efficiency
</span>
</a>
<nav class="md-nav" aria-label="Memory Efficiency">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#spant" class="md-nav__link">
<span class="md-ellipsis">
Span&lt;T&gt;
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#memoryt" class="md-nav__link">
<span class="md-ellipsis">
Memory&lt;T&gt;
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#regular-expressions" class="md-nav__link">
<span class="md-ellipsis">
Regular Expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unsafe-code-pointers" class="md-nav__link">
<span class="md-ellipsis">
Unsafe Code &amp; Pointers
</span>
</a>
<nav class="md-nav" aria-label="Unsafe Code & Pointers">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#native-memory" class="md-nav__link">
<span class="md-ellipsis">
Native Memory
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#external-code" class="md-nav__link">
<span class="md-ellipsis">
External Code
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#magic-methods" class="md-nav__link">
<span class="md-ellipsis">
Magic Methods
</span>
</a>
<nav class="md-nav" aria-label="Magic Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#enumerable" class="md-nav__link">
<span class="md-ellipsis">
Enumerable
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#awaitable" class="md-nav__link">
<span class="md-ellipsis">
Awaitable
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-quality" class="md-nav__link">
<span class="md-ellipsis">
Code Quality
</span>
</a>
<nav class="md-nav" aria-label="Code Quality">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#code-analysis" class="md-nav__link">
<span class="md-ellipsis">
Code Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dependency-auditing" class="md-nav__link">
<span class="md-ellipsis">
Dependency Auditing
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="linq.html" class="md-nav__link">
<span class="md-ellipsis">
Linq
</span>
</a>
</li>
<li class="md-nav__item">
<a href="collections.html" class="md-nav__link">
<span class="md-ellipsis">
Collections
</span>
</a>
</li>
<li class="md-nav__item">
<a href="reactive-extensions.html" class="md-nav__link">
<span class="md-ellipsis">
Reactive Extensions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="async-programming.html" class="md-nav__link">
<span class="md-ellipsis">
Async Programming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="unit-tests.html" class="md-nav__link">
<span class="md-ellipsis">
Unit Tests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_2" >
<label class="md-nav__link" for="__nav_4_9_2" id="__nav_4_9_2_label" tabindex="0">
<span class="md-ellipsis">
ASP.NET
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_9_2">
<span class="md-nav__icon md-icon"></span>
ASP.NET
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../asp.net/minimal-api.html" class="md-nav__link">
<span class="md-ellipsis">
Minimal API
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../asp.net/filters.html" class="md-nav__link">
<span class="md-ellipsis">
FIlters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../asp.net/middleware.html" class="md-nav__link">
<span class="md-ellipsis">
Middleware
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../asp.net/razor-syntax.html" class="md-nav__link">
<span class="md-ellipsis">
Razor Syntax
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../asp.net/blazor.html" class="md-nav__link">
<span class="md-ellipsis">
Blazor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../asp.net/signalr.html" class="md-nav__link">
<span class="md-ellipsis">
SignalR
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../asp.net/web-forms.html" class="md-nav__link">
<span class="md-ellipsis">
Web Forms
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_3" >
<label class="md-nav__link" for="__nav_4_9_3" id="__nav_4_9_3_label" tabindex="0">
<span class="md-ellipsis">
Database
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_9_3">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../database/ado.net.html" class="md-nav__link">
<span class="md-ellipsis">
ADO.NET
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../database/entity-framework.html" class="md-nav__link">
<span class="md-ellipsis">
Entity Framework
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10" >
<label class="md-nav__link" for="__nav_4_10" id="__nav_4_10_label" tabindex="">
<span class="md-ellipsis">
Java
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_10">
<span class="md-nav__icon md-icon"></span>
Java
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../java/java.html" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../java/java-collection-framework.html" class="md-nav__link">
<span class="md-ellipsis">
Java Collection Framework
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../java/dao.html" class="md-nav__link">
<span class="md-ellipsis">
DAO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10_4" >
<label class="md-nav__link" for="__nav_4_10_4" id="__nav_4_10_4_label" tabindex="0">
<span class="md-ellipsis">
Web
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_10_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_10_4">
<span class="md-nav__icon md-icon"></span>
Web
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../java/web/servlet.html" class="md-nav__link">
<span class="md-ellipsis">
Serverlet
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10_4_2" >
<label class="md-nav__link" for="__nav_4_10_4_2" id="__nav_4_10_4_2_label" tabindex="0">
<span class="md-ellipsis">
Spring
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_4_10_4_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_10_4_2">
<span class="md-nav__icon md-icon"></span>
Spring
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../java/spring/pom.xml.html" class="md-nav__link">
<span class="md-ellipsis">
POM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../java/spring/spring-project.html" class="md-nav__link">
<span class="md-ellipsis">
Project Structure
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_11" >
<label class="md-nav__link" for="__nav_4_11" id="__nav_4_11_label" tabindex="">
<span class="md-ellipsis">
PHP
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_11">
<span class="md-nav__icon md-icon"></span>
PHP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../php/php.html" class="md-nav__link">
<span class="md-ellipsis">
PHP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/database.html" class="md-nav__link">
<span class="md-ellipsis">
Database
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/web.html" class="md-nav__link">
<span class="md-ellipsis">
Web
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/dependency-injection.html" class="md-nav__link">
<span class="md-ellipsis">
Dependency Injection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/unit-tests.html" class="md-nav__link">
<span class="md-ellipsis">
Unit Tests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/composer.html" class="md-nav__link">
<span class="md-ellipsis">
Composer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/psr-7.html" class="md-nav__link">
<span class="md-ellipsis">
PSR 7
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/plates-templating.html" class="md-nav__link">
<span class="md-ellipsis">
Plates
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_11_9" >
<label class="md-nav__link" for="__nav_4_11_9" id="__nav_4_11_9_label" tabindex="0">
<span class="md-ellipsis">
Simple MVC
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_11_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_11_9">
<span class="md-nav__icon md-icon"></span>
Simple MVC
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../php/simple-mvc/simple-mvc.html" class="md-nav__link">
<span class="md-ellipsis">
Simple MVC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../php/simple-mvc/rest-api.html" class="md-nav__link">
<span class="md-ellipsis">
REST API
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_12" >
<label class="md-nav__link" for="__nav_4_12" id="__nav_4_12_label" tabindex="">
<span class="md-ellipsis">
Rust
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_12">
<span class="md-nav__icon md-icon"></span>
Rust
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../rust/rust.html" class="md-nav__link">
<span class="md-ellipsis">
Rust
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../rust/macros.html" class="md-nav__link">
<span class="md-ellipsis">
Macros
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../rust/cargo.html" class="md-nav__link">
<span class="md-ellipsis">
Cargo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../rust/concurrency.html" class="md-nav__link">
<span class="md-ellipsis">
Concurrency
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../rust/unit-tests.html" class="md-nav__link">
<span class="md-ellipsis">
Unit Tests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_13" >
<label class="md-nav__link" for="__nav_4_13" id="__nav_4_13_label" tabindex="">
<span class="md-ellipsis">
Javascript
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_13">
<span class="md-nav__icon md-icon"></span>
Javascript
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../javascript/javascript.html" class="md-nav__link">
<span class="md-ellipsis">
Javascript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/dom.html" class="md-nav__link">
<span class="md-ellipsis">
DOM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/events-animation.html" class="md-nav__link">
<span class="md-ellipsis">
Events & Animation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/ajax.html" class="md-nav__link">
<span class="md-ellipsis">
AJAX
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/jquery.html" class="md-nav__link">
<span class="md-ellipsis">
jQuery
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_13_6" >
<label class="md-nav__link" for="__nav_4_13_6" id="__nav_4_13_6_label" tabindex="0">
<span class="md-ellipsis">
React
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_13_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_13_6">
<span class="md-nav__icon md-icon"></span>
React
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../javascript/react/react.html" class="md-nav__link">
<span class="md-ellipsis">
React
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/react/react-router.html" class="md-nav__link">
<span class="md-ellipsis">
React Router
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/react/react-tests.html" class="md-nav__link">
<span class="md-ellipsis">
React Tests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/react/redux.html" class="md-nav__link">
<span class="md-ellipsis">
Redux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../javascript/react/redux-tests.html" class="md-nav__link">
<span class="md-ellipsis">
Redux Tests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../javascript/svelte/svelte.html" class="md-nav__link">
<span class="md-ellipsis">
Svelte
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_14" >
<label class="md-nav__link" for="__nav_4_14" id="__nav_4_14_label" tabindex="">
<span class="md-ellipsis">
PowerShell
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_14">
<span class="md-nav__icon md-icon"></span>
PowerShell
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../powershell/scripting.html" class="md-nav__link">
<span class="md-ellipsis">
Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../powershell/commands.html" class="md-nav__link">
<span class="md-ellipsis">
Commands
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_15" >
<label class="md-nav__link" for="__nav_4_15" id="__nav_4_15_label" tabindex="">
<span class="md-ellipsis">
Bash
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_15">
<span class="md-nav__icon md-icon"></span>
Bash
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../bash/scripting.html" class="md-nav__link">
<span class="md-ellipsis">
Scripting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../bash/commands.html" class="md-nav__link">
<span class="md-ellipsis">
Commands
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Misc
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Misc
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
VCS
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
VCS
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../misc/vcs/git.html" class="md-nav__link">
<span class="md-ellipsis">
Git
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../misc/vcs/jj.html" class="md-nav__link">
<span class="md-ellipsis">
JJ
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../../misc/graph-ql.html" class="md-nav__link">
<span class="md-ellipsis">
GraphQL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../misc/regular-expressions.html" class="md-nav__link">
<span class="md-ellipsis">
RegEx
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../misc/ssh.html" class="md-nav__link">
<span class="md-ellipsis">
SSH
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../misc/web-components.html" class="md-nav__link">
<span class="md-ellipsis">
WebComponents
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Linux
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Linux
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_1" >
<label class="md-nav__link" for="__nav_6_1" id="__nav_6_1_label" tabindex="0">
<span class="md-ellipsis">
Filesystem
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6_1">
<span class="md-nav__icon md-icon"></span>
Filesystem
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../linux/filesystem/file-links.html" class="md-nav__link">
<span class="md-ellipsis">
File Links
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../linux/filesystem/procfs.html" class="md-nav__link">
<span class="md-ellipsis">
/proc
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../linux/filesystem/sysfs.html" class="md-nav__link">
<span class="md-ellipsis">
/sys
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" >
<label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="0">
<span class="md-ellipsis">
System Init
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6_2">
<span class="md-nav__icon md-icon"></span>
System Init
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../linux/init/systemd.html" class="md-nav__link">
<span class="md-ellipsis">
Systemd
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../linux/init/open-rc.html" class="md-nav__link">
<span class="md-ellipsis">
OpenRC
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#basics" class="md-nav__link">
<span class="md-ellipsis">
Basics
</span>
</a>
<nav class="md-nav" aria-label="Basics">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#comments" class="md-nav__link">
<span class="md-ellipsis">
Comments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#docstring-structure" class="md-nav__link">
<span class="md-ellipsis">
Docstring Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-convention" class="md-nav__link">
<span class="md-ellipsis">
Naming Convention
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#namespaces-imports-aliases" class="md-nav__link">
<span class="md-ellipsis">
Namespaces, Imports &amp; Aliases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#top-level-statementsprograms-c-9" class="md-nav__link">
<span class="md-ellipsis">
Top Level Statements/Programs (C# 9)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#main-method" class="md-nav__link">
<span class="md-ellipsis">
Main Method
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#constant-declaration" class="md-nav__link">
<span class="md-ellipsis">
Constant Declaration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assignment-operation" class="md-nav__link">
<span class="md-ellipsis">
Assignment Operation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#input" class="md-nav__link">
<span class="md-ellipsis">
Input
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#screen-output" class="md-nav__link">
<span class="md-ellipsis">
Screen Output
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#string-formatting" class="md-nav__link">
<span class="md-ellipsis">
String Formatting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#number-format-string" class="md-nav__link">
<span class="md-ellipsis">
Number Format String
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#variable-types" class="md-nav__link">
<span class="md-ellipsis">
Variable Types
</span>
</a>
<nav class="md-nav" aria-label="Variable Types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#value-type" class="md-nav__link">
<span class="md-ellipsis">
Value Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reference-type" class="md-nav__link">
<span class="md-ellipsis">
Reference Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#integer-numeric-types" class="md-nav__link">
<span class="md-ellipsis">
Integer Numeric Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#floating-point-numeric-types" class="md-nav__link">
<span class="md-ellipsis">
Floating-Point Numeric Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#biginteger" class="md-nav__link">
<span class="md-ellipsis">
BigInteger
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#binary-hexadecimal-numbers" class="md-nav__link">
<span class="md-ellipsis">
Binary &amp; Hexadecimal Numbers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#boolean-type-systemboolean" class="md-nav__link">
<span class="md-ellipsis">
Boolean Type (System.Boolean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#text-type-systemchar-systemstring" class="md-nav__link">
<span class="md-ellipsis">
Text Type (System.Char &amp; System.String)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#implicit-type" class="md-nav__link">
<span class="md-ellipsis">
Implicit Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dynamic-type" class="md-nav__link">
<span class="md-ellipsis">
Dynamic Type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#anonymous-types-reference-type" class="md-nav__link">
<span class="md-ellipsis">
Anonymous types (Reference Type)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#index-range-types-structs" class="md-nav__link">
<span class="md-ellipsis">
Index &amp; Range Types (Structs)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#tuples-value-type" class="md-nav__link">
<span class="md-ellipsis">
Tuples (Value Type)
</span>
</a>
<nav class="md-nav" aria-label="Tuples (Value Type)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#tuple-deconstruction" class="md-nav__link">
<span class="md-ellipsis">
Tuple Deconstruction
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#records" class="md-nav__link">
<span class="md-ellipsis">
Records
</span>
</a>
<nav class="md-nav" aria-label="Records">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#with-expressions" class="md-nav__link">
<span class="md-ellipsis">
with-expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#with-expressions-inheritance" class="md-nav__link">
<span class="md-ellipsis">
with-expressions &amp; Inheritance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#value-based-equality-inheritance" class="md-nav__link">
<span class="md-ellipsis">
Value-based Equality &amp; Inheritance
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#strings" class="md-nav__link">
<span class="md-ellipsis">
Strings
</span>
</a>
<nav class="md-nav" aria-label="Strings">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#string-methods-not-in-place" class="md-nav__link">
<span class="md-ellipsis">
String Methods (Not In-Place)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#raw-string-literals" class="md-nav__link">
<span class="md-ellipsis">
Raw string literals
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#nullable-types" class="md-nav__link">
<span class="md-ellipsis">
Nullable Types
</span>
</a>
<nav class="md-nav" aria-label="Nullable Types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nullable-value-types" class="md-nav__link">
<span class="md-ellipsis">
Nullable value types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nullable-reference-types" class="md-nav__link">
<span class="md-ellipsis">
Nullable reference types
</span>
</a>
<nav class="md-nav" aria-label="Nullable reference types">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nullability-of-types" class="md-nav__link">
<span class="md-ellipsis">
Nullability of types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nullable-context" class="md-nav__link">
<span class="md-ellipsis">
Nullable Context
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#null-conditional-null-coalescing-null-forgiving-operator-null-checks" class="md-nav__link">
<span class="md-ellipsis">
Null Conditional, Null Coalescing, Null Forgiving Operator, Null Checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nullable-attributes" class="md-nav__link">
<span class="md-ellipsis">
Nullable Attributes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#type-conversion" class="md-nav__link">
<span class="md-ellipsis">
Type Conversion
</span>
</a>
<nav class="md-nav" aria-label="Type Conversion">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#converting-from-any-type-to-a-string" class="md-nav__link">
<span class="md-ellipsis">
Converting from any type to a string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#number-downcasting" class="md-nav__link">
<span class="md-ellipsis">
Number Downcasting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#converting-from-a-binary-object-to-a-string" class="md-nav__link">
<span class="md-ellipsis">
Converting from a binary object to a string
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#parsing-from-strings-to-numbers-or-dates-and-times" class="md-nav__link">
<span class="md-ellipsis">
Parsing from strings to numbers or dates and times
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#preprocessor-directives" class="md-nav__link">
<span class="md-ellipsis">
Preprocessor Directives
</span>
</a>
<nav class="md-nav" aria-label="Preprocessor Directives">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#error-and-warning" class="md-nav__link">
<span class="md-ellipsis">
#error and #warning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pragma" class="md-nav__link">
<span class="md-ellipsis">
#pragma
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#expressions-operators" class="md-nav__link">
<span class="md-ellipsis">
Expressions &amp; Operators
</span>
</a>
<nav class="md-nav" aria-label="Expressions & Operators">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#primary-expressions" class="md-nav__link">
<span class="md-ellipsis">
Primary Expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unary-operators" class="md-nav__link">
<span class="md-ellipsis">
Unary Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mathematical-operators" class="md-nav__link">
<span class="md-ellipsis">
Mathematical Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#relational-operators" class="md-nav__link">
<span class="md-ellipsis">
Relational Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#logical-operators" class="md-nav__link">
<span class="md-ellipsis">
Logical Operators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assignment" class="md-nav__link">
<span class="md-ellipsis">
Assignment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conditional-operator" class="md-nav__link">
<span class="md-ellipsis">
Conditional Operator
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#decision-statements" class="md-nav__link">
<span class="md-ellipsis">
Decision Statements
</span>
</a>
<nav class="md-nav" aria-label="Decision Statements">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#if-else-if-else" class="md-nav__link">
<span class="md-ellipsis">
If-Else If-Else
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pattern-matching" class="md-nav__link">
<span class="md-ellipsis">
Pattern Matching
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#switch" class="md-nav__link">
<span class="md-ellipsis">
Switch
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#loop-statements" class="md-nav__link">
<span class="md-ellipsis">
Loop Statements
</span>
</a>
<nav class="md-nav" aria-label="Loop Statements">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#while-loop" class="md-nav__link">
<span class="md-ellipsis">
While Loop
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#do-while-loop" class="md-nav__link">
<span class="md-ellipsis">
Do-While Loop
</span>
</a>
<nav class="md-nav" aria-label="Do-While Loop">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#for-loop" class="md-nav__link">
<span class="md-ellipsis">
For Loop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#foreach-loop" class="md-nav__link">
<span class="md-ellipsis">
Foreach Loop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#break-continue" class="md-nav__link">
<span class="md-ellipsis">
Break, Continue
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#yield-statement" class="md-nav__link">
<span class="md-ellipsis">
Yield Statement
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#context-statement-using-declarations" class="md-nav__link">
<span class="md-ellipsis">
Context Statement &amp; Using Declarations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#checkedunchecked-statements" class="md-nav__link">
<span class="md-ellipsis">
Checked/Unchecked Statements
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#exception-handling" class="md-nav__link">
<span class="md-ellipsis">
Exception Handling
</span>
</a>
<nav class="md-nav" aria-label="Exception Handling">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#throwing-exceptions" class="md-nav__link">
<span class="md-ellipsis">
Throwing Exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-exceptions" class="md-nav__link">
<span class="md-ellipsis">
Custom Exceptions
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#enums" class="md-nav__link">
<span class="md-ellipsis">
Enums
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#methods" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
<nav class="md-nav" aria-label="Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#expression-body-definition" class="md-nav__link">
<span class="md-ellipsis">
Expression Body Definition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#arbitrary-number-of-parameter-in-methods" class="md-nav__link">
<span class="md-ellipsis">
Arbitrary Number Of Parameter In Methods
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#named-arguments" class="md-nav__link">
<span class="md-ellipsis">
Named Arguments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-arguments" class="md-nav__link">
<span class="md-ellipsis">
Optional Arguments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#passing-values-by-reference-ref-out-in" class="md-nav__link">
<span class="md-ellipsis">
Passing Values By Reference (ref, out, in)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returning-multiple-values-with-tuples" class="md-nav__link">
<span class="md-ellipsis">
Returning Multiple Values with Tuples
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#returning-multiple-values-w-structs-return-struct-variable" class="md-nav__link">
<span class="md-ellipsis">
Returning Multiple Values W/ Structs (Return Struct Variable)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#local-functions" class="md-nav__link">
<span class="md-ellipsis">
Local Functions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#extension-methods" class="md-nav__link">
<span class="md-ellipsis">
Extension Methods
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#iterators" class="md-nav__link">
<span class="md-ellipsis">
Iterators
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#structs-custom-value-types-classes-custom-reference-types" class="md-nav__link">
<span class="md-ellipsis">
Structs (Custom Value Types) &amp; Classes (Custom Reference Types)
</span>
</a>
<nav class="md-nav" aria-label="Structs (Custom Value Types) & Classes (Custom Reference Types)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#modifiers-methods-variables" class="md-nav__link">
<span class="md-ellipsis">
Modifiers (Methods &amp; Variables)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#methods_1" class="md-nav__link">
<span class="md-ellipsis">
Methods
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#properties-fields" class="md-nav__link">
<span class="md-ellipsis">
Properties &amp; Fields
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#object-and-collection-initializers" class="md-nav__link">
<span class="md-ellipsis">
Object and Collection Initializers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#static-class" class="md-nav__link">
<span class="md-ellipsis">
Static Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#class-members-init-order" class="md-nav__link">
<span class="md-ellipsis">
Class Members Init Order
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#indexers" class="md-nav__link">
<span class="md-ellipsis">
Indexers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#abstract-classes" class="md-nav__link">
<span class="md-ellipsis">
Abstract Classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cloning" class="md-nav__link">
<span class="md-ellipsis">
Cloning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deconstruction" class="md-nav__link">
<span class="md-ellipsis">
Deconstruction
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#operator-overloading" class="md-nav__link">
<span class="md-ellipsis">
Operator Overloading
</span>
</a>
<nav class="md-nav" aria-label="Operator Overloading">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#nested-types" class="md-nav__link">
<span class="md-ellipsis">
Nested Types
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#interfaces" class="md-nav__link">
<span class="md-ellipsis">
Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#generics" class="md-nav__link">
<span class="md-ellipsis">
Generics
</span>
</a>
<nav class="md-nav" aria-label="Generics">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#multiple-generics" class="md-nav__link">
<span class="md-ellipsis">
Multiple Generics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#parameters-constraints" class="md-nav__link">
<span class="md-ellipsis">
Parameters Constraints
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#inheritance" class="md-nav__link">
<span class="md-ellipsis">
Inheritance
</span>
</a>
<nav class="md-nav" aria-label="Inheritance">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#downcasting" class="md-nav__link">
<span class="md-ellipsis">
Downcasting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#inheritance-constructors" class="md-nav__link">
<span class="md-ellipsis">
Inheritance &amp; Constructors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#generics-inheritance" class="md-nav__link">
<span class="md-ellipsis">
Generics Inheritance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#covariance-contravariance-only-for-interfaces" class="md-nav__link">
<span class="md-ellipsis">
Covariance &amp; Contravariance (only for interfaces)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#delegates" class="md-nav__link">
<span class="md-ellipsis">
Delegates
</span>
</a>
<nav class="md-nav" aria-label="Delegates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#multicast-delegates" class="md-nav__link">
<span class="md-ellipsis">
Multicast Delegates
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#delegate-invocation" class="md-nav__link">
<span class="md-ellipsis">
Delegate Invocation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#common-delegate-types" class="md-nav__link">
<span class="md-ellipsis">
Common Delegate Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#type-compatibility" class="md-nav__link">
<span class="md-ellipsis">
Type Compatibility
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#anonymous-functions-lambda-expressions" class="md-nav__link">
<span class="md-ellipsis">
Anonymous Functions (Lambda Expressions)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
<nav class="md-nav" aria-label="Events">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#registering-event-handlers" class="md-nav__link">
<span class="md-ellipsis">
Registering Event Handlers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#built-in-eventhandler-delegate" class="md-nav__link">
<span class="md-ellipsis">
Built-In EventHandler Delegate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#custom-event-args" class="md-nav__link">
<span class="md-ellipsis">
Custom Event Args
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#assemblies" class="md-nav__link">
<span class="md-ellipsis">
Assemblies
</span>
</a>
<nav class="md-nav" aria-label="Assemblies">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#anatomy-of-an-assembly" class="md-nav__link">
<span class="md-ellipsis">
Anatomy of an Assembly
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#net-metadata" class="md-nav__link">
<span class="md-ellipsis">
.NET MEtadata
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#resources" class="md-nav__link">
<span class="md-ellipsis">
Resources
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multifile-assembly" class="md-nav__link">
<span class="md-ellipsis">
Multifile Assembly
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#assembly-resolution" class="md-nav__link">
<span class="md-ellipsis">
Assembly Resolution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#self-contained-deployment" class="md-nav__link">
<span class="md-ellipsis">
Self-Contained Deployment
</span>
</a>
<nav class="md-nav" aria-label="Self-Contained Deployment">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#framework-dependent-deployment" class="md-nav__link">
<span class="md-ellipsis">
Framework-Dependent Deployment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#assembly-names" class="md-nav__link">
<span class="md-ellipsis">
Assembly Names
</span>
</a>
<nav class="md-nav" aria-label="Assembly Names">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#strong-names" class="md-nav__link">
<span class="md-ellipsis">
Strong Names
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#version" class="md-nav__link">
<span class="md-ellipsis">
Version
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#culture" class="md-nav__link">
<span class="md-ellipsis">
Culture
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#reflection" class="md-nav__link">
<span class="md-ellipsis">
Reflection
</span>
</a>
<nav class="md-nav" aria-label="Reflection">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#assembly" class="md-nav__link">
<span class="md-ellipsis">
Assembly
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#attributes" class="md-nav__link">
<span class="md-ellipsis">
Attributes
</span>
</a>
<nav class="md-nav" aria-label="Attributes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#applying-attributes" class="md-nav__link">
<span class="md-ellipsis">
Applying Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multiple-attributes" class="md-nav__link">
<span class="md-ellipsis">
Multiple Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#defining-custom-attribute-types" class="md-nav__link">
<span class="md-ellipsis">
Defining Custom Attribute Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#retrieving-attributes" class="md-nav__link">
<span class="md-ellipsis">
Retrieving Attributes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#files-streams" class="md-nav__link">
<span class="md-ellipsis">
Files &amp; Streams
</span>
</a>
<nav class="md-nav" aria-label="Files & Streams">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#position-seeking" class="md-nav__link">
<span class="md-ellipsis">
Position &amp; Seeking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#flushing" class="md-nav__link">
<span class="md-ellipsis">
Flushing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#streamreader-streamwriter-text-files" class="md-nav__link">
<span class="md-ellipsis">
StreamReader &amp; StreamWriter (Text Files)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stringreader-stringwriter" class="md-nav__link">
<span class="md-ellipsis">
StringReader &amp; StringWriter
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#files-directories" class="md-nav__link">
<span class="md-ellipsis">
Files &amp; Directories
</span>
</a>
<nav class="md-nav" aria-label="Files & Directories">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#filestream-class-binary-files" class="md-nav__link">
<span class="md-ellipsis">
FileStream Class (Binary Files)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#file-class" class="md-nav__link">
<span class="md-ellipsis">
File Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#directory-class" class="md-nav__link">
<span class="md-ellipsis">
Directory Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#path-class" class="md-nav__link">
<span class="md-ellipsis">
Path Class
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#fileinfo-directoryinfo-filesysteminfo" class="md-nav__link">
<span class="md-ellipsis">
FileInfo, DirectoryInfo &amp; FileSystemInfo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#clr-serialization" class="md-nav__link">
<span class="md-ellipsis">
CLR Serialization
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#datetime-timespan" class="md-nav__link">
<span class="md-ellipsis">
DateTime &amp; TimeSpan
</span>
</a>
<nav class="md-nav" aria-label="DateTime & TimeSpan">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#timespan-struct" class="md-nav__link">
<span class="md-ellipsis">
TimeSpan Struct
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#memory-efficiency" class="md-nav__link">
<span class="md-ellipsis">
Memory Efficiency
</span>
</a>
<nav class="md-nav" aria-label="Memory Efficiency">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#spant" class="md-nav__link">
<span class="md-ellipsis">
Span&lt;T&gt;
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#memoryt" class="md-nav__link">
<span class="md-ellipsis">
Memory&lt;T&gt;
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#regular-expressions" class="md-nav__link">
<span class="md-ellipsis">
Regular Expressions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unsafe-code-pointers" class="md-nav__link">
<span class="md-ellipsis">
Unsafe Code &amp; Pointers
</span>
</a>
<nav class="md-nav" aria-label="Unsafe Code & Pointers">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#native-memory" class="md-nav__link">
<span class="md-ellipsis">
Native Memory
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#external-code" class="md-nav__link">
<span class="md-ellipsis">
External Code
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#magic-methods" class="md-nav__link">
<span class="md-ellipsis">
Magic Methods
</span>
</a>
<nav class="md-nav" aria-label="Magic Methods">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#enumerable" class="md-nav__link">
<span class="md-ellipsis">
Enumerable
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#awaitable" class="md-nav__link">
<span class="md-ellipsis">
Awaitable
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#code-quality" class="md-nav__link">
<span class="md-ellipsis">
Code Quality
</span>
</a>
<nav class="md-nav" aria-label="Code Quality">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#code-analysis" class="md-nav__link">
<span class="md-ellipsis">
Code Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#dependency-auditing" class="md-nav__link">
<span class="md-ellipsis">
Dependency Auditing
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="c"><code>C#</code></h1>
<p><strong>.NET</strong> Core is a development platform that includes a <strong>Common Language Runtime</strong> (<strong>CoreCLR</strong>), which manages the execution of code, and a <strong>Base Class Library</strong> (<strong>BCL</strong>), which provides a rich library of classes to build applications from.</p>
<p>The C# compiler (named <strong>Roslyn</strong>) used by the dotnet CLI tool converts C# source code into <strong>intermediate language</strong> (<strong>IL</strong>) code and stores the IL in an <em>assembly</em> (a DLL or EXE file).<br />
IL code statements are like assembly language instructions, which are executed by .NET Core's virtual machine, known as <strong>CoreCLR</strong>.</p>
<p>At runtime, CoreCLR loads the IL code from the assembly, the <strong>just-in-time</strong> (JIT) compiler compiles it into native CPU instructions, and then it is executed by the CPU on your machine.<br />
The benefit of this three-step compilation process is that Microsoft's able to create CLRs for Linux and macOS, as well as for Windows.<br />
The same IL code runs everywhere because of the second compilation process, which generates code for the native operating system and CPU instruction set.<br />
Regardless of which language the source code is written in, for example, C#, Visual Basic or F#, all .NET applications use IL code for their instructions stored in an assembly.</p>
<p>Another .NET initiative is called <em>.NET Native</em>. This compiles C# code to native CPU instructions <strong>ahead of time</strong> (<strong>AoT</strong>), rather than using the CLR to compile IL code JIT
to native code later.<br />
.NET Native improves execution speed and reduces the memory footprint for applications because the native code is generated at build time and then deployed instead of the IL code.</p>
<h2 id="basics">Basics</h2>
<h3 id="comments">Comments</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span>
<span class="normal"><a href="#__codelineno-0-2">2</a></span>
<span class="normal"><a href="#__codelineno-0-3">3</a></span>
<span class="normal"><a href="#__codelineno-0-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="c1">// comment</span>
<a id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="cm">/* multi line comment */</span>
<a id="__codelineno-0-3" name="__codelineno-0-3"></a><span class="c1">/// single line xml comment (docstring)</span>
<a id="__codelineno-0-4" name="__codelineno-0-4"></a><span class="cm">/** multi line xml string (docstring) */</span>
</code></pre></div></td></tr></table></div>
<h3 id="docstring-structure">Docstring Structure</h3>
<p><code>/** &lt;tag&gt; content &lt;/tag&gt; **/</code></p>
<h3 id="naming-convention">Naming Convention</h3>
<table>
<thead>
<tr>
<th>Element</th>
<th>Case</th>
</tr>
</thead>
<tbody>
<tr>
<td>Namespace</td>
<td>PascalCase</td>
</tr>
<tr>
<td>Class, Interface</td>
<td>PascalCase</td>
</tr>
<tr>
<td>Method</td>
<td>PascalCase</td>
</tr>
<tr>
<td>Field, Property</td>
<td>PascalCase</td>
</tr>
<tr>
<td>Event, Enum, Enum Value,</td>
<td>PascalCase</td>
</tr>
<tr>
<td>Variables, Parameters</td>
<td>camelCase</td>
</tr>
</tbody>
</table>
<h3 id="namespaces-imports-aliases">Namespaces, Imports &amp; Aliases</h3>
<p>Hierarchic organization of programs an libraries.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-1-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-1-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-1-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-1-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-1-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-1-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-1-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-1-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-1-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-1-10">10</a></span>
<span class="normal"><a href="#__codelineno-1-11">11</a></span>
<span class="normal"><a href="#__codelineno-1-12">12</a></span>
<span class="normal"><a href="#__codelineno-1-13">13</a></span>
<span class="normal"><a href="#__codelineno-1-14">14</a></span>
<span class="normal"><a href="#__codelineno-1-15">15</a></span>
<span class="normal"><a href="#__codelineno-1-16">16</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span><span class="w"> </span><span class="c1">// import the System Namespace</span>
<a id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="k">using</span><span class="w"> </span><span class="nn">static</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">Console</span><span class="p">;</span><span class="w"> </span><span class="c1">// statically import a class to use its static methods w/o qualification</span>
<a id="__codelineno-1-3" name="__codelineno-1-3"></a>
<a id="__codelineno-1-4" name="__codelineno-1-4"></a><span class="c1">// type aliases</span>
<a id="__codelineno-1-5" name="__codelineno-1-5"></a><span class="k">using</span><span class="w"> </span><span class="nn">Alias</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Namespace</span><span class="p">.</span><span class="n">SubNamespace</span><span class="p">.</span><span class="n">Type</span><span class="p">;</span>
<a id="__codelineno-1-6" name="__codelineno-1-6"></a><span class="k">using</span><span class="w"> </span><span class="nn">LookupTable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-1-7" name="__codelineno-1-7"></a><span class="k">using</span><span class="w"> </span><span class="nn">Points</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">)[];</span>
<a id="__codelineno-1-8" name="__codelineno-1-8"></a>
<a id="__codelineno-1-9" name="__codelineno-1-9"></a><span class="c1">// global using [C# 10], should be in dedicated file</span>
<a id="__codelineno-1-10" name="__codelineno-1-10"></a><span class="n">global</span><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="err">&lt;</span><span class="nn">namespace</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-1-11" name="__codelineno-1-11"></a>
<a id="__codelineno-1-12" name="__codelineno-1-12"></a><span class="k">namespace</span><span class="w"> </span><span class="nn">Namespace</span><span class="p">;</span><span class="w"> </span><span class="c1">// [C# 10]</span>
<a id="__codelineno-1-13" name="__codelineno-1-13"></a><span class="c1">//or</span>
<a id="__codelineno-1-14" name="__codelineno-1-14"></a><span class="k">namespace</span><span class="w"> </span><span class="nn">Namespace</span><span class="w"> </span>
<a id="__codelineno-1-15" name="__codelineno-1-15"></a><span class="p">{</span>
<a id="__codelineno-1-16" name="__codelineno-1-16"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<p>To enable .NET 6/C# 10 <strong>implicit namespace imports</strong>:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">XML</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-2-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="nt">&lt;ImplicitUsings&gt;</span>enable<span class="nt">&lt;/ImplicitUsings&gt;</span>
</code></pre></div></td></tr></table></div>
<h3 id="top-level-statementsprograms-c-9">Top Level Statements/Programs (C# 9)</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-3-1">1</a></span>
<span class="normal"><a href="#__codelineno-3-2">2</a></span>
<span class="normal"><a href="#__codelineno-3-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1"></a><span class="c1">// imports</span>
<a id="__codelineno-3-2" name="__codelineno-3-2"></a>
<a id="__codelineno-3-3" name="__codelineno-3-3"></a><span class="c1">// code here, no main, no namespace</span>
</code></pre></div></td></tr></table></div>
<h3 id="main-method">Main Method</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-4-1">1</a></span>
<span class="normal"><a href="#__codelineno-4-2">2</a></span>
<span class="normal"><a href="#__codelineno-4-3">3</a></span>
<span class="normal"><a href="#__codelineno-4-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1"></a><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span>
<a id="__codelineno-4-2" name="__codelineno-4-2"></a><span class="p">{</span>
<a id="__codelineno-4-3" name="__codelineno-4-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-4-4" name="__codelineno-4-4"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="constant-declaration">Constant Declaration</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-5-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1"></a><span class="k">const</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">CONSTANT_NAME</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
</code></pre></div></td></tr></table></div>
<h3 id="assignment-operation">Assignment Operation</h3>
<p><code>type variable1 = value1, variable2 = value2, ...;</code></p>
<p>If a variable has not been assigned it assumes the <code>default</code> value.</p>
<h3 id="input">Input</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-6-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-6-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-6-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-6-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-6-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-6-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-6-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-6-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-6-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-6-10">10</a></span>
<span class="normal"><a href="#__codelineno-6-11">11</a></span>
<span class="normal"><a href="#__codelineno-6-12">12</a></span>
<span class="normal"><a href="#__codelineno-6-13">13</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1"></a><span class="c1">// input is a string, convert before saving in a non String variable</span>
<a id="__codelineno-6-2" name="__codelineno-6-2"></a><span class="n">Console</span><span class="p">.</span><span class="n">ReadLines</span><span class="p">();</span><span class="w"> </span><span class="c1">// read util &lt;Return&gt; is pressed</span>
<a id="__codelineno-6-3" name="__codelineno-6-3"></a><span class="n">Console</span><span class="p">.</span><span class="n">Read</span><span class="p">();</span><span class="w"> </span><span class="c1">// read until space</span>
<a id="__codelineno-6-4" name="__codelineno-6-4"></a>
<a id="__codelineno-6-5" name="__codelineno-6-5"></a><span class="c1">// reading non string input</span>
<a id="__codelineno-6-6" name="__codelineno-6-6"></a><span class="o">&lt;</span><span class="n">SystemType</span><span class="o">/</span><span class="n">Type</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">Console</span><span class="p">.</span><span class="n">ReadLines</span><span class="p">());</span><span class="w"> </span><span class="c1">// convert string to numerical data type (can cause exception at runtime)</span>
<a id="__codelineno-6-7" name="__codelineno-6-7"></a><span class="n">Convert</span><span class="p">.</span><span class="n">To</span><span class="o">&lt;</span><span class="n">SystemType</span><span class="o">&gt;</span><span class="p">(</span><span class="n">Console</span><span class="p">.</span><span class="n">ReadLines</span><span class="p">());</span><span class="w"> </span><span class="c1">// proper conversion and round-up of values (no truncation of values), NULL returns 0 (zero)</span>
<a id="__codelineno-6-8" name="__codelineno-6-8"></a>
<a id="__codelineno-6-9" name="__codelineno-6-9"></a><span class="c1">// integers numeric base conversion</span>
<a id="__codelineno-6-10" name="__codelineno-6-10"></a><span class="n">Convert</span><span class="p">.</span><span class="n">ToString</span><span class="p">(</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="o">&lt;</span><span class="k">base</span><span class="o">&gt;</span><span class="p">);</span><span class="w"> </span><span class="c1">// to specified numeric base</span>
<a id="__codelineno-6-11" name="__codelineno-6-11"></a><span class="n">Convert</span><span class="p">.</span><span class="n">ToInt32</span><span class="p">(</span><span class="kt">string</span><span class="p">,</span><span class="w"> </span><span class="o">&lt;</span><span class="k">base</span><span class="o">&gt;</span><span class="p">);</span><span class="w"> </span><span class="c1">// parse from numeric base</span>
<a id="__codelineno-6-12" name="__codelineno-6-12"></a>
<a id="__codelineno-6-13" name="__codelineno-6-13"></a><span class="n">Console</span><span class="p">.</span><span class="n">ReadKey</span><span class="p">();</span><span class="w"> </span><span class="c1">// read a key from keyboard and display pressed kay immediately</span>
</code></pre></div></td></tr></table></div>
<h3 id="screen-output">Screen Output</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-7-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1"></a><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">();</span><span class="w"> </span><span class="c1">// single line output</span>
</code></pre></div></td></tr></table></div>
<h3 id="string-formatting">String Formatting</h3>
<p><code>{index[,alignment][:&lt;formatString&gt;&lt;num_decimal_digits&gt;]}</code></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-8-1">1</a></span>
<span class="normal"><a href="#__codelineno-8-2">2</a></span>
<span class="normal"><a href="#__codelineno-8-3">3</a></span>
<span class="normal"><a href="#__codelineno-8-4">4</a></span>
<span class="normal"><a href="#__codelineno-8-5">5</a></span>
<span class="normal"><a href="#__codelineno-8-6">6</a></span>
<span class="normal"><a href="#__codelineno-8-7">7</a></span>
<span class="normal"><a href="#__codelineno-8-8">8</a></span>
<span class="normal"><a href="#__codelineno-8-9">9</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1"></a><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Name is {0}, Marks are {1}&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">marks</span><span class="p">);</span><span class="w"> </span><span class="c1">// string composite formatting</span>
<a id="__codelineno-8-2" name="__codelineno-8-2"></a><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">$&quot;Name is {name}, Marks are {marks}&quot;</span><span class="p">);</span><span class="w"> </span><span class="c1">// string interpolation</span>
<a id="__codelineno-8-3" name="__codelineno-8-3"></a>
<a id="__codelineno-8-4" name="__codelineno-8-4"></a><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span>
<a id="__codelineno-8-5" name="__codelineno-8-5"></a><span class="w"> </span><span class="n">format</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;{0} {1}&quot;</span><span class="w"> </span><span class="c1">// format can be omitted and passed as first argument of WriteLine/Write</span>
<a id="__codelineno-8-6" name="__codelineno-8-6"></a><span class="w"> </span><span class="n">arg0</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;String Literal&quot;</span><span class="p">,</span>
<a id="__codelineno-8-7" name="__codelineno-8-7"></a><span class="w"> </span><span class="n">arg1</span><span class="p">:</span><span class="w"> </span><span class="n">string_variable</span><span class="p">,</span>
<a id="__codelineno-8-8" name="__codelineno-8-8"></a><span class="w"> </span><span class="p">...</span>
<a id="__codelineno-8-9" name="__codelineno-8-9"></a><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="number-format-string">Number Format String</h3>
<p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings">Numeric Format Strings Docs</a>
<a href="https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo">CultureInfo Docs</a></p>
<p><code>{index[,alignment][:&lt;formatString&gt;&lt;num_decimal_digits&gt;]}</code></p>
<p><code>$"{number:C}"</code> formats the number as a <em>currency</em>. Currency symbol &amp; symbol position are determined by <code>CultureInfo</code>.<br />
<code>$"{number:D}"</code> formats the number with decimal digits.<br />
<code>$"{number:F}"</code> formats the number with a fixed number of decimal digits.<br />
<code>$"{number:E}"</code> formats the number in <em>scientific notation</em>.<br />
<code>$"{number:E}"</code> formats the number in the more compact of either fixed-point or scientific notation.<br />
<code>$"{number:N}"</code> formats the number as a <em>measure</em>. Digits separators are determined by <code>CultureInfo</code>.<br />
<code>$"{number:P}"</code> formats the number as a <em>percentage</em>.<br />
<code>$"{number:X}"</code> formats the number as a <em>hexadecimal</em>.</p>
<h2 id="variable-types">Variable Types</h2>
<h3 id="value-type">Value Type</h3>
<p>A value type variable will store its values directly in an area of storage called the <em>STACK</em>.<br />
The stack is memory allocated to the code that is currently running on the CPU.<br />
When the stack frame has finished executing, the values in the stack are removed.</p>
<h3 id="reference-type">Reference Type</h3>
<p>A reference type variable will store its values in a separate memory region called the <em>HEAP</em>.<br />
The heap is a memory area that is shared across many applications running on the operating system at the same time.<br />
The .NET Runtime communicates with the operating system to determine what memory addresses are available, and requests an address where it can store the value.<br />
The .NET Runtime stores the value, then returns the memory address to the variable.<br />
When your code uses the variable, the .NET Runtime seamlessly looks up the address stored in the variable and retrieves the value that's stored there.</p>
<h3 id="integer-numeric-types">Integer Numeric Types</h3>
<table>
<thead>
<tr>
<th style="text-align: center;">Keyword</th>
<th style="text-align: center;">System Type</th>
<th style="text-align: center;">Example</th>
<th style="text-align: center;">Bit/Byte</th>
<th>Min Value</th>
<th>Max Value</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><code>sbyte</code></td>
<td style="text-align: center;"><code>System.SByte</code></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">8 bit</td>
<td>-128</td>
<td>127</td>
</tr>
<tr>
<td style="text-align: center;"><code>byte</code></td>
<td style="text-align: center;"><code>System.Byte</code></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">8 bit</td>
<td>0</td>
<td>255</td>
</tr>
<tr>
<td style="text-align: center;"><code>short</code></td>
<td style="text-align: center;"><code>System.Int16</code></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">16 bit</td>
<td>-32'786</td>
<td>32'767</td>
</tr>
<tr>
<td style="text-align: center;"><code>ushort</code></td>
<td style="text-align: center;"><code>System.UInt16</code></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">16 bit</td>
<td>0</td>
<td>65'535</td>
</tr>
<tr>
<td style="text-align: center;"><code>int</code></td>
<td style="text-align: center;"><code>System.Int32</code></td>
<td style="text-align: center;">123</td>
<td style="text-align: center;">32 bit</td>
<td>-2'47'483'648</td>
<td>2'147'483'647</td>
</tr>
<tr>
<td style="text-align: center;"><code>uint</code></td>
<td style="text-align: center;"><code>System.UInt32</code></td>
<td style="text-align: center;">123u</td>
<td style="text-align: center;">32 bit</td>
<td>0</td>
<td>4'294'967'296</td>
</tr>
<tr>
<td style="text-align: center;"><code>nint</code></td>
<td style="text-align: center;"><code>System.IntPtr</code></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">Arch</td>
<td>0</td>
<td>18'446'744'073'709'551'615</td>
</tr>
<tr>
<td style="text-align: center;"><code>nuint</code></td>
<td style="text-align: center;"><code>System.UIntPtr</code></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">Arch</td>
<td>-9'223'372'036'854'775'808</td>
<td>9'223'372'036'854'775'807</td>
</tr>
<tr>
<td style="text-align: center;"><code>long</code></td>
<td style="text-align: center;"><code>System.Int64</code></td>
<td style="text-align: center;">123l</td>
<td style="text-align: center;">64 bit</td>
<td>-9'223'372'036'854'775'808</td>
<td>9'223'372'036'854'775'807</td>
</tr>
<tr>
<td style="text-align: center;"><code>ulong</code></td>
<td style="text-align: center;"><code>System.UInt64</code></td>
<td style="text-align: center;">123ul</td>
<td style="text-align: center;">64 bit</td>
<td>0</td>
<td>18'446'744'073'709'551'615</td>
</tr>
</tbody>
</table>
<h3 id="floating-point-numeric-types">Floating-Point Numeric Types</h3>
<table>
<thead>
<tr>
<th style="text-align: center;">Keyword</th>
<th style="text-align: center;">System Types</th>
<th style="text-align: center;">Example</th>
<th style="text-align: center;">Bit/Byte</th>
<th style="text-align: center;">Digits</th>
<th>Min Value</th>
<th>Max Value</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><code>float</code></td>
<td style="text-align: center;"><code>System.Single</code></td>
<td style="text-align: center;">3.14f</td>
<td style="text-align: center;">4 byte</td>
<td style="text-align: center;">6-9</td>
<td>-3.402823 E+38</td>
<td>3.402823 E+38</td>
</tr>
<tr>
<td style="text-align: center;"><code>double</code></td>
<td style="text-align: center;"><code>System.Double</code></td>
<td style="text-align: center;">3.14</td>
<td style="text-align: center;">8 byte</td>
<td style="text-align: center;">15-17</td>
<td>-1.79769313486232 E+308</td>
<td>1.79769313486232 E+308</td>
</tr>
<tr>
<td style="text-align: center;"><code>decimal</code></td>
<td style="text-align: center;"><code>System.Decimal</code></td>
<td style="text-align: center;">3.14m</td>
<td style="text-align: center;">16 byte</td>
<td style="text-align: center;">28-29</td>
<td>-79'228'162'514'264'337'593'543'950'335</td>
<td>79'228'162'514'264'337'593'543'950'335</td>
</tr>
</tbody>
</table>
<p>The static fields and methods of the <code>MathF</code> class correspond to those of the <code>Math</code> class, except that their parameters are of type <code>Single</code> rather than <code>Double</code>, and they return <code>Single</code> rather than <code>Double</code> values.</p>
<h3 id="biginteger">BigInteger</h3>
<p><code>BigInteger</code> represents an integer that will grow as large as is necessary to accommodate values.<br />
Unlike the builtin numeric types, it has no theoretical limit on its range.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-9-1">1</a></span>
<span class="normal"><a href="#__codelineno-9-2">2</a></span>
<span class="normal"><a href="#__codelineno-9-3">3</a></span>
<span class="normal"><a href="#__codelineno-9-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1"></a><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<a id="__codelineno-9-2" name="__codelineno-9-2"></a><span class="k">using</span><span class="w"> </span><span class="nn">System.Numerics</span><span class="p">;</span>
<a id="__codelineno-9-3" name="__codelineno-9-3"></a>
<a id="__codelineno-9-4" name="__codelineno-9-4"></a><span class="n">BigInteger</span><span class="w"> </span><span class="n">bi</span><span class="p">;</span>
</code></pre></div></td></tr></table></div>
<h3 id="binary-hexadecimal-numbers">Binary &amp; Hexadecimal Numbers</h3>
<p>Binary literal: <code>0b&lt;digits&gt;</code>
Hexadecimal literal: <code>0x&lt;digits&gt;</code></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-10-1">1</a></span>
<span class="normal"><a href="#__codelineno-10-2">2</a></span>
<span class="normal"><a href="#__codelineno-10-3">3</a></span>
<span class="normal"><a href="#__codelineno-10-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1"></a><span class="c1">// three variables that store the number 2 million</span>
<a id="__codelineno-10-2" name="__codelineno-10-2"></a><span class="kt">int</span><span class="w"> </span><span class="n">decimalNotation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="n">_000_000</span><span class="p">;</span>
<a id="__codelineno-10-3" name="__codelineno-10-3"></a><span class="kt">int</span><span class="w"> </span><span class="n">binaryNotation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="n">b_0001_1110_1000_0100_1000_0000</span><span class="p">;</span>
<a id="__codelineno-10-4" name="__codelineno-10-4"></a><span class="kt">int</span><span class="w"> </span><span class="n">hexadecimalNotation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="n">x_001E_8480</span><span class="p">;</span>
</code></pre></div></td></tr></table></div>
<h3 id="boolean-type-systemboolean">Boolean Type (<code>System.Boolean</code>)</h3>
<p><code>bool</code>: <code>true</code> or <code>false</code></p>
<h3 id="text-type-systemchar-systemstring">Text Type (<code>System.Char</code> &amp; <code>System.String</code>)</h3>
<p><code>char</code>: single unicode character<br />
<code>string</code>: multiple Unicode characters</p>
<h3 id="implicit-type">Implicit Type</h3>
<p>The compiler determines the required type based on the assigned value.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-11-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1"></a><span class="kt">var</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="c1">// Inferred tipe cant change after first assignment</span>
</code></pre></div></td></tr></table></div>
<h3 id="dynamic-type">Dynamic Type</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-12-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1"></a><span class="kt">dynamic</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
</code></pre></div></td></tr></table></div>
<h3 id="anonymous-types-reference-type">Anonymous types (Reference Type)</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-13-1">1</a></span>
<span class="normal"><a href="#__codelineno-13-2">2</a></span>
<span class="normal"><a href="#__codelineno-13-3">3</a></span>
<span class="normal"><a href="#__codelineno-13-4">4</a></span>
<span class="normal"><a href="#__codelineno-13-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1"></a><span class="c1">// cannot be used as return types</span>
<a id="__codelineno-13-2" name="__codelineno-13-2"></a><span class="kt">var</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">,</span><span class="w"> </span><span class="p">...};</span><span class="w"> </span><span class="c1">// read only properties</span>
<a id="__codelineno-13-3" name="__codelineno-13-3"></a><span class="n">x</span><span class="p">.</span><span class="n">Key</span><span class="p">;</span><span class="w"> </span><span class="c1">// member access</span>
<a id="__codelineno-13-4" name="__codelineno-13-4"></a>
<a id="__codelineno-13-5" name="__codelineno-13-5"></a><span class="kt">var</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// with expression [C# 10]</span>
</code></pre></div></td></tr></table></div>
<h3 id="index-range-types-structs">Index &amp; Range Types (Structs)</h3>
<p>A <a href="https://docs.microsoft.com/en-us/dotnet/api/system.index">System.Index</a> represents a type that can be used to index a collection either from the start or the end.<br />
A <a href="https://docs.microsoft.com/en-us/dotnet/api/system.range">System.Range</a> represents a range that has start and end indexes.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-14-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-14-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-14-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-14-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-14-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-14-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-14-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-14-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-14-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-14-10">10</a></span>
<span class="normal"><a href="#__codelineno-14-11">11</a></span>
<span class="normal"><a href="#__codelineno-14-12">12</a></span>
<span class="normal"><a href="#__codelineno-14-13">13</a></span>
<span class="normal"><a href="#__codelineno-14-14">14</a></span>
<span class="normal"><a href="#__codelineno-14-15">15</a></span>
<span class="normal"><a href="#__codelineno-14-16">16</a></span>
<span class="normal"><a href="#__codelineno-14-17">17</a></span>
<span class="normal"><a href="#__codelineno-14-18">18</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1"></a><span class="n">Index</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">position</span><span class="p">;</span>
<a id="__codelineno-14-2" name="__codelineno-14-2"></a><span class="n">Index</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Index</span><span class="p">(</span><span class="n">position</span><span class="p">,</span><span class="w"> </span><span class="n">IsFromEnd</span><span class="p">:</span><span class="w"> </span><span class="k">false</span><span class="p">);</span><span class="w"> </span><span class="c1">// start-relative index</span>
<a id="__codelineno-14-3" name="__codelineno-14-3"></a>
<a id="__codelineno-14-4" name="__codelineno-14-4"></a><span class="n">Index</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">^</span><span class="n">position</span><span class="p">;</span><span class="w"> </span><span class="c1">// end-elative index</span>
<a id="__codelineno-14-5" name="__codelineno-14-5"></a><span class="n">Index</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Index</span><span class="p">(</span><span class="n">position</span><span class="p">,</span><span class="w"> </span><span class="n">IsFromEnd</span><span class="p">:</span><span class="w"> </span><span class="k">true</span><span class="p">);</span><span class="w"> </span><span class="c1">// end-elative index</span>
<a id="__codelineno-14-6" name="__codelineno-14-6"></a><span class="n">array</span><span class="p">[</span><span class="o">^</span><span class="n">n</span><span class="p">];</span><span class="w"> </span><span class="c1">// n-th last item</span>
<a id="__codelineno-14-7" name="__codelineno-14-7"></a><span class="n">array</span><span class="p">[</span><span class="n">array</span><span class="p">.</span><span class="n">Length</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">n</span><span class="p">];</span><span class="w"> </span><span class="c1">// n-th last item</span>
<a id="__codelineno-14-8" name="__codelineno-14-8"></a>
<a id="__codelineno-14-9" name="__codelineno-14-9"></a><span class="c1">// range syntax (supported by System.Range struct)</span>
<a id="__codelineno-14-10" name="__codelineno-14-10"></a><span class="n">Range</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.</span><span class="p">.</span><span class="o">^</span><span class="m">0</span><span class="p">;</span>
<a id="__codelineno-14-11" name="__codelineno-14-11"></a><span class="n">Range</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.</span><span class="p">.;</span>
<a id="__codelineno-14-12" name="__codelineno-14-12"></a><span class="n">Range</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">..</span><span class="o">^</span><span class="m">0</span><span class="p">;</span>
<a id="__codelineno-14-13" name="__codelineno-14-13"></a><span class="n">Range</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">..;</span>
<a id="__codelineno-14-14" name="__codelineno-14-14"></a><span class="kt">var</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Range</span><span class="p">.</span><span class="n">All</span><span class="p">;</span>
<a id="__codelineno-14-15" name="__codelineno-14-15"></a>
<a id="__codelineno-14-16" name="__codelineno-14-16"></a><span class="c1">// slicing</span>
<a id="__codelineno-14-17" name="__codelineno-14-17"></a><span class="n">array</span><span class="p">[</span><span class="n">start</span><span class="p">..</span><span class="n">end</span><span class="p">];</span><span class="w"> </span><span class="c1">// select elements between start index and end index (non inclusive)</span>
<a id="__codelineno-14-18" name="__codelineno-14-18"></a><span class="n">array</span><span class="p">[</span><span class="n">start</span><span class="p">..</span><span class="o">^</span><span class="n">n</span><span class="p">];</span><span class="w"> </span><span class="c1">// select elements between start index and n-th last item (non inclusive)</span>
</code></pre></div></td></tr></table></div>
<h2 id="tuples-value-type">Tuples (Value Type)</h2>
<p>Tuples are designed as a convenient way to package together a few values in cases where defining a whole new type wouldn't really be justified.</p>
<p>Tuples support comparison, so it's possible to use the <code>==</code> and <code>!=</code> relational operators.<br />
To be considered equal, two tuples must have the same shape and each value in the first tuple must be equal to its counterpart in the second tuple.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-15-1">1</a></span>
<span class="normal"><a href="#__codelineno-15-2">2</a></span>
<span class="normal"><a href="#__codelineno-15-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1"></a><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">Var1</span><span class="p">,</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Var2</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">value2</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
<a id="__codelineno-15-2" name="__codelineno-15-2"></a><span class="kt">var</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Var1</span><span class="p">:</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">Var2</span><span class="p">:</span><span class="w"> </span><span class="n">value2</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span><span class="w"> </span><span class="c1">// if name are not supplied they default to Item1, Item2, ...</span>
<a id="__codelineno-15-3" name="__codelineno-15-3"></a><span class="kt">var</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">var1</span><span class="p">,</span><span class="w"> </span><span class="n">var2</span><span class="p">);</span><span class="w"> </span><span class="c1">// constructed w/ pre-existing values, tuple attributes named after the variables</span>
</code></pre></div></td></tr></table></div>
<p>Since the names of the attributes of a tuple do not matter (a tuple is an instance of <code>ValueTuple&lt;Type, Type, ...&gt;</code>) it's possible to assign any tuple to another tuple with the same structure.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-16-1">1</a></span>
<span class="normal"><a href="#__codelineno-16-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1"></a><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="n">Int</span><span class="w"> </span><span class="n">Y</span><span class="p">)</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">);</span>
<a id="__codelineno-16-2" name="__codelineno-16-2"></a><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">Width</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Height</span><span class="p">)</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
</code></pre></div></td></tr></table></div>
<h3 id="tuple-deconstruction">Tuple Deconstruction</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-17-1">1</a></span>
<span class="normal"><a href="#__codelineno-17-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1"></a><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Y</span><span class="p">)</span><span class="w"> </span><span class="n">point</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="m">35</span><span class="p">);</span>
<a id="__codelineno-17-2" name="__codelineno-17-2"></a><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">point</span><span class="p">;</span><span class="w"> </span><span class="c1">// extract data based on position into two variables</span>
</code></pre></div></td></tr></table></div>
<h2 id="records">Records</h2>
<p>I'ts possible to create record types with immutable properties by using standard property syntax or positional parameters:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-18-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-18-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-18-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-18-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-18-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-18-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-18-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-18-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-18-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-18-10">10</a></span>
<span class="normal"><a href="#__codelineno-18-11">11</a></span>
<span class="normal"><a href="#__codelineno-18-12">12</a></span>
<span class="normal"><a href="#__codelineno-18-13">13</a></span>
<span class="normal"><a href="#__codelineno-18-14">14</a></span>
<span class="normal"><a href="#__codelineno-18-15">15</a></span>
<span class="normal"><a href="#__codelineno-18-16">16</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="n">Person</span>
<a id="__codelineno-18-2" name="__codelineno-18-2"></a><span class="p">{</span>
<a id="__codelineno-18-3" name="__codelineno-18-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">FirstName</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="n">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="o">!</span><span class="p">;</span>
<a id="__codelineno-18-4" name="__codelineno-18-4"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">LastName</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="n">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="o">!</span><span class="p">;</span>
<a id="__codelineno-18-5" name="__codelineno-18-5"></a><span class="p">};</span>
<a id="__codelineno-18-6" name="__codelineno-18-6"></a><span class="c1">// same as</span>
<a id="__codelineno-18-7" name="__codelineno-18-7"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="nf">Person</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">FirstName</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">LastName</span><span class="p">);</span>
<a id="__codelineno-18-8" name="__codelineno-18-8"></a>
<a id="__codelineno-18-9" name="__codelineno-18-9"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">Point</span>
<a id="__codelineno-18-10" name="__codelineno-18-10"></a><span class="p">{</span>
<a id="__codelineno-18-11" name="__codelineno-18-11"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="n">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-18-12" name="__codelineno-18-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="n">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-18-13" name="__codelineno-18-13"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Z</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="n">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-18-14" name="__codelineno-18-14"></a><span class="p">}</span>
<a id="__codelineno-18-15" name="__codelineno-18-15"></a><span class="c1">// same as</span>
<a id="__codelineno-18-16" name="__codelineno-18-16"></a><span class="k">public</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nf">Point</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Y</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Z</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<p>it's also possible to create record types with mutable properties and fields:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-19-1">1</a></span>
<span class="normal"><a href="#__codelineno-19-2">2</a></span>
<span class="normal"><a href="#__codelineno-19-3">3</a></span>
<span class="normal"><a href="#__codelineno-19-4">4</a></span>
<span class="normal"><a href="#__codelineno-19-5">5</a></span>
<span class="normal"><a href="#__codelineno-19-6">6</a></span>
<span class="normal"><a href="#__codelineno-19-7">7</a></span>
<span class="normal"><a href="#__codelineno-19-8">8</a></span>
<span class="normal"><a href="#__codelineno-19-9">9</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1"></a><span class="c1">// mutable record</span>
<a id="__codelineno-19-2" name="__codelineno-19-2"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="n">Person</span>
<a id="__codelineno-19-3" name="__codelineno-19-3"></a><span class="p">{</span>
<a id="__codelineno-19-4" name="__codelineno-19-4"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">FirstName</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="o">!</span><span class="p">;</span>
<a id="__codelineno-19-5" name="__codelineno-19-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">LastName</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="o">!</span><span class="p">;</span>
<a id="__codelineno-19-6" name="__codelineno-19-6"></a><span class="p">};</span>
<a id="__codelineno-19-7" name="__codelineno-19-7"></a>
<a id="__codelineno-19-8" name="__codelineno-19-8"></a><span class="c1">// mutable record struct</span>
<a id="__codelineno-19-9" name="__codelineno-19-9"></a><span class="k">public</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nf">Point</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Y</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Z</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<p>While records can be mutable, they're primarily intended for supporting immutable data models. The record type offers the following features:</p>
<ul>
<li>Concise syntax for creating a reference type with immutable properties</li>
<li>Built-in behavior useful for a data-centric reference type:</li>
<li>Value equality</li>
<li>Concise syntax for nondestructive mutation</li>
<li>Built-in formatting for display</li>
<li>Support for inheritance hierarchies</li>
</ul>
<blockquote>
<p><strong>Note</strong>: A <em>positional record</em> and a <em>positional readonly record struct</em> declare init-only properties. A <em>positional record struct</em> declares read-write properties.</p>
</blockquote>
<h3 id="with-expressions"><code>with</code>-expressions</h3>
<p>When working with immutable data, a common pattern is to create new values from existing ones to represent a new state.<br />
To help with this style of programming, records allow for a new kind of expression; the with-expression.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-20-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1"></a><span class="kt">var</span><span class="w"> </span><span class="n">newRecord</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">oldRecord</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">};</span>
</code></pre></div></td></tr></table></div>
<p>With-expressions use object initializer syntax to state what's different in the new object from the old object. it's possible to specify multiple properties.<br />
A record implicitly defines a protected "copy constructor", a constructor that takes an existing record object and copies it field by field to the new one.<br />
The <code>with</code> expression causes the copy constructor to get called, and then applies the object initializer on top to change the properties accordingly.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-21-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1"></a><span class="k">protected</span><span class="w"> </span><span class="nf">Record</span><span class="p">(</span><span class="n">Record</span><span class="w"> </span><span class="n">original</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* copy all the fields */</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// generated</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: it's possible to define a custom copy constructor tha will be picked up by the <code>with</code> expression.</p>
</blockquote>
<h3 id="with-expressions-inheritance"><code>with</code>-expressions &amp; Inheritance</h3>
<p>Records have a hidden virtual method that is entrusted with "cloning" the whole object.<br />
Every derived record type overrides this method to call the copy constructor of that type, and the copy constructor of a derived record chains to the copy constructor of the base record.<br />
A with-expression simply calls the hidden "clone" method and applies the object initializer to the result.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-22-1">1</a></span>
<span class="normal"><a href="#__codelineno-22-2">2</a></span>
<span class="normal"><a href="#__codelineno-22-3">3</a></span>
<span class="normal"><a href="#__codelineno-22-4">4</a></span>
<span class="normal"><a href="#__codelineno-22-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="n">Base</span><span class="p">{</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop1</span><span class="p">,</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-22-2" name="__codelineno-22-2"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="n">Derived</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Base</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop3</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-22-3" name="__codelineno-22-3"></a>
<a id="__codelineno-22-4" name="__codelineno-22-4"></a><span class="n">Base</span><span class="w"> </span><span class="n">@base</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Derived</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value2</span><span class="p">,</span><span class="w"> </span><span class="n">Prop3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value3</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-22-5" name="__codelineno-22-5"></a><span class="kt">var</span><span class="w"> </span><span class="n">newBase</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">@base</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// new Derived record even if type of _base is Base since _base contains a Derived record</span>
</code></pre></div></td></tr></table></div>
<h3 id="value-based-equality-inheritance">Value-based Equality &amp; Inheritance</h3>
<p>Records have a virtual protected property called <code>EqualityContract</code>.<br />
Every derived record overrides it, and in order to compare equal, the two objects musts have the same <code>EqualityContract</code>.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-23-1">1</a></span>
<span class="normal"><a href="#__codelineno-23-2">2</a></span>
<span class="normal"><a href="#__codelineno-23-3">3</a></span>
<span class="normal"><a href="#__codelineno-23-4">4</a></span>
<span class="normal"><a href="#__codelineno-23-5">5</a></span>
<span class="normal"><a href="#__codelineno-23-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="n">Base</span><span class="p">{</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop1</span><span class="p">,</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-23-2" name="__codelineno-23-2"></a><span class="k">public</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="n">Derived</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Base</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop3</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-23-3" name="__codelineno-23-3"></a>
<a id="__codelineno-23-4" name="__codelineno-23-4"></a><span class="n">Base</span><span class="w"> </span><span class="n">rec1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Base</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value2</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-23-5" name="__codelineno-23-5"></a><span class="n">Base</span><span class="w"> </span><span class="n">rec2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Derived</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value2</span><span class="p">,</span><span class="w"> </span><span class="n">Prop3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value3</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-23-6" name="__codelineno-23-6"></a><span class="c1">// will result not equal even if container is of same type</span>
</code></pre></div></td></tr></table></div>
<h2 id="strings">Strings</h2>
<p>.NET strings are <em>immutable</em>. The downside of immutability is that string processing can be inefficient.<br />
If a work performs a series of modifications to a string it will end up allocating a lot of memory, because it will return a separate string for each modification.<br />
This creates a lot of extra work for .NET's garbage collector, causing the program to use more CPU time than necessary.</p>
<p>In these situations, it's possible to can use a type called <code>StringBuilder</code>. This is conceptually similar to a string but it is modifiable.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-24-1">1</a></span>
<span class="normal"><a href="#__codelineno-24-2">2</a></span>
<span class="normal"><a href="#__codelineno-24-3">3</a></span>
<span class="normal"><a href="#__codelineno-24-4">4</a></span>
<span class="normal"><a href="#__codelineno-24-5">5</a></span>
<span class="normal"><a href="#__codelineno-24-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1"></a><span class="s">&quot;string contents here&quot;</span><span class="w"> </span><span class="c1">// string literal</span>
<a id="__codelineno-24-2" name="__codelineno-24-2"></a><span class="s">@&quot;string contents here&quot;</span><span class="w"> </span><span class="c1">// verbatim string, escape characters printed as-is (raw string literal)</span>
<a id="__codelineno-24-3" name="__codelineno-24-3"></a><span class="s">$&quot;{variable} contents here&quot;</span><span class="w"> </span><span class="c1">// string interpolation</span>
<a id="__codelineno-24-4" name="__codelineno-24-4"></a><span class="err">$</span><span class="s">@&quot;{variable} \n contents here&quot;</span><span class="w"> </span><span class="c1">// verbatim string interpolation</span>
<a id="__codelineno-24-5" name="__codelineno-24-5"></a><span class="kt">string</span><span class="w"> </span><span class="n">stringa_1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">stringa_2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;string contents here&quot;</span><span class="p">;</span><span class="w"> </span><span class="c1">// string concatenation</span>
<a id="__codelineno-24-6" name="__codelineno-24-6"></a><span class="n">String</span><span class="p">.</span><span class="n">Length</span><span class="w"> </span><span class="c1">// returns the length of the string</span>
</code></pre></div></td></tr></table></div>
<h3 id="string-methods-not-in-place">String Methods (Not In-Place)</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-25-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-25-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-25-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-25-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-25-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-25-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-25-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-25-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-25-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-25-10">10</a></span>
<span class="normal"><a href="#__codelineno-25-11">11</a></span>
<span class="normal"><a href="#__codelineno-25-12">12</a></span>
<span class="normal"><a href="#__codelineno-25-13">13</a></span>
<span class="normal"><a href="#__codelineno-25-14">14</a></span>
<span class="normal"><a href="#__codelineno-25-15">15</a></span>
<span class="normal"><a href="#__codelineno-25-16">16</a></span>
<span class="normal"><a href="#__codelineno-25-17">17</a></span>
<span class="normal"><a href="#__codelineno-25-18">18</a></span>
<span class="normal"><a href="#__codelineno-25-19">19</a></span>
<span class="normal"><a href="#__codelineno-25-20">20</a></span>
<span class="normal"><a href="#__codelineno-25-21">21</a></span>
<span class="normal"><a href="#__codelineno-25-22">22</a></span>
<span class="normal"><a href="#__codelineno-25-23">23</a></span>
<span class="normal"><a href="#__codelineno-25-24">24</a></span>
<span class="normal"><a href="#__codelineno-25-25">25</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1"></a><span class="n">string_</span><span class="p">.</span><span class="n">IndexOf</span><span class="p">(</span><span class="o">&lt;</span><span class="n">character</span><span class="o">/</span><span class="kt">string</span><span class="o">&gt;</span><span class="p">,</span><span class="w"> </span><span class="n">startIndex</span><span class="p">,</span><span class="w"> </span><span class="n">endIndex</span><span class="p">);</span><span class="w"> </span><span class="c1">// index of first occurrence of character/string, -1 otherwise</span>
<a id="__codelineno-25-2" name="__codelineno-25-2"></a><span class="n">string_</span><span class="p">.</span><span class="n">LastIndexOf</span><span class="p">(</span><span class="o">&lt;</span><span class="n">character</span><span class="o">/</span><span class="kt">string</span><span class="o">&gt;</span><span class="p">,</span><span class="w"> </span><span class="n">startIndex</span><span class="p">,</span><span class="w"> </span><span class="n">endIndex</span><span class="p">);</span><span class="w"> </span><span class="c1">// index last occurrence of character/string, -1 otherwise</span>
<a id="__codelineno-25-3" name="__codelineno-25-3"></a><span class="n">string_</span><span class="p">.</span><span class="n">IndexOfAny</span><span class="p">(</span><span class="n">char_array</span><span class="p">,</span><span class="w"> </span><span class="n">startIndex</span><span class="p">,</span><span class="w"> </span><span class="n">endIndex</span><span class="p">);</span><span class="w"> </span><span class="c1">// index of any of the characters in the supplied array</span>
<a id="__codelineno-25-4" name="__codelineno-25-4"></a><span class="n">string_</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="n">startIndex</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="p">);</span><span class="w"> </span><span class="c1">// extract substring</span>
<a id="__codelineno-25-5" name="__codelineno-25-5"></a><span class="n">string_</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="n">startIndex</span><span class="p">);</span><span class="w"> </span><span class="c1">// return every character after startIndex</span>
<a id="__codelineno-25-6" name="__codelineno-25-6"></a><span class="n">string_</span><span class="p">.</span><span class="n">Replace</span><span class="p">(</span><span class="n">oldString</span><span class="p">,</span><span class="w"> </span><span class="n">newString</span><span class="p">);</span><span class="w"> </span><span class="c1">// returns string_ with oldString replaced with newString</span>
<a id="__codelineno-25-7" name="__codelineno-25-7"></a><span class="n">string_</span><span class="p">.</span><span class="n">Insert</span><span class="p">(</span><span class="n">startIndex</span><span class="p">,</span><span class="w"> </span><span class="n">substring</span><span class="p">);</span><span class="w"> </span><span class="c1">// return string_ inserting substring at position startIndex</span>
<a id="__codelineno-25-8" name="__codelineno-25-8"></a><span class="n">string_</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">startIndex</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="p">);</span><span class="w"> </span><span class="c1">// return string_ removing a substring of length length at position startIndex</span>
<a id="__codelineno-25-9" name="__codelineno-25-9"></a><span class="n">string_</span><span class="p">.</span><span class="n">ToUpper</span><span class="p">();</span><span class="w"> </span><span class="c1">// transforms all string in uppercase characters</span>
<a id="__codelineno-25-10" name="__codelineno-25-10"></a><span class="n">string_</span><span class="p">.</span><span class="n">ToLower</span><span class="p">();</span><span class="w"> </span><span class="c1">// transforms all string to lowercase characters</span>
<a id="__codelineno-25-11" name="__codelineno-25-11"></a><span class="n">string_</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="n">target</span><span class="p">);</span><span class="w"> </span><span class="c1">// returns True if string contains the target, False otherwise</span>
<a id="__codelineno-25-12" name="__codelineno-25-12"></a><span class="n">string_</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="n">substring</span><span class="p">);</span><span class="w"> </span><span class="c1">// Determines whether the start of the string matches the substring.</span>
<a id="__codelineno-25-13" name="__codelineno-25-13"></a><span class="n">string_</span><span class="p">.</span><span class="n">EndsWith</span><span class="p">(</span><span class="n">substring</span><span class="p">);</span><span class="w"> </span><span class="c1">// Determines whether the end of the string matches the substring.</span>
<a id="__codelineno-25-14" name="__codelineno-25-14"></a><span class="n">string_</span><span class="p">.</span><span class="n">PadLeft</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="n">character</span><span class="err">&#39;</span><span class="p">);</span><span class="w"> </span><span class="c1">// insert character n times as left padding. In-place operation</span>
<a id="__codelineno-25-15" name="__codelineno-25-15"></a><span class="n">string_</span><span class="p">.</span><span class="n">PadRight</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="n">character</span><span class="err">&#39;</span><span class="p">);</span><span class="w"> </span><span class="c1">// insert character n times as right padding. In-place operation</span>
<a id="__codelineno-25-16" name="__codelineno-25-16"></a><span class="n">string_</span><span class="p">.</span><span class="n">TrimStart</span><span class="p">();</span><span class="w"> </span><span class="c1">// trim leading spaces before text</span>
<a id="__codelineno-25-17" name="__codelineno-25-17"></a><span class="n">string_</span><span class="p">.</span><span class="n">TrimEnd</span><span class="p">();</span><span class="w"> </span><span class="c1">// trim following spaces after text</span>
<a id="__codelineno-25-18" name="__codelineno-25-18"></a><span class="n">string_</span><span class="p">.</span><span class="n">Trim</span><span class="p">();</span><span class="w"> </span><span class="c1">// trim spaces around text</span>
<a id="__codelineno-25-19" name="__codelineno-25-19"></a><span class="n">string_</span><span class="p">.</span><span class="n">GetHashCode</span><span class="p">()</span>
<a id="__codelineno-25-20" name="__codelineno-25-20"></a><span class="n">string_</span><span class="p">.</span><span class="n">Spit</span><span class="p">(</span><span class="err">&#39;</span><span class="o">&lt;</span><span class="n">separator</span><span class="o">&gt;</span><span class="err">&#39;</span><span class="p">);</span><span class="w"> </span><span class="c1">// returns an array separating the string at the occurrences of &lt;separator&gt; (&lt;separator&gt; MUST BE char)</span>
<a id="__codelineno-25-21" name="__codelineno-25-21"></a>
<a id="__codelineno-25-22" name="__codelineno-25-22"></a><span class="n">String</span><span class="p">.</span><span class="n">Join</span><span class="p">(</span><span class="err">&#39;</span><span class="o">&lt;</span><span class="n">separator</span><span class="o">&gt;</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">object</span><span class="p">)</span><span class="w"> </span><span class="n">iterable</span><span class="p">);</span><span class="w"> </span><span class="c1">// returns a string from iterable. values separated by &lt;separator&gt; (&lt;separator&gt; MUST BE char)</span>
<a id="__codelineno-25-23" name="__codelineno-25-23"></a><span class="n">String</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">$&quot;{variable}&quot;</span><span class="p">);</span><span class="w"> </span><span class="c1">// string interpolation outside of a Write/WriteLine</span>
<a id="__codelineno-25-24" name="__codelineno-25-24"></a>
<a id="__codelineno-25-25" name="__codelineno-25-25"></a><span class="n">String</span><span class="p">.</span><span class="n">Empty</span><span class="p">;</span><span class="w"> </span><span class="c1">// value of an empty string, used for string init</span>
</code></pre></div></td></tr></table></div>
<h3 id="raw-string-literals">Raw string literals</h3>
<p>Raw string literals can contain arbitrary text, including whitespace, new lines, embedded quotes, and other special characters without requiring escape sequences.<br />
A raw string literal starts with at least three double-quote (<code>"""</code>) characters. It ends with the same number of double-quote characters.<br />
Typically, a raw string literal uses three double quotes on a single line to start the string, and three double quotes on a separate line to end the string.
The newlines following the opening quote and preceding the closing quote aren't included in the final content:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-26-1">1</a></span>
<span class="normal"><a href="#__codelineno-26-2">2</a></span>
<span class="normal"><a href="#__codelineno-26-3">3</a></span>
<span class="normal"><a href="#__codelineno-26-4">4</a></span>
<span class="normal"><a href="#__codelineno-26-5">5</a></span>
<span class="normal"><a href="#__codelineno-26-6">6</a></span>
<span class="normal"><a href="#__codelineno-26-7">7</a></span>
<span class="normal"><a href="#__codelineno-26-8">8</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1"></a><span class="kt">string</span><span class="w"> </span><span class="n">longMessage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;&quot;&quot;</span>
<a id="__codelineno-26-2" name="__codelineno-26-2"></a><span class="w"> </span><span class="n">This</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">message</span><span class="p">.</span>
<a id="__codelineno-26-3" name="__codelineno-26-3"></a><span class="w"> </span><span class="n">It</span><span class="w"> </span><span class="n">has</span><span class="w"> </span><span class="n">several</span><span class="w"> </span><span class="n">lines</span><span class="p">.</span>
<a id="__codelineno-26-4" name="__codelineno-26-4"></a><span class="w"> </span><span class="n">Some</span><span class="w"> </span><span class="n">are</span><span class="w"> </span><span class="n">indented</span>
<a id="__codelineno-26-5" name="__codelineno-26-5"></a><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="n">than</span><span class="w"> </span><span class="n">others</span><span class="p">.</span>
<a id="__codelineno-26-6" name="__codelineno-26-6"></a><span class="w"> </span><span class="n">Some</span><span class="w"> </span><span class="n">should</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">first</span><span class="w"> </span><span class="n">column</span><span class="p">.</span>
<a id="__codelineno-26-7" name="__codelineno-26-7"></a><span class="w"> </span><span class="n">Some</span><span class="w"> </span><span class="n">have</span><span class="w"> </span><span class="s">&quot;quoted text&quot;</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">them</span><span class="p">.</span>
<a id="__codelineno-26-8" name="__codelineno-26-8"></a><span class="w"> </span><span class="s">&quot;&quot;&quot;;</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: Any whitespace to the left of the closing double quotes will be removed from the string literal.</p>
</blockquote>
<p>Raw string literals can be combined with <em>string interpolation</em> to include braces in the output text. Multiple <code>$</code> characters denote how many consecutive braces start and end the interpolation</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-27-1">1</a></span>
<span class="normal"><a href="#__codelineno-27-2">2</a></span>
<span class="normal"><a href="#__codelineno-27-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-27-1" name="__codelineno-27-1"></a><span class="kt">var</span><span class="w"> </span><span class="n">location</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">$</span><span class="s">$&quot;&quot;&quot;</span>
<a id="__codelineno-27-2" name="__codelineno-27-2"></a><span class="w"> </span><span class="n">You</span><span class="w"> </span><span class="n">are</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="p">{{{</span><span class="n">Longitude</span><span class="p">}},</span><span class="w"> </span><span class="p">{{</span><span class="n">Latitude</span><span class="p">}}}</span>
<a id="__codelineno-27-3" name="__codelineno-27-3"></a><span class="w"> </span><span class="s">&quot;&quot;&quot;;</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="nullable-types">Nullable Types</h2>
<h3 id="nullable-value-types"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types">Nullable value types</a></h3>
<p>A <strong>nullable value type</strong> <code>T?</code> represents all values of its underlying value type <code>T</code> and an additional <code>null</code> value.</p>
<p>Any nullable value type is an instance of the generic <code>System.Nullable&lt;T&gt;</code> structure.<br />
Refer to a nullable value type with an underlying type <code>T</code> in any of the following interchangeable forms: <code>Nullable&lt;T&gt;</code> or <code>T?</code>.</p>
<p><strong>Note</strong>: Nullable Value Types default to <code>null</code>.</p>
<p>When a nullable type is boxed, the common language runtime automatically boxes the underlying value of the <code>Nullable&lt;T&gt;</code> object, not the <code>Nullable&lt;T&gt;</code> object itself. That is, if the HasValue property is true, the contents of the <code>Value</code> property is boxed. When the underlying value of a nullable type is unboxed, the common language runtime creates a new <code>Nullable&lt;T&gt;</code> structure initialized to the underlying value.</p>
<p>If the <code>HasValue</code> property of a nullable type is <code>false</code>, the result of a boxing operation is <code>null</code>. Consequently, if a boxed nullable type is passed to a method that expects an object argument, that method must be prepared to handle the case where the argument is <code>null</code>. When <code>null</code> is unboxed into a nullable type, the common language runtime creates a new <code>Nullable&lt;T&gt;</code> structure and initializes its <code>HasValue</code> property to <code>false</code>.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-28-1">1</a></span>
<span class="normal"><a href="#__codelineno-28-2">2</a></span>
<span class="normal"><a href="#__codelineno-28-3">3</a></span>
<span class="normal"><a href="#__codelineno-28-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1"></a><span class="n">Type</span><span class="o">?</span><span class="w"> </span><span class="n">nullableValueType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="p">;</span><span class="w"> </span><span class="c1">// assigns null</span>
<a id="__codelineno-28-2" name="__codelineno-28-2"></a>
<a id="__codelineno-28-3" name="__codelineno-28-3"></a><span class="n">nullableValueType</span><span class="p">.</span><span class="n">HasValue</span><span class="w"> </span><span class="c1">// boolean, use for null check</span>
<a id="__codelineno-28-4" name="__codelineno-28-4"></a><span class="n">nullableValueType</span><span class="p">.</span><span class="n">Value</span><span class="w"> </span><span class="c1">// underlying value type contents</span>
</code></pre></div></td></tr></table></div>
<h3 id="nullable-reference-types"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references">Nullable reference types</a></h3>
<p>C# 8.0 introduces nullable reference types and non-nullable reference types that enable to make important statements about the properties for reference type variables:</p>
<ul>
<li>
<p><strong>A reference isn't supposed to be null</strong>. When variables aren't supposed to be null, the compiler enforces rules that ensure it's safe to dereference these variables without first checking that it isn't null:</p>
</li>
<li>
<p>The variable must be initialized to a non-null value.</p>
</li>
<li>
<p>The variable can never be assigned the value null.</p>
</li>
<li>
<p><strong>A reference may be null</strong>. When variables may be null, the compiler enforces different rules to ensure that you've correctly checked for a null reference:</p>
</li>
<li>The variable may only be dereferenced when the compiler can guarantee that the value isn't null.</li>
<li>These variables may be initialized with the default null value and may be assigned the value null in other code.</li>
</ul>
<p>The <code>?</code> character appended to a reference type declares a nullable reference type.
The <strong>null-forgiving operator</strong> <code>!</code> may be appended to an expression to declare that the expression isn't null.
Any variable where the <code>?</code> isn't appended to the type name is a non-nullable reference type.</p>
<h4 id="nullability-of-types">Nullability of types</h4>
<p>Any reference type can have one of four <em>nullabilities</em>, which describes when warnings are generated:</p>
<ul>
<li><em>Nonnullable</em>: Null can't be assigned to variables of this type. Variables of this type don't need to be null-checked before dereferencing.</li>
<li><em>Nullable</em>: Null can be assigned to variables of this type. Dereferencing variables of this type without first checking for null causes a warning.</li>
<li><em>Oblivious</em>: Oblivious is the pre-C# 8.0 state. Variables of this type can be dereferenced or assigned without warnings.</li>
<li><em>Unknown</em>: Unknown is generally for type parameters where constraints don't tell the compiler that the type must be nullable or nonnullable.</li>
</ul>
<p>The nullability of a type in a variable declaration is controlled by the nullable context in which the variable is declared.</p>
<h4 id="nullable-context">Nullable Context</h4>
<p>Nullable contexts enable fine-grained control for how the compiler interprets reference type variables.</p>
<p>Valid settings are:</p>
<ul>
<li><em>enable</em>: The nullable annotation context is <em>enabled</em>. The nullable warning context is <em>enabled</em>.
Variables of a reference type are non-nullable, all nullability warnings are enabled.</li>
<li><em>warnings</em>: The nullable annotation context is <em>disabled</em>. The nullable warning context is <em>enabled</em>.
Variables of a reference type are oblivious; all nullability warnings are enabled.</li>
<li><em>annotations</em>: The nullable annotation context is <em>enabled</em>. The nullable warning context is <em>disabled</em>.
Variables of a reference type are non-nullable; all nullability warnings are disabled.</li>
<li><em>disable</em>: The nullable annotation context is <em>disabled</em>. The nullable warning context is <em>disabled</em>.
Variables of a reference type are oblivious, just like earlier versions of C#; all nullability warnings are disabled.</li>
</ul>
<p>In <code>Project.csproj</code>:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">XML</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-29-1">1</a></span>
<span class="normal"><a href="#__codelineno-29-2">2</a></span>
<span class="normal"><a href="#__codelineno-29-3">3</a></span>
<span class="normal"><a href="#__codelineno-29-4">4</a></span>
<span class="normal"><a href="#__codelineno-29-5">5</a></span>
<span class="normal"><a href="#__codelineno-29-6">6</a></span>
<span class="normal"><a href="#__codelineno-29-7">7</a></span>
<span class="normal"><a href="#__codelineno-29-8">8</a></span>
<span class="normal"><a href="#__codelineno-29-9">9</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-29-1" name="__codelineno-29-1"></a><span class="nt">&lt;Project</span><span class="w"> </span><span class="na">Sdk=</span><span class="s">&quot;Microsoft.NET.Sdk&quot;</span><span class="nt">&gt;</span>
<a id="__codelineno-29-2" name="__codelineno-29-2"></a><span class="w"> </span><span class="nt">&lt;PropertyGroup&gt;</span>
<a id="__codelineno-29-3" name="__codelineno-29-3"></a><span class="w"> </span><span class="nt">&lt;OutputType&gt;</span>Exe<span class="nt">&lt;/OutputType&gt;</span>
<a id="__codelineno-29-4" name="__codelineno-29-4"></a><span class="w"> </span><span class="nt">&lt;TargetFramework&gt;</span>...<span class="nt">&lt;/TargetFramework&gt;</span>
<a id="__codelineno-29-5" name="__codelineno-29-5"></a>
<a id="__codelineno-29-6" name="__codelineno-29-6"></a><span class="w"> </span><span class="cm">&lt;!-- set nullabilty context at project level --&gt;</span>
<a id="__codelineno-29-7" name="__codelineno-29-7"></a><span class="w"> </span><span class="nt">&lt;Nullable&gt;</span>enable<span class="w"> </span>|<span class="w"> </span>warning<span class="w"> </span>|<span class="w"> </span>annotations<span class="w"> </span>|<span class="w"> </span>disable<span class="nt">&lt;/Nullable&gt;</span>
<a id="__codelineno-29-8" name="__codelineno-29-8"></a><span class="w"> </span><span class="nt">&lt;/PropertyGroup&gt;</span>
<a id="__codelineno-29-9" name="__codelineno-29-9"></a><span class="nt">&lt;/Project&gt;</span>
</code></pre></div></td></tr></table></div>
<p>In <code>Program.cs</code>:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-30-1">1</a></span>
<span class="normal"><a href="#__codelineno-30-2">2</a></span>
<span class="normal"><a href="#__codelineno-30-3">3</a></span>
<span class="normal"><a href="#__codelineno-30-4">4</a></span>
<span class="normal"><a href="#__codelineno-30-5">5</a></span>
<span class="normal"><a href="#__codelineno-30-6">6</a></span>
<span class="normal"><a href="#__codelineno-30-7">7</a></span>
<span class="normal"><a href="#__codelineno-30-8">8</a></span>
<span class="normal"><a href="#__codelineno-30-9">9</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-30-1" name="__codelineno-30-1"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">enable</span><span class="w"> </span><span class="c1">// Sets the nullable annotation context and nullable warning context to enabled.</span>
<a id="__codelineno-30-2" name="__codelineno-30-2"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">disable</span><span class="w"> </span><span class="c1">// Sets the nullable annotation context and nullable warning context to disabled.</span>
<a id="__codelineno-30-3" name="__codelineno-30-3"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">restore</span><span class="w"> </span><span class="c1">// Restores the nullable annotation context and nullable warning context to the project settings.</span>
<a id="__codelineno-30-4" name="__codelineno-30-4"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">disable</span><span class="w"> </span><span class="n">warnings</span><span class="w"> </span><span class="c1">// Set the nullable warning context to disabled.</span>
<a id="__codelineno-30-5" name="__codelineno-30-5"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">enable</span><span class="w"> </span><span class="n">warnings</span><span class="w"> </span><span class="c1">// Set the nullable warning context to enabled.</span>
<a id="__codelineno-30-6" name="__codelineno-30-6"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">restore</span><span class="w"> </span><span class="n">warnings</span><span class="w"> </span><span class="c1">// Restores the nullable warning context to the project settings.</span>
<a id="__codelineno-30-7" name="__codelineno-30-7"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">disable</span><span class="w"> </span><span class="n">annotations</span><span class="w"> </span><span class="c1">// Set the nullable annotation context to disabled.</span>
<a id="__codelineno-30-8" name="__codelineno-30-8"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">enable</span><span class="w"> </span><span class="n">annotations</span><span class="w"> </span><span class="c1">// Set the nullable annotation context to enabled.</span>
<a id="__codelineno-30-9" name="__codelineno-30-9"></a><span class="err">#</span><span class="n">nullable</span><span class="w"> </span><span class="n">restore</span><span class="w"> </span><span class="n">annotations</span><span class="w"> </span><span class="c1">// Restores the annotation warning context to the project settings.</span>
</code></pre></div></td></tr></table></div>
<h3 id="null-conditional-null-coalescing-null-forgiving-operator-null-checks">Null Conditional, Null Coalescing, Null Forgiving Operator, Null Checks</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-31-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-31-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-31-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-31-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-31-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-31-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-31-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-31-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-31-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-31-10">10</a></span>
<span class="normal"><a href="#__codelineno-31-11">11</a></span>
<span class="normal"><a href="#__codelineno-31-12">12</a></span>
<span class="normal"><a href="#__codelineno-31-13">13</a></span>
<span class="normal"><a href="#__codelineno-31-14">14</a></span>
<span class="normal"><a href="#__codelineno-31-15">15</a></span>
<span class="normal"><a href="#__codelineno-31-16">16</a></span>
<span class="normal"><a href="#__codelineno-31-17">17</a></span>
<span class="normal"><a href="#__codelineno-31-18">18</a></span>
<span class="normal"><a href="#__codelineno-31-19">19</a></span>
<span class="normal"><a href="#__codelineno-31-20">20</a></span>
<span class="normal"><a href="#__codelineno-31-21">21</a></span>
<span class="normal"><a href="#__codelineno-31-22">22</a></span>
<span class="normal"><a href="#__codelineno-31-23">23</a></span>
<span class="normal"><a href="#__codelineno-31-24">24</a></span>
<span class="normal"><a href="#__codelineno-31-25">25</a></span>
<span class="normal"><a href="#__codelineno-31-26">26</a></span>
<span class="normal"><a href="#__codelineno-31-27">27</a></span>
<span class="normal"><a href="#__codelineno-31-28">28</a></span>
<span class="normal"><a href="#__codelineno-31-29">29</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-31-1" name="__codelineno-31-1"></a><span class="n">Type</span><span class="o">?</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="p">;</span><span class="w"> </span><span class="c1">// the variable can also contain the NULL value (nullable type)</span>
<a id="__codelineno-31-2" name="__codelineno-31-2"></a>
<a id="__codelineno-31-3" name="__codelineno-31-3"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;!</span><span class="w"> </span><span class="c1">// declare explicitly that the expression is not null (null forgiving operator)</span>
<a id="__codelineno-31-4" name="__codelineno-31-4"></a>
<a id="__codelineno-31-5" name="__codelineno-31-5"></a><span class="p">(</span><span class="n">variable</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">variable</span><span class="p">.</span><span class="n">property</span><span class="p">)</span>
<a id="__codelineno-31-6" name="__codelineno-31-6"></a><span class="c1">// same as</span>
<a id="__codelineno-31-7" name="__codelineno-31-7"></a><span class="n">variable</span><span class="o">?.</span><span class="n">property</span><span class="w"> </span><span class="c1">// if variable != null access it&#39;s property (null conditional), return null otherwise</span>
<a id="__codelineno-31-8" name="__codelineno-31-8"></a>
<a id="__codelineno-31-9" name="__codelineno-31-9"></a><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">variable</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span>
<a id="__codelineno-31-10" name="__codelineno-31-10"></a><span class="p">{</span>
<a id="__codelineno-31-11" name="__codelineno-31-11"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">variable</span><span class="p">;</span>
<a id="__codelineno-31-12" name="__codelineno-31-12"></a><span class="p">}</span>
<a id="__codelineno-31-13" name="__codelineno-31-13"></a><span class="k">else</span>
<a id="__codelineno-31-14" name="__codelineno-31-14"></a><span class="p">{</span>
<a id="__codelineno-31-15" name="__codelineno-31-15"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<a id="__codelineno-31-16" name="__codelineno-31-16"></a><span class="p">}</span>
<a id="__codelineno-31-17" name="__codelineno-31-17"></a><span class="c1">// same as</span>
<a id="__codelineno-31-18" name="__codelineno-31-18"></a><span class="kt">var</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="o">??</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="c1">// return var if var != null, return value otherwise</span>
<a id="__codelineno-31-19" name="__codelineno-31-19"></a>
<a id="__codelineno-31-20" name="__codelineno-31-20"></a><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="o">?.</span><span class="n">property</span><span class="w"> </span><span class="o">??</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="c1">// if (variable == null) -&gt; variable = value -- null coalescing</span>
<a id="__codelineno-31-21" name="__codelineno-31-21"></a><span class="c1">// same as</span>
<a id="__codelineno-31-22" name="__codelineno-31-22"></a><span class="n">variable</span><span class="w"> </span><span class="o">??=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="c1">// if (variable == null) -&gt; variable = value -- null coalescing</span>
<a id="__codelineno-31-23" name="__codelineno-31-23"></a>
<a id="__codelineno-31-24" name="__codelineno-31-24"></a><span class="c1">// null checks through patter matching</span>
<a id="__codelineno-31-25" name="__codelineno-31-25"></a><span class="n">variable</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="k">null</span>
<a id="__codelineno-31-26" name="__codelineno-31-26"></a><span class="n">variable</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="k">null</span>
<a id="__codelineno-31-27" name="__codelineno-31-27"></a>
<a id="__codelineno-31-28" name="__codelineno-31-28"></a><span class="c1">// null parameter checking [C# 10]</span>
<a id="__codelineno-31-29" name="__codelineno-31-29"></a><span class="n">ArgumentNullException</span><span class="p">.</span><span class="n">ThrowIfNull</span><span class="p">(</span><span class="n">obj</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="nullable-attributes">Nullable Attributes</h3>
<p>It's possible to apply a number of attributes that provide information to the compiler about the semantics of APIs.
That information helps the compiler perform static analysis and determine when a variable is not null.</p>
<ul>
<li><code>AllowNull</code>: A non-nullable input argument may be null.</li>
<li><code>DisallowNull</code>: A nullable input argument should never be null.</li>
<li><code>MaybeNull</code>: A non-nullable return value may be null.</li>
<li><code>NotNull</code>: A nullable return value will never be null.</li>
<li><code>MaybeNullWhen</code>: A non-nullable input argument may be null when the method returns the specified bool value.</li>
<li><code>NotNullWhen</code>: A nullable input argument will not be null when the method returns the specified bool value.</li>
<li><code>NotNullIfNotNull</code>: A return value isn't null if the argument for the specified parameter isn't null.</li>
<li><code>DoesNotReturn</code>: A method never returns. In other words, it always throws an exception.</li>
<li><code>DoesNotReturnIf</code>: This method never returns if the associated bool parameter has the specified value.</li>
</ul>
<hr />
<h2 id="type-conversion">Type Conversion</h2>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-32-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-32-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-32-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-32-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-32-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-32-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-32-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-32-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-32-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-32-10">10</a></span>
<span class="normal"><a href="#__codelineno-32-11">11</a></span>
<span class="normal"><a href="#__codelineno-32-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-32-1" name="__codelineno-32-1"></a><span class="n">variable</span><span class="p">.</span><span class="n">GetType</span><span class="p">();</span><span class="w"> </span><span class="c1">// System type of variable</span>
<a id="__codelineno-32-2" name="__codelineno-32-2"></a>
<a id="__codelineno-32-3" name="__codelineno-32-3"></a><span class="p">(</span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="c1">// explicit conversion</span>
<a id="__codelineno-32-4" name="__codelineno-32-4"></a><span class="n">numericalType</span><span class="p">.</span><span class="n">ToSting</span><span class="p">();</span><span class="w"> </span><span class="c1">// convert numerical value to a string</span>
<a id="__codelineno-32-5" name="__codelineno-32-5"></a><span class="n">numericalType</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&lt;</span><span class="n">SystemType</span><span class="o">/</span><span class="n">Type</span><span class="o">&gt;</span><span class="p">.</span><span class="n">Parse</span><span class="p">();</span><span class="w"> </span><span class="c1">// convert string to numerical data type (can cause exception at runtime)</span>
<a id="__codelineno-32-6" name="__codelineno-32-6"></a>
<a id="__codelineno-32-7" name="__codelineno-32-7"></a><span class="o">&lt;</span><span class="n">SystemType</span><span class="o">/</span><span class="n">Type</span><span class="o">&gt;</span><span class="p">.</span><span class="n">TryParse</span><span class="p">(</span><span class="k">value</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">variable</span><span class="p">);</span><span class="w"> </span><span class="c1">// improved version of Parse()</span>
<a id="__codelineno-32-8" name="__codelineno-32-8"></a><span class="cm">/* attempts to parse a string into the given numeric data type.</span>
<a id="__codelineno-32-9" name="__codelineno-32-9"></a><span class="cm">If successful, it will store the converted value in an OUT PARAMETER.</span>
<a id="__codelineno-32-10" name="__codelineno-32-10"></a><span class="cm">It returns a bool to indicate if it was successful or not */</span>
<a id="__codelineno-32-11" name="__codelineno-32-11"></a>
<a id="__codelineno-32-12" name="__codelineno-32-12"></a><span class="n">Convert</span><span class="p">.</span><span class="n">To</span><span class="o">&lt;</span><span class="n">SystemType</span><span class="o">&gt;</span><span class="p">(</span><span class="n">variable</span><span class="p">);</span><span class="w"> </span><span class="c1">// proper conversion and round-up of values (no truncation of values)</span>
</code></pre></div></td></tr></table></div>
<h3 id="converting-from-any-type-to-a-string">Converting from any type to a string</h3>
<p>The <code>ToString</code> method converts the current value of any variable into a textual representation. Some types can't be sensibly represented as text, so they return their namespace and type name.</p>
<h3 id="number-downcasting">Number Downcasting</h3>
<p>The rule for rounding (in explicit casting) in C# is subtly different from the primary school rule:</p>
<ul>
<li>It always rounds <em>down</em> if the decimal part is less than the midpoint <code>.5</code>.</li>
<li>It always rounds <em>up</em> if the decimal part is more than the midpoint <code>.5</code>.</li>
<li>It will round <em>up</em> if the decimal part is the midpoint <code>.5</code> and the non-decimal part is odd, but it will round <em>down</em> if the non-decimal part is even.</li>
</ul>
<p>This rule is known as <strong>Banker's Rounding</strong>, and it is preferred because it reduces bias by alternating when it rounds up or down.</p>
<h3 id="converting-from-a-binary-object-to-a-string">Converting from a binary object to a string</h3>
<p>The safest thing to do is to convert the binary object into a string of safe characters. Programmers call this <strong>Base64 encoding</strong>.<br />
The <code>Convert</code> type has a pair of methods, <code>ToBase64String</code> and <code>FromBase64String</code>, that perform this conversion.</p>
<h3 id="parsing-from-strings-to-numbers-or-dates-and-times">Parsing from strings to numbers or dates and times</h3>
<p>The second most common conversion is from strings to numbers or date and time values.<br />
The opposite of <code>ToString</code> is <code>Parse</code>. Only a few types have a <code>Parse</code> method, including all the number types and <code>DateTime</code>.</p>
<hr />
<h2 id="preprocessor-directives">Preprocessor Directives</h2>
<p>C# offers a <code>#define</code> directive that lets you define a compilation symbol.<br />
These symbols are commonly used in conjunction with the <code>#if</code> directive to compile code in different ways for different situations.<br />
It's common to define compilation symbols through the <em>compiler build settings</em>: open up the <code>.csproj</code> file and define the values you want in a <code>&lt;DefineConstants&gt;</code> element of any <code>&lt;PropertyGroup&gt;</code>.</p>
<p>Compilation symbols are typically used in conjunction with the <code>#if</code>, <code>#else</code>, <code>#elif</code>, and <code>#endif</code> directives (<code>#if false</code> also exists).</p>
<p>The <em>.NET SDK</em> defines certain symbols by default. It supports two configurations: <strong>Debug</strong> and <strong>Release</strong>.<br />
It defines a <code>DEBUG</code> compilation symbol in the Debug configuration, whereas Release will define <code>RELEASE</code> instead.<br />
It defines a symbol called <code>TRACE</code> in both configurations.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-33-1">1</a></span>
<span class="normal"><a href="#__codelineno-33-2">2</a></span>
<span class="normal"><a href="#__codelineno-33-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-33-1" name="__codelineno-33-1"></a><span class="cp">#if DEBUG</span>
<a id="__codelineno-33-2" name="__codelineno-33-2"></a><span class="w"> </span><span class="c1">// instructions</span>
<a id="__codelineno-33-3" name="__codelineno-33-3"></a><span class="cp">#endif</span>
</code></pre></div></td></tr></table></div>
<p>C# provides a more subtle mechanism to support this sort of thing, called a <em>conditional method</em>.<br />
The compiler recognizes an attribute defined by the .NET class libraries, called <code>ConditionalAttribute</code>, for which it provides special compile time behavior.<br />
Method annotated with this attribute will not be present in a non-Debug release.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-34-1">1</a></span>
<span class="normal"><a href="#__codelineno-34-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-34-1" name="__codelineno-34-1"></a><span class="na">[System.Diagnostics.Conditional(&quot;DEBUG&quot;)]</span>
<a id="__codelineno-34-2" name="__codelineno-34-2"></a><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="error-and-warning"><code>#error</code> and <code>#warning</code></h3>
<p>C# allows choose to generate <em>compiler errors</em> or warnings with the <code>#error</code> and <code>#warning</code> directives. These are typically used inside conditional regions.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-35-1">1</a></span>
<span class="normal"><a href="#__codelineno-35-2">2</a></span>
<span class="normal"><a href="#__codelineno-35-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-35-1" name="__codelineno-35-1"></a><span class="cp">#if NETSTANDARD</span>
<a id="__codelineno-35-2" name="__codelineno-35-2"></a><span class="w"> </span><span class="cp">#error .NET Standard is not a supported target for this source file</span>
<a id="__codelineno-35-3" name="__codelineno-35-3"></a><span class="cp">#endif</span>
</code></pre></div></td></tr></table></div>
<h3 id="pragma"><code>#pragma</code></h3>
<p>The <code>#pragma</code> directive provides two features: it can be used to disable selected compiler warnings, and it can also be used to override the checksum values the compiler puts into the <code>.pdb</code> file it generates containing debug information.<br />
Both of these are designed primarily for code generation scenarios, although they can occasionally be useful to disable warnings in ordinary code.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-36-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-36-1" name="__codelineno-36-1"></a><span class="cp">#pragma warning disable CS&lt;number&gt;</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="expressions-operators">Expressions &amp; Operators</h2>
<h3 id="primary-expressions">Primary Expressions</h3>
<table>
<thead>
<tr>
<th>Syntax</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td>x<code>.</code>m</td>
<td>access to member <code>m</code> of object <code>x</code> ("." &rarr; member access operator)</td>
</tr>
<tr>
<td>x<code>(...)</code></td>
<td>method invocation ("()" &rarr; method invocation operator)</td>
</tr>
<tr>
<td>x<code>[...]</code></td>
<td>array access</td>
</tr>
<tr>
<td><code>new</code> T(...)</td>
<td>object instantiation</td>
</tr>
<tr>
<td><code>new</code> T(...)<code>{...}</code></td>
<td>object instantiation with initial values</td>
</tr>
<tr>
<td><code>new</code> T[...]</td>
<td>array creation</td>
</tr>
<tr>
<td><code>typeof(T)</code></td>
<td>System.Type of object x</td>
</tr>
<tr>
<td><code>nameof(x)</code></td>
<td>name of variable x</td>
</tr>
<tr>
<td><code>sizeof(x)</code></td>
<td>size of variable x</td>
</tr>
<tr>
<td><code>default(T)</code></td>
<td>default value of <code>T</code></td>
</tr>
<tr>
<td><code>x!</code></td>
<td>declare x as not null</td>
</tr>
</tbody>
</table>
<h3 id="unary-operators">Unary Operators</h3>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>+</code>x</td>
<td>identity</td>
</tr>
<tr>
<td><code>-</code>x</td>
<td>negation</td>
</tr>
<tr>
<td><code>!</code>x</td>
<td>logic negation</td>
</tr>
<tr>
<td><code>~</code>x</td>
<td>binary negation</td>
</tr>
<tr>
<td><code>++</code>x</td>
<td>pre-increment</td>
</tr>
<tr>
<td><code>--</code>x</td>
<td>pre-decrement</td>
</tr>
<tr>
<td>x<code>++</code></td>
<td>post-increment</td>
</tr>
<tr>
<td>x<code>--</code></td>
<td>post decrement</td>
</tr>
<tr>
<td><code>(type)</code>x</td>
<td>explicit casting</td>
</tr>
</tbody>
</table>
<h3 id="mathematical-operators">Mathematical Operators</h3>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td>x <code>+</code> y</td>
<td>addition, string concatenation</td>
</tr>
<tr>
<td>x <code>-</code> y</td>
<td>subtraction</td>
</tr>
<tr>
<td>x <code>*</code> y</td>
<td>multiplication</td>
</tr>
<tr>
<td>x <code>/</code> y</td>
<td>integer division,</td>
</tr>
<tr>
<td>x <code>%</code> y</td>
<td>modulo, remainder</td>
</tr>
<tr>
<td>x <code>&lt;&lt;</code> y</td>
<td>left bit shift</td>
</tr>
<tr>
<td>x <code>&gt;&gt;</code> y</td>
<td>right bit shift</td>
</tr>
</tbody>
</table>
<h3 id="relational-operators">Relational Operators</h3>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td>x <code>&lt;</code> y</td>
<td>less than</td>
</tr>
<tr>
<td>x <code>&lt;=</code> y</td>
<td>less or equal to</td>
</tr>
<tr>
<td>x <code>&gt;</code> y</td>
<td>greater than</td>
</tr>
<tr>
<td>x <code>&gt;=</code> y</td>
<td>greater or equal to</td>
</tr>
<tr>
<td>x <code>is</code> T</td>
<td><code>true</code> if <code>x</code> is an object of type <code>T</code></td>
</tr>
<tr>
<td>x <code>==</code> y</td>
<td>equality</td>
</tr>
<tr>
<td>x <code>!=</code> y</td>
<td>inequality</td>
</tr>
</tbody>
</table>
<h3 id="logical-operators">Logical Operators</h3>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Operation</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~</code>x</td>
<td>bitwise NOT</td>
<td></td>
</tr>
<tr>
<td>x <code>&amp;</code> y</td>
<td>bitwise AND</td>
<td></td>
</tr>
<tr>
<td>x <code>^</code> y</td>
<td>bitwise XOR</td>
<td></td>
</tr>
<tr>
<td>x <code>|</code> y</td>
<td>bitwise OR</td>
<td></td>
</tr>
<tr>
<td>x <code>&amp;&amp;</code> y</td>
<td>evaluate <code>y</code> only if <code>x</code> is <code>true</code></td>
<td></td>
</tr>
<tr>
<td>x <code>||</code> y</td>
<td>evaluate <code>y</code> only if <code>x</code> is <code>false</code></td>
<td></td>
</tr>
<tr>
<td>x <code>??</code> y</td>
<td>evaluates to <code>y</code> only if <code>x</code> is <code>null</code>, <code>x</code> otherwise</td>
<td>Null coalescing</td>
</tr>
<tr>
<td>x<code>?.</code>y</td>
<td>stop if <code>x == null</code>, evaluate <code>x.y</code> otherwise</td>
<td>Null conditional</td>
</tr>
</tbody>
</table>
<h3 id="assignment">Assignment</h3>
<table>
<thead>
<tr>
<th>Operator</th>
<th>Operation</th>
</tr>
</thead>
<tbody>
<tr>
<td>x <code>+=</code> y</td>
<td>x = x + y</td>
</tr>
<tr>
<td>x <code>-=</code> y</td>
<td>x = x - y</td>
</tr>
<tr>
<td>x <code>*=</code> y</td>
<td>x = x * y</td>
</tr>
<tr>
<td>x <code>/=</code> y</td>
<td>x = x / y</td>
</tr>
<tr>
<td>x <code>%=</code> y</td>
<td>x = x % y</td>
</tr>
<tr>
<td>x <code>&lt;&lt;=</code> y</td>
<td>x = x &lt;&lt; y</td>
</tr>
<tr>
<td>x <code>&gt;&gt;=</code> y</td>
<td>x = x &gt;&gt; y</td>
</tr>
<tr>
<td>x <code>&amp;=</code> y</td>
<td>x = x &amp; y</td>
</tr>
<tr>
<td>x <code>|=</code> y</td>
<td>x = x</td>
</tr>
<tr>
<td>x <code>^=</code> y</td>
<td>x = x ^ y</td>
</tr>
<tr>
<td>x <code>??=</code> y</td>
<td>if (x == null) {x = y}</td>
</tr>
</tbody>
</table>
<h3 id="conditional-operator">Conditional Operator</h3>
<p><code>&lt;condition&gt; ? &lt;return_if_condition_true&gt; : &lt;return_if_condition_false&gt;;</code></p>
<h2 id="decision-statements">Decision Statements</h2>
<h3 id="if-else-if-else"><code>If</code>-<code>Else If</code>-<code>Else</code></h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-37-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-37-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-37-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-37-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-37-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-37-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-37-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-37-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-37-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-37-10">10</a></span>
<span class="normal"><a href="#__codelineno-37-11">11</a></span>
<span class="normal"><a href="#__codelineno-37-12">12</a></span>
<span class="normal"><a href="#__codelineno-37-13">13</a></span>
<span class="normal"><a href="#__codelineno-37-14">14</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-37-1" name="__codelineno-37-1"></a><span class="n">Object</span><span class="w"> </span><span class="n">o</span><span class="p">;</span>
<a id="__codelineno-37-2" name="__codelineno-37-2"></a>
<a id="__codelineno-37-3" name="__codelineno-37-3"></a><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">condition</span><span class="p">)</span>
<a id="__codelineno-37-4" name="__codelineno-37-4"></a><span class="p">{</span>
<a id="__codelineno-37-5" name="__codelineno-37-5"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-37-6" name="__codelineno-37-6"></a><span class="p">}</span>
<a id="__codelineno-37-7" name="__codelineno-37-7"></a><span class="k">else</span><span class="w"> </span><span class="nf">if</span><span class="w"> </span><span class="p">(</span><span class="n">o</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="c1">// test variable to determine if matches a type</span>
<a id="__codelineno-37-8" name="__codelineno-37-8"></a><span class="p">{</span>
<a id="__codelineno-37-9" name="__codelineno-37-9"></a><span class="w"> </span><span class="c1">// t gets the value of o if the test succeeds</span>
<a id="__codelineno-37-10" name="__codelineno-37-10"></a><span class="p">}</span>
<a id="__codelineno-37-11" name="__codelineno-37-11"></a><span class="k">else</span>
<a id="__codelineno-37-12" name="__codelineno-37-12"></a><span class="p">{</span>
<a id="__codelineno-37-13" name="__codelineno-37-13"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-37-14" name="__codelineno-37-14"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="pattern-matching">Pattern Matching</h3>
<p><a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/patterns">Pattern Matching</a></p>
<p>A pattern describes one or more criteria that a value can be tested against. It's usable in switch statements, switch expressions and if statements.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-38-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-38-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-38-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-38-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-38-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-38-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-38-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-38-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-38-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-38-10">10</a></span>
<span class="normal"><a href="#__codelineno-38-11">11</a></span>
<span class="normal"><a href="#__codelineno-38-12">12</a></span>
<span class="normal"><a href="#__codelineno-38-13">13</a></span>
<span class="normal"><a href="#__codelineno-38-14">14</a></span>
<span class="normal"><a href="#__codelineno-38-15">15</a></span>
<span class="normal"><a href="#__codelineno-38-16">16</a></span>
<span class="normal"><a href="#__codelineno-38-17">17</a></span>
<span class="normal"><a href="#__codelineno-38-18">18</a></span>
<span class="normal"><a href="#__codelineno-38-19">19</a></span>
<span class="normal"><a href="#__codelineno-38-20">20</a></span>
<span class="normal"><a href="#__codelineno-38-21">21</a></span>
<span class="normal"><a href="#__codelineno-38-22">22</a></span>
<span class="normal"><a href="#__codelineno-38-23">23</a></span>
<span class="normal"><a href="#__codelineno-38-24">24</a></span>
<span class="normal"><a href="#__codelineno-38-25">25</a></span>
<span class="normal"><a href="#__codelineno-38-26">26</a></span>
<span class="normal"><a href="#__codelineno-38-27">27</a></span>
<span class="normal"><a href="#__codelineno-38-28">28</a></span>
<span class="normal"><a href="#__codelineno-38-29">29</a></span>
<span class="normal"><a href="#__codelineno-38-30">30</a></span>
<span class="normal"><a href="#__codelineno-38-31">31</a></span>
<span class="normal"><a href="#__codelineno-38-32">32</a></span>
<span class="normal"><a href="#__codelineno-38-33">33</a></span>
<span class="normal"><a href="#__codelineno-38-34">34</a></span>
<span class="normal"><a href="#__codelineno-38-35">35</a></span>
<span class="normal"><a href="#__codelineno-38-36">36</a></span>
<span class="normal"><a href="#__codelineno-38-37">37</a></span>
<span class="normal"><a href="#__codelineno-38-38">38</a></span>
<span class="normal"><a href="#__codelineno-38-39">39</a></span>
<span class="normal"><a href="#__codelineno-38-40">40</a></span>
<span class="normal"><a href="#__codelineno-38-41">41</a></span>
<span class="normal"><a href="#__codelineno-38-42">42</a></span>
<span class="normal"><a href="#__codelineno-38-43">43</a></span>
<span class="normal"><a href="#__codelineno-38-44">44</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-38-1" name="__codelineno-38-1"></a><span class="c1">// type pattern</span>
<a id="__codelineno-38-2" name="__codelineno-38-2"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="c1">// type pattern</span>
<a id="__codelineno-38-3" name="__codelineno-38-3"></a>
<a id="__codelineno-38-4" name="__codelineno-38-4"></a><span class="c1">// positional pattern</span>
<a id="__codelineno-38-5" name="__codelineno-38-5"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Y</span><span class="p">):</span><span class="w"> </span><span class="c1">// positional pattern</span>
<a id="__codelineno-38-6" name="__codelineno-38-6"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">):</span><span class="w"> </span><span class="c1">// discard pattern</span>
<a id="__codelineno-38-7" name="__codelineno-38-7"></a>
<a id="__codelineno-38-8" name="__codelineno-38-8"></a><span class="c1">// property pattern</span>
<a id="__codelineno-38-9" name="__codelineno-38-9"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">}:</span><span class="w"> </span><span class="c1">// is type and property has a certain value</span>
<a id="__codelineno-38-10" name="__codelineno-38-10"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">out</span><span class="p">:</span><span class="w"> </span><span class="c1">// output variable is usable in the block</span>
<a id="__codelineno-38-11" name="__codelineno-38-11"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property</span><span class="p">.</span><span class="n">InnerProperty</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// match nested properties</span>
<a id="__codelineno-38-12" name="__codelineno-38-12"></a>
<a id="__codelineno-38-13" name="__codelineno-38-13"></a><span class="c1">// constant pattern</span>
<a id="__codelineno-38-14" name="__codelineno-38-14"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">literalValue</span><span class="w"> </span><span class="c1">// e.g. 1, &#39;c&#39;, &quot;literal&quot;</span>
<a id="__codelineno-38-15" name="__codelineno-38-15"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">CONSTANT</span>
<a id="__codelineno-38-16" name="__codelineno-38-16"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Enum</span><span class="p">.</span><span class="n">Value</span>
<a id="__codelineno-38-17" name="__codelineno-38-17"></a>
<a id="__codelineno-38-18" name="__codelineno-38-18"></a><span class="c1">// logical patterns</span>
<a id="__codelineno-38-19" name="__codelineno-38-19"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="n">pattern</span>
<a id="__codelineno-38-20" name="__codelineno-38-20"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">pattern</span><span class="w"> </span><span class="n">and</span><span class="w"> </span><span class="n">pattern</span>
<a id="__codelineno-38-21" name="__codelineno-38-21"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">pattern</span><span class="w"> </span><span class="n">or</span><span class="w"> </span><span class="n">pattern</span>
<a id="__codelineno-38-22" name="__codelineno-38-22"></a>
<a id="__codelineno-38-23" name="__codelineno-38-23"></a><span class="c1">// relational pattern</span>
<a id="__codelineno-38-24" name="__codelineno-38-24"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">value</span>
<a id="__codelineno-38-25" name="__codelineno-38-25"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="k">value</span>
<a id="__codelineno-38-26" name="__codelineno-38-26"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="k">value</span>
<a id="__codelineno-38-27" name="__codelineno-38-27"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="k">value</span>
<a id="__codelineno-38-28" name="__codelineno-38-28"></a>
<a id="__codelineno-38-29" name="__codelineno-38-29"></a><span class="c1">// multiple value &amp; nested value patterns</span>
<a id="__codelineno-38-30" name="__codelineno-38-30"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property</span><span class="p">.</span><span class="n">InnerProperty</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// match in nested properties</span>
<a id="__codelineno-38-31" name="__codelineno-38-31"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property1</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">Property2</span><span class="p">:</span><span class="w"> </span><span class="n">value2</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// multiple inputs</span>
<a id="__codelineno-38-32" name="__codelineno-38-32"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">(</span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">value2</span><span class="p">)</span><span class="w"> </span><span class="c1">// multiple inputs (with deconstruction)</span>
<a id="__codelineno-38-33" name="__codelineno-38-33"></a>
<a id="__codelineno-38-34" name="__codelineno-38-34"></a><span class="c1">// multiple values and relations</span>
<a id="__codelineno-38-35" name="__codelineno-38-35"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">value2</span><span class="p">),</span>
<a id="__codelineno-38-36" name="__codelineno-38-36"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Property1</span><span class="p">:</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">Property2</span><span class="p">:</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">value2</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-38-37" name="__codelineno-38-37"></a>
<a id="__codelineno-38-38" name="__codelineno-38-38"></a><span class="c1">// list patterns</span>
<a id="__codelineno-38-39" name="__codelineno-38-39"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">[</span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="n">value2</span><span class="p">,</span><span class="w"> </span><span class="n">value1</span><span class="p">]</span><span class="w"> </span><span class="c1">// positional match</span>
<a id="__codelineno-38-40" name="__codelineno-38-40"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">[</span><span class="n">value1</span><span class="w"> </span><span class="n">or</span><span class="w"> </span><span class="n">value2</span><span class="p">,</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="n">value3</span><span class="p">,</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">value4</span><span class="p">]</span><span class="w"> </span><span class="c1">// relational comparison</span>
<a id="__codelineno-38-41" name="__codelineno-38-41"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">[</span><span class="o">&lt;</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="p">..</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Length</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="n">or</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="m">0</span><span class="p">]</span><span class="w"> </span><span class="c1">// item property match</span>
<a id="__codelineno-38-42" name="__codelineno-38-42"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">[</span><span class="n">_</span><span class="p">,</span><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">middle</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">]</span><span class="w"> </span><span class="c1">// discarding &amp; capturing</span>
<a id="__codelineno-38-43" name="__codelineno-38-43"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">[</span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="p">..,</span><span class="w"> </span><span class="n">valueN</span><span class="p">]</span><span class="w"> </span><span class="c1">// match any number of items</span>
<a id="__codelineno-38-44" name="__codelineno-38-44"></a><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="p">[</span><span class="n">value1</span><span class="p">,</span><span class="w"> </span><span class="p">..</span><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">rest</span><span class="p">]</span><span class="w"> </span><span class="c1">// capture any number of items</span>
</code></pre></div></td></tr></table></div>
<h3 id="switch">Switch</h3>
<p>The <code>when</code> keyword can be used to specify a filter condition that causes its associated case label to be true only if the filter condition is also true.</p>
<p><a href="https://dotnetcoretutorials.com/2019/06/25/switch-expressions-in-c-8/">Switch Expressions</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-39-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-39-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-39-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-39-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-39-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-39-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-39-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-39-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-39-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-39-10">10</a></span>
<span class="normal"><a href="#__codelineno-39-11">11</a></span>
<span class="normal"><a href="#__codelineno-39-12">12</a></span>
<span class="normal"><a href="#__codelineno-39-13">13</a></span>
<span class="normal"><a href="#__codelineno-39-14">14</a></span>
<span class="normal"><a href="#__codelineno-39-15">15</a></span>
<span class="normal"><a href="#__codelineno-39-16">16</a></span>
<span class="normal"><a href="#__codelineno-39-17">17</a></span>
<span class="normal"><a href="#__codelineno-39-18">18</a></span>
<span class="normal"><a href="#__codelineno-39-19">19</a></span>
<span class="normal"><a href="#__codelineno-39-20">20</a></span>
<span class="normal"><a href="#__codelineno-39-21">21</a></span>
<span class="normal"><a href="#__codelineno-39-22">22</a></span>
<span class="normal"><a href="#__codelineno-39-23">23</a></span>
<span class="normal"><a href="#__codelineno-39-24">24</a></span>
<span class="normal"><a href="#__codelineno-39-25">25</a></span>
<span class="normal"><a href="#__codelineno-39-26">26</a></span>
<span class="normal"><a href="#__codelineno-39-27">27</a></span>
<span class="normal"><a href="#__codelineno-39-28">28</a></span>
<span class="normal"><a href="#__codelineno-39-29">29</a></span>
<span class="normal"><a href="#__codelineno-39-30">30</a></span>
<span class="normal"><a href="#__codelineno-39-31">31</a></span>
<span class="normal"><a href="#__codelineno-39-32">32</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-39-1" name="__codelineno-39-1"></a><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">expr</span><span class="p">)</span>
<a id="__codelineno-39-2" name="__codelineno-39-2"></a><span class="p">{</span>
<a id="__codelineno-39-3" name="__codelineno-39-3"></a><span class="w"> </span><span class="c1">// multiple labels for same block</span>
<a id="__codelineno-39-4" name="__codelineno-39-4"></a><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">key_0</span><span class="p">:</span>
<a id="__codelineno-39-5" name="__codelineno-39-5"></a><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">key_1</span><span class="p">:</span>
<a id="__codelineno-39-6" name="__codelineno-39-6"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-39-7" name="__codelineno-39-7"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span><span class="w"> </span><span class="c1">// or return or goto</span>
<a id="__codelineno-39-8" name="__codelineno-39-8"></a>
<a id="__codelineno-39-9" name="__codelineno-39-9"></a><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">key_2</span><span class="p">:</span>
<a id="__codelineno-39-10" name="__codelineno-39-10"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-39-11" name="__codelineno-39-11"></a><span class="w"> </span><span class="k">goto</span><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">key_2</span><span class="p">;</span><span class="w"> </span><span class="c1">// explicit fall-through (omitting break is not possible in c#)</span>
<a id="__codelineno-39-12" name="__codelineno-39-12"></a>
<a id="__codelineno-39-13" name="__codelineno-39-13"></a><span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">key_3</span><span class="w"> </span><span class="nf">when</span><span class="w"> </span><span class="p">(</span><span class="n">when</span><span class="o">-</span><span class="n">condition</span><span class="p">):</span>
<a id="__codelineno-39-14" name="__codelineno-39-14"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-39-15" name="__codelineno-39-15"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a id="__codelineno-39-16" name="__codelineno-39-16"></a>
<a id="__codelineno-39-17" name="__codelineno-39-17"></a><span class="w"> </span><span class="c1">// cases using pattern matching</span>
<a id="__codelineno-39-18" name="__codelineno-39-18"></a>
<a id="__codelineno-39-19" name="__codelineno-39-19"></a><span class="w"> </span><span class="k">default</span><span class="p">:</span>
<a id="__codelineno-39-20" name="__codelineno-39-20"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-39-21" name="__codelineno-39-21"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a id="__codelineno-39-22" name="__codelineno-39-22"></a><span class="p">}</span>
<a id="__codelineno-39-23" name="__codelineno-39-23"></a>
<a id="__codelineno-39-24" name="__codelineno-39-24"></a><span class="c1">// return a value based on the value of an input variable or tuple</span>
<a id="__codelineno-39-25" name="__codelineno-39-25"></a><span class="n">variable</span><span class="w"> </span><span class="k">switch</span>
<a id="__codelineno-39-26" name="__codelineno-39-26"></a><span class="p">{</span>
<a id="__codelineno-39-27" name="__codelineno-39-27"></a><span class="w"> </span><span class="n">key_1</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">value</span><span class="p">,</span>
<a id="__codelineno-39-28" name="__codelineno-39-28"></a><span class="w"> </span><span class="n">key_2</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">value</span><span class="p">,</span>
<a id="__codelineno-39-29" name="__codelineno-39-29"></a><span class="w"> </span><span class="c1">// cases using pattern matching</span>
<a id="__codelineno-39-30" name="__codelineno-39-30"></a><span class="w"> </span><span class="p">...</span>
<a id="__codelineno-39-31" name="__codelineno-39-31"></a><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">default_value</span><span class="w"> </span><span class="c1">// underscore (_) discard pattern as default case</span>
<a id="__codelineno-39-32" name="__codelineno-39-32"></a><span class="p">};</span>
</code></pre></div></td></tr></table></div>
<h2 id="loop-statements">Loop Statements</h2>
<h3 id="while-loop"><code>While</code> Loop</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-40-1">1</a></span>
<span class="normal"><a href="#__codelineno-40-2">2</a></span>
<span class="normal"><a href="#__codelineno-40-3">3</a></span>
<span class="normal"><a href="#__codelineno-40-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-40-1" name="__codelineno-40-1"></a><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">condition</span><span class="p">)</span>
<a id="__codelineno-40-2" name="__codelineno-40-2"></a><span class="p">{</span>
<a id="__codelineno-40-3" name="__codelineno-40-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-40-4" name="__codelineno-40-4"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h2 id="do-while-loop"><code>Do</code>-<code>While</code> Loop</h2>
<p>Executes at least one time.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-41-1">1</a></span>
<span class="normal"><a href="#__codelineno-41-2">2</a></span>
<span class="normal"><a href="#__codelineno-41-3">3</a></span>
<span class="normal"><a href="#__codelineno-41-4">4</a></span>
<span class="normal"><a href="#__codelineno-41-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-41-1" name="__codelineno-41-1"></a><span class="k">do</span>
<a id="__codelineno-41-2" name="__codelineno-41-2"></a><span class="p">{</span>
<a id="__codelineno-41-3" name="__codelineno-41-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-41-4" name="__codelineno-41-4"></a><span class="p">}</span>
<a id="__codelineno-41-5" name="__codelineno-41-5"></a><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">condition</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="for-loop"><code>For</code> Loop</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-42-1">1</a></span>
<span class="normal"><a href="#__codelineno-42-2">2</a></span>
<span class="normal"><a href="#__codelineno-42-3">3</a></span>
<span class="normal"><a href="#__codelineno-42-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-42-1" name="__codelineno-42-1"></a><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">initializer</span><span class="p">;</span><span class="w"> </span><span class="n">condition</span><span class="p">;</span><span class="w"> </span><span class="n">iterator</span><span class="p">)</span>
<a id="__codelineno-42-2" name="__codelineno-42-2"></a><span class="p">{</span>
<a id="__codelineno-42-3" name="__codelineno-42-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-42-4" name="__codelineno-42-4"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="foreach-loop"><code>Foreach</code> Loop</h3>
<p>Technically, the <code>foreach</code> statement will work on any type that follows these rules:</p>
<ol>
<li>The type must have a method named <code>GetEnumerator</code> that returns an object.</li>
<li>The returned object must have a property named <code>Current</code> and a method named <code>MoveNext</code>.</li>
<li>The <code>MoveNext</code> method must return <em>true</em> if there are more items to enumerate through or <em>false</em> if there are no more items.</li>
</ol>
<p>There are interfaces named <code>IEnumerable</code> and <code>IEnumerable&lt;T&gt;</code> that formally define these rules but technically the compiler does not require the type to implement these interfaces.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-43-1">1</a></span>
<span class="normal"><a href="#__codelineno-43-2">2</a></span>
<span class="normal"><a href="#__codelineno-43-3">3</a></span>
<span class="normal"><a href="#__codelineno-43-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-43-1" name="__codelineno-43-1"></a><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">item</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">iterabile</span><span class="p">)</span>
<a id="__codelineno-43-2" name="__codelineno-43-2"></a><span class="p">{</span>
<a id="__codelineno-43-3" name="__codelineno-43-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-43-4" name="__codelineno-43-4"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: Due to the use of an <em>iterator</em>, the variable declared in a foreach statement cannot be used to modify the value of the current item.<br />
<strong>Note</strong>: From C# 9 it's possible to implement <code>GetEnumerator()</code> as an <em>extension method</em> making enumerable an class that normally isn't.</p>
</blockquote>
<p>Example:</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-44-1">1</a></span>
<span class="normal"><a href="#__codelineno-44-2">2</a></span>
<span class="normal"><a href="#__codelineno-44-3">3</a></span>
<span class="normal"><a href="#__codelineno-44-4">4</a></span>
<span class="normal"><a href="#__codelineno-44-5">5</a></span>
<span class="normal"><a href="#__codelineno-44-6">6</a></span>
<span class="normal"><a href="#__codelineno-44-7">7</a></span>
<span class="normal"><a href="#__codelineno-44-8">8</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-44-1" name="__codelineno-44-1"></a><span class="c1">// make integers enumerable</span>
<a id="__codelineno-44-2" name="__codelineno-44-2"></a><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">IEnumerator</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="n">GetEnumerator</span><span class="p">(</span><span class="k">this</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">source</span><span class="p">)</span>
<a id="__codelineno-44-3" name="__codelineno-44-3"></a><span class="p">{</span>
<a id="__codelineno-44-4" name="__codelineno-44-4"></a><span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">number</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<a id="__codelineno-44-5" name="__codelineno-44-5"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-44-6" name="__codelineno-44-6"></a><span class="w"> </span><span class="k">yield</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<a id="__codelineno-44-7" name="__codelineno-44-7"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-44-8" name="__codelineno-44-8"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="break-continue"><code>Break</code>, <code>Continue</code></h3>
<p><code>break;</code> interrupts and exits the loop.<br />
<code>continue;</code> restarts the loop cycle without evaluating the instructions.</p>
<h3 id="yield-statement">Yield Statement</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-45-1">1</a></span>
<span class="normal"><a href="#__codelineno-45-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-45-1" name="__codelineno-45-1"></a><span class="k">yield</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expression</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="c1">// returns the results one at a time.</span>
<a id="__codelineno-45-2" name="__codelineno-45-2"></a><span class="k">yield</span><span class="w"> </span><span class="k">break</span><span class="p">;</span><span class="w"> </span><span class="c1">// concludes the iteration</span>
</code></pre></div></td></tr></table></div>
<h3 id="context-statement-using-declarations">Context Statement &amp; Using Declarations</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-46-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-46-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-46-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-46-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-46-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-46-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-46-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-46-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-46-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-46-10">10</a></span>
<span class="normal"><a href="#__codelineno-46-11">11</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-46-1" name="__codelineno-46-1"></a><span class="k">using</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Type</span><span class="p">())</span><span class="w"> </span><span class="c1">// obj disposed at the end of the using block</span>
<a id="__codelineno-46-2" name="__codelineno-46-2"></a><span class="p">{</span>
<a id="__codelineno-46-3" name="__codelineno-46-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-46-4" name="__codelineno-46-4"></a><span class="p">}</span>
<a id="__codelineno-46-5" name="__codelineno-46-5"></a>
<a id="__codelineno-46-6" name="__codelineno-46-6"></a><span class="c1">// or (C# 8+)</span>
<a id="__codelineno-46-7" name="__codelineno-46-7"></a><span class="p">{</span>
<a id="__codelineno-46-8" name="__codelineno-46-8"></a><span class="w"> </span><span class="c1">// inside a code block (if, loop, function)</span>
<a id="__codelineno-46-9" name="__codelineno-46-9"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="nn">Type</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Type</span><span class="p">();</span><span class="w"> </span><span class="c1">// disposed at the end of the block</span>
<a id="__codelineno-46-10" name="__codelineno-46-10"></a>
<a id="__codelineno-46-11" name="__codelineno-46-11"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="checkedunchecked-statements"><code>Checked</code>/<code>Unchecked</code> Statements</h3>
<p>In checked code block ore expression the mathematic overflow causes an <code>OverflowException</code>.<br />
In unchecked code block the mathematic overflow is <em>ignored</em> end the result is <em>truncated</em>.</p>
<p>It's possible configure the C# compiler to put everything into a checked context by default, so that only explicitly unchecked expressions and statements will be able to overflow silently.<br />
It is done by editing the <code>.csproj</code> file, adding <code>&lt;CheckForOverflowUnderflow&gt;true&lt;/CheckForOverflowUnderflow&gt;</code> inside a <code>&lt;PropertyGroup&gt;</code>.</p>
<blockquote>
<p><strong>Note</strong>: checking can make individual integer operations several times slower.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-47-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-47-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-47-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-47-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-47-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-47-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-47-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-47-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-47-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-47-10">10</a></span>
<span class="normal"><a href="#__codelineno-47-11">11</a></span>
<span class="normal"><a href="#__codelineno-47-12">12</a></span>
<span class="normal"><a href="#__codelineno-47-13">13</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-47-1" name="__codelineno-47-1"></a><span class="k">checked</span>
<a id="__codelineno-47-2" name="__codelineno-47-2"></a><span class="p">{</span>
<a id="__codelineno-47-3" name="__codelineno-47-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-47-4" name="__codelineno-47-4"></a><span class="p">}</span>
<a id="__codelineno-47-5" name="__codelineno-47-5"></a>
<a id="__codelineno-47-6" name="__codelineno-47-6"></a><span class="k">checked</span><span class="p">(</span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">);</span>
<a id="__codelineno-47-7" name="__codelineno-47-7"></a>
<a id="__codelineno-47-8" name="__codelineno-47-8"></a><span class="k">unchecked</span>
<a id="__codelineno-47-9" name="__codelineno-47-9"></a><span class="p">{</span>
<a id="__codelineno-47-10" name="__codelineno-47-10"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-47-11" name="__codelineno-47-11"></a><span class="p">}</span>
<a id="__codelineno-47-12" name="__codelineno-47-12"></a>
<a id="__codelineno-47-13" name="__codelineno-47-13"></a><span class="k">unchecked</span><span class="p">(</span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="exception-handling">Exception Handling</h2>
<p><a href="https://docs.microsoft.com/en-us/dotnet/api/system.exception">Exception Object</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-48-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-48-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-48-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-48-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-48-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-48-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-48-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-48-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-48-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-48-10">10</a></span>
<span class="normal"><a href="#__codelineno-48-11">11</a></span>
<span class="normal"><a href="#__codelineno-48-12">12</a></span>
<span class="normal"><a href="#__codelineno-48-13">13</a></span>
<span class="normal"><a href="#__codelineno-48-14">14</a></span>
<span class="normal"><a href="#__codelineno-48-15">15</a></span>
<span class="normal"><a href="#__codelineno-48-16">16</a></span>
<span class="normal"><a href="#__codelineno-48-17">17</a></span>
<span class="normal"><a href="#__codelineno-48-18">18</a></span>
<span class="normal"><a href="#__codelineno-48-19">19</a></span>
<span class="normal"><a href="#__codelineno-48-20">20</a></span>
<span class="normal"><a href="#__codelineno-48-21">21</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-48-1" name="__codelineno-48-1"></a><span class="k">try</span>
<a id="__codelineno-48-2" name="__codelineno-48-2"></a><span class="p">{</span>
<a id="__codelineno-48-3" name="__codelineno-48-3"></a><span class="w"> </span><span class="c1">// &quot;dangerous&quot; code</span>
<a id="__codelineno-48-4" name="__codelineno-48-4"></a><span class="p">}</span>
<a id="__codelineno-48-5" name="__codelineno-48-5"></a><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">SpecificException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span>
<a id="__codelineno-48-6" name="__codelineno-48-6"></a><span class="p">{</span>
<a id="__codelineno-48-7" name="__codelineno-48-7"></a><span class="p">}</span>
<a id="__codelineno-48-8" name="__codelineno-48-8"></a><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">SpecificException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="n">when</span><span class="w"> </span><span class="p">(</span><span class="n">condition</span><span class="p">)</span><span class="w"> </span><span class="c1">// exception filter</span>
<a id="__codelineno-48-9" name="__codelineno-48-9"></a><span class="p">{</span>
<a id="__codelineno-48-10" name="__codelineno-48-10"></a><span class="p">}</span>
<a id="__codelineno-48-11" name="__codelineno-48-11"></a><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span>
<a id="__codelineno-48-12" name="__codelineno-48-12"></a><span class="p">{</span>
<a id="__codelineno-48-13" name="__codelineno-48-13"></a><span class="w"> </span><span class="c1">// code executed if Exception happens</span>
<a id="__codelineno-48-14" name="__codelineno-48-14"></a><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="n">Message</span><span class="w"> </span><span class="c1">// exception message</span>
<a id="__codelineno-48-15" name="__codelineno-48-15"></a><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="n">InnerException</span><span class="w"> </span><span class="c1">// Exception instance that caused the current exception</span>
<a id="__codelineno-48-16" name="__codelineno-48-16"></a><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="n">Source</span><span class="w"> </span><span class="c1">// Get or set the name of the application or the object that causes the error</span>
<a id="__codelineno-48-17" name="__codelineno-48-17"></a><span class="p">}</span>
<a id="__codelineno-48-18" name="__codelineno-48-18"></a><span class="k">finally</span>
<a id="__codelineno-48-19" name="__codelineno-48-19"></a><span class="p">{</span>
<a id="__codelineno-48-20" name="__codelineno-48-20"></a><span class="w"> </span><span class="c1">// code executed anyway</span>
<a id="__codelineno-48-21" name="__codelineno-48-21"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="throwing-exceptions">Throwing Exceptions</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-49-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-49-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-49-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-49-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-49-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-49-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-49-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-49-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-49-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-49-10">10</a></span>
<span class="normal"><a href="#__codelineno-49-11">11</a></span>
<span class="normal"><a href="#__codelineno-49-12">12</a></span>
<span class="normal"><a href="#__codelineno-49-13">13</a></span>
<span class="normal"><a href="#__codelineno-49-14">14</a></span>
<span class="normal"><a href="#__codelineno-49-15">15</a></span>
<span class="normal"><a href="#__codelineno-49-16">16</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-49-1" name="__codelineno-49-1"></a><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ExceptionClass</span><span class="p">();</span>
<a id="__codelineno-49-2" name="__codelineno-49-2"></a><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ExceptionClass</span><span class="p">(</span><span class="s">&quot;message&quot;</span><span class="p">);</span>
<a id="__codelineno-49-3" name="__codelineno-49-3"></a>
<a id="__codelineno-49-4" name="__codelineno-49-4"></a><span class="c1">// RE-THROWING EXCEPTIONS</span>
<a id="__codelineno-49-5" name="__codelineno-49-5"></a><span class="k">try</span>
<a id="__codelineno-49-6" name="__codelineno-49-6"></a><span class="p">{</span>
<a id="__codelineno-49-7" name="__codelineno-49-7"></a><span class="w"> </span><span class="c1">// dangerous code</span>
<a id="__codelineno-49-8" name="__codelineno-49-8"></a><span class="p">}</span>
<a id="__codelineno-49-9" name="__codelineno-49-9"></a><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">SpecificException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span>
<a id="__codelineno-49-10" name="__codelineno-49-10"></a><span class="p">{</span>
<a id="__codelineno-49-11" name="__codelineno-49-11"></a><span class="w"> </span><span class="c1">// log error</span>
<a id="__codelineno-49-12" name="__codelineno-49-12"></a><span class="w"> </span><span class="k">throw</span><span class="p">;</span><span class="w"> </span><span class="c1">// rethrow exception w/o loosing StackTrace &amp; TargetSite information (usable only inside catch)</span>
<a id="__codelineno-49-13" name="__codelineno-49-13"></a><span class="p">}</span>
<a id="__codelineno-49-14" name="__codelineno-49-14"></a>
<a id="__codelineno-49-15" name="__codelineno-49-15"></a><span class="c1">// Immediately terminate a process after writing a message to the Windows Application event log, and then include the message and optional exception information in error reporting to Microsoft.</span>
<a id="__codelineno-49-16" name="__codelineno-49-16"></a><span class="n">Environment</span><span class="p">.</span><span class="n">FailFast</span><span class="p">(</span><span class="n">causeOfFailure</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="custom-exceptions">Custom Exceptions</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-50-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-50-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-50-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-50-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-50-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-50-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-50-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-50-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-50-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-50-10">10</a></span>
<span class="normal"><a href="#__codelineno-50-11">11</a></span>
<span class="normal"><a href="#__codelineno-50-12">12</a></span>
<span class="normal"><a href="#__codelineno-50-13">13</a></span>
<span class="normal"><a href="#__codelineno-50-14">14</a></span>
<span class="normal"><a href="#__codelineno-50-15">15</a></span>
<span class="normal"><a href="#__codelineno-50-16">16</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-50-1" name="__codelineno-50-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">CustomException</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="c1">// must derive from Exception (either directly or indirectly)</span>
<a id="__codelineno-50-2" name="__codelineno-50-2"></a><span class="p">{</span>
<a id="__codelineno-50-3" name="__codelineno-50-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">CustomException</span><span class="p">()</span>
<a id="__codelineno-50-4" name="__codelineno-50-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-50-5" name="__codelineno-50-5"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-50-6" name="__codelineno-50-6"></a>
<a id="__codelineno-50-7" name="__codelineno-50-7"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">CustomException</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">message</span><span class="p">)</span>
<a id="__codelineno-50-8" name="__codelineno-50-8"></a><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<a id="__codelineno-50-9" name="__codelineno-50-9"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-50-10" name="__codelineno-50-10"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-50-11" name="__codelineno-50-11"></a>
<a id="__codelineno-50-12" name="__codelineno-50-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">CustomException</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">message</span><span class="p">,</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="n">inner</span><span class="p">)</span>
<a id="__codelineno-50-13" name="__codelineno-50-13"></a><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="n">message</span><span class="p">,</span><span class="w"> </span><span class="n">inner</span><span class="p">)</span>
<a id="__codelineno-50-14" name="__codelineno-50-14"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-50-15" name="__codelineno-50-15"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-50-16" name="__codelineno-50-16"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="enums">Enums</h2>
<p>An enumeration type (or enum type) is a value type defined by a set of <strong>named constants</strong> of the underlying <em>integral numeric</em> type (<code>int</code>, <code>long</code>, <code>byte</code>, ...).<br />
Consecutive names increase the value by one.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-51-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-51-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-51-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-51-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-51-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-51-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-51-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-51-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-51-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-51-10">10</a></span>
<span class="normal"><a href="#__codelineno-51-11">11</a></span>
<span class="normal"><a href="#__codelineno-51-12">12</a></span>
<span class="normal"><a href="#__codelineno-51-13">13</a></span>
<span class="normal"><a href="#__codelineno-51-14">14</a></span>
<span class="normal"><a href="#__codelineno-51-15">15</a></span>
<span class="normal"><a href="#__codelineno-51-16">16</a></span>
<span class="normal"><a href="#__codelineno-51-17">17</a></span>
<span class="normal"><a href="#__codelineno-51-18">18</a></span>
<span class="normal"><a href="#__codelineno-51-19">19</a></span>
<span class="normal"><a href="#__codelineno-51-20">20</a></span>
<span class="normal"><a href="#__codelineno-51-21">21</a></span>
<span class="normal"><a href="#__codelineno-51-22">22</a></span>
<span class="normal"><a href="#__codelineno-51-23">23</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-51-1" name="__codelineno-51-1"></a><span class="na">[Flags]</span><span class="w"> </span><span class="c1">// indicate that the flag can be combined (best if values are binary) as a bit mask</span>
<a id="__codelineno-51-2" name="__codelineno-51-2"></a><span class="k">enum</span><span class="w"> </span><span class="n">EnumType</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">IntegralNumericType</span><span class="w"> </span><span class="c1">// named values MUST match IntegerNumericType allowed values</span>
<a id="__codelineno-51-3" name="__codelineno-51-3"></a><span class="p">{</span>
<a id="__codelineno-51-4" name="__codelineno-51-4"></a><span class="w"> </span><span class="n">None</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="c1">// if uninitiated value is zero</span>
<a id="__codelineno-51-5" name="__codelineno-51-5"></a><span class="w"> </span><span class="n">Const</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="c1">// value is 2</span>
<a id="__codelineno-51-6" name="__codelineno-51-6"></a><span class="w"> </span><span class="n">Const2</span><span class="p">,</span><span class="w"> </span><span class="c1">// value is Const + 1</span>
<a id="__codelineno-51-7" name="__codelineno-51-7"></a><span class="w"> </span><span class="p">...</span>
<a id="__codelineno-51-8" name="__codelineno-51-8"></a><span class="p">}</span>
<a id="__codelineno-51-9" name="__codelineno-51-9"></a>
<a id="__codelineno-51-10" name="__codelineno-51-10"></a><span class="p">(</span><span class="n">Type</span><span class="p">)</span><span class="w"> </span><span class="n">EnumType</span><span class="p">.</span><span class="n">Const</span><span class="p">;</span><span class="w"> </span><span class="c1">// extract the value, will return the name otherwise</span>
<a id="__codelineno-51-11" name="__codelineno-51-11"></a><span class="p">(</span><span class="n">EnumType</span><span class="p">)</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="c1">// convert from associated value to enum</span>
<a id="__codelineno-51-12" name="__codelineno-51-12"></a>
<a id="__codelineno-51-13" name="__codelineno-51-13"></a><span class="n">Enum</span><span class="p">.</span><span class="n">IsDefined</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">EnumType</span><span class="p">),</span><span class="w"> </span><span class="k">value</span><span class="p">);</span><span class="w"> </span><span class="c1">// whether a given integral value, or its name as a string, exists in a specified enumeration.</span>
<a id="__codelineno-51-14" name="__codelineno-51-14"></a><span class="n">enumObj</span><span class="p">.</span><span class="n">HasValue</span><span class="p">(</span><span class="n">enumType</span><span class="p">.</span><span class="n">Const</span><span class="p">)</span><span class="w"> </span><span class="c1">// test whether a flag is set in a numeric value</span>
<a id="__codelineno-51-15" name="__codelineno-51-15"></a>
<a id="__codelineno-51-16" name="__codelineno-51-16"></a><span class="n">EnumType</span><span class="w"> </span><span class="n">instance</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">EnumType</span><span class="p">)</span><span class="w"> </span><span class="n">EnumType</span><span class="p">.</span><span class="n">ToObject</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">EnumType</span><span class="p">),</span><span class="w"> </span><span class="k">value</span><span class="p">);</span><span class="w"> </span><span class="c1">// convert a value of any integral type to an enumeration value</span>
<a id="__codelineno-51-17" name="__codelineno-51-17"></a>
<a id="__codelineno-51-18" name="__codelineno-51-18"></a><span class="c1">// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object</span>
<a id="__codelineno-51-19" name="__codelineno-51-19"></a><span class="n">Enum</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">EnumType</span><span class="p">),</span><span class="w"> </span><span class="k">value</span><span class="p">);</span>
<a id="__codelineno-51-20" name="__codelineno-51-20"></a><span class="n">Enum</span><span class="p">.</span><span class="n">TryParse</span><span class="o">&lt;</span><span class="n">EnumType</span><span class="o">&gt;</span><span class="p">(</span><span class="kt">string</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">EnumType</span><span class="w"> </span><span class="n">enumObj</span><span class="p">);</span>
<a id="__codelineno-51-21" name="__codelineno-51-21"></a>
<a id="__codelineno-51-22" name="__codelineno-51-22"></a><span class="c1">// retrieve a string array containing the names of the enumeration members</span>
<a id="__codelineno-51-23" name="__codelineno-51-23"></a><span class="kt">string</span><span class="p">[]</span><span class="w"> </span><span class="n">enumNames</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Enum</span><span class="p">.</span><span class="n">GetNames</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">EnumType</span><span class="p">));</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="methods">Methods</h2>
<p>The method signature is the number &amp; type of the input parameters defined for the method.</p>
<p>C# makes the fairly common distinction between <em>parameters</em> and <em>arguments</em>: a method defines a list of the inputs it expects (the parameters) and the code inside the method refers to these parameters by name.<br />
The values seen by the code could be different each time the method is invoked, and the term argument refers to the specific value supplied for a parameter in a particular invocation.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-52-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-52-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-52-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-52-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-52-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-52-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-52-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-52-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-52-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-52-10">10</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-52-1" name="__codelineno-52-1"></a><span class="n">type</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<a id="__codelineno-52-2" name="__codelineno-52-2"></a><span class="p">{</span>
<a id="__codelineno-52-3" name="__codelineno-52-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-52-4" name="__codelineno-52-4"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expression</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-52-5" name="__codelineno-52-5"></a><span class="p">}</span>
<a id="__codelineno-52-6" name="__codelineno-52-6"></a>
<a id="__codelineno-52-7" name="__codelineno-52-7"></a><span class="k">void</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-52-8" name="__codelineno-52-8"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-52-9" name="__codelineno-52-9"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span><span class="w"> </span><span class="c1">// if type is void return can be used to force early termination or can be omitted</span>
<a id="__codelineno-52-10" name="__codelineno-52-10"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="expression-body-definition">Expression Body Definition</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-53-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-53-1" name="__codelineno-53-1"></a><span class="n">type</span><span class="w"> </span><span class="nf">MethodName</span><span class="p">()</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expression</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="c1">// expression result type MUST match method type</span>
</code></pre></div></td></tr></table></div>
<h3 id="arbitrary-number-of-parameter-in-methods">Arbitrary Number Of Parameter In Methods</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-54-1">1</a></span>
<span class="normal"><a href="#__codelineno-54-2">2</a></span>
<span class="normal"><a href="#__codelineno-54-3">3</a></span>
<span class="normal"><a href="#__codelineno-54-4">4</a></span>
<span class="normal"><a href="#__codelineno-54-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-54-1" name="__codelineno-54-1"></a><span class="c1">// params keyword must be last parameter and must be an array</span>
<a id="__codelineno-54-2" name="__codelineno-54-2"></a><span class="n">type</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="k">params</span><span class="w"> </span><span class="n">type</span><span class="p">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span>
<a id="__codelineno-54-3" name="__codelineno-54-3"></a><span class="p">{</span>
<a id="__codelineno-54-4" name="__codelineno-54-4"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-54-5" name="__codelineno-54-5"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="named-arguments"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#named-arguments">Named Arguments</a></h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-55-1">1</a></span>
<span class="normal"><a href="#__codelineno-55-2">2</a></span>
<span class="normal"><a href="#__codelineno-55-3">3</a></span>
<span class="normal"><a href="#__codelineno-55-4">4</a></span>
<span class="normal"><a href="#__codelineno-55-5">5</a></span>
<span class="normal"><a href="#__codelineno-55-6">6</a></span>
<span class="normal"><a href="#__codelineno-55-7">7</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-55-1" name="__codelineno-55-1"></a><span class="n">type</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">param1</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">param2</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-55-2" name="__codelineno-55-2"></a>
<a id="__codelineno-55-3" name="__codelineno-55-3"></a><span class="n">MethodName</span><span class="p">(</span><span class="n">param1</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">,</span><span class="w"> </span><span class="n">param2</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">);</span>
<a id="__codelineno-55-4" name="__codelineno-55-4"></a><span class="n">MethodName</span><span class="p">(</span><span class="n">param2</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">,</span><span class="w"> </span><span class="n">param1</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">);</span><span class="w"> </span><span class="c1">// order can be any</span>
<a id="__codelineno-55-5" name="__codelineno-55-5"></a>
<a id="__codelineno-55-6" name="__codelineno-55-6"></a><span class="c1">// Named arguments, when used with positional arguments, are valid as long as they&#39;re not followed by any positional arguments, or they&#39;re used in the correct position.</span>
<a id="__codelineno-55-7" name="__codelineno-55-7"></a><span class="n">MethodName</span><span class="p">(</span><span class="k">value</span><span class="p">,</span><span class="w"> </span><span class="n">param2</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="optional-arguments"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#optional-arguments">Optional Arguments</a></h3>
<p>The definition of a method, constructor, indexer, or delegate can specify that its parameters are required or that they are optional.<br />
Any call must provide arguments for all required parameters, but can omit arguments for optional parameters.</p>
<p>Each optional parameter has a default value as part of its definition. If no argument is sent for that parameter, the default value is used.<br />
Optional parameters are defined at the end of the parameter list, after any required parameters.</p>
<p>A default value must be one of the following types of expressions:</p>
<ul>
<li>a constant expression;</li>
<li>an expression of the form new ValType(), where ValType is a value type, such as an enum or a struct;</li>
<li>an expression of the form default(ValType), where ValType is a value type.</li>
</ul>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-56-1">1</a></span>
<span class="normal"><a href="#__codelineno-56-2">2</a></span>
<span class="normal"><a href="#__codelineno-56-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-56-1" name="__codelineno-56-1"></a><span class="n">type</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">required</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">firstOptional</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">default_value</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">secondOptional</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">default_value</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-56-2" name="__codelineno-56-2"></a><span class="n">MethodName</span><span class="p">(</span><span class="n">value1</span><span class="p">);</span><span class="w"> </span><span class="c1">// use defaults for optional arguments</span>
<a id="__codelineno-56-3" name="__codelineno-56-3"></a><span class="n">MethodName</span><span class="p">(</span><span class="n">required</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">,</span><span class="w"> </span><span class="n">secondOptional</span><span class="p">:</span><span class="w"> </span><span class="k">value</span><span class="p">);</span><span class="w"> </span><span class="c1">// use default for first optional but pass second optional</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: If the caller provides an argument for any one of a succession of optional parameters, it must provide arguments for all preceding optional parameters. Comma-separated gaps in the argument list are not supported.</p>
</blockquote>
<h3 id="passing-values-by-reference-ref-out-in">Passing Values By Reference (<code>ref</code>, <code>out</code>, <code>in</code>)</h3>
<p><a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ref">Ref Docs</a>, <a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier">Out Docs</a>, <a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-parameter-modifier">In Docs</a></p>
<p>The <code>out</code>, <code>in</code>, <code>ref</code> keywords cause arguments to be <em>passed by reference</em>. It makes the <em>formal parameter</em> an alias for the argument, which must be a variable.<br />
In other words, any operation on the parameter is made <em>on the argument</em>. This behaviour is the same for classes and structs.</p>
<p>An argument that is passed to a <code>ref</code> or <code>in</code> parameter <strong>must be initialized</strong> before it is passed. However <code>in</code> arguments <em>cannot be modified</em> by the called method.<br />
Variables passed as <code>out</code> arguments do not have to be initialized before being passed in a method call. However, the called method is <strong>required to assign a value</strong> before the method returns.</p>
<p>Use cases:</p>
<ul>
<li><code>out</code>: return multiple values from a method (move data into method)</li>
<li><code>ref</code>: move data bidirectionally between method and call scope</li>
<li><code>in</code>: pass large value type (e,g, struct) as a reference avoiding copying large amounts of data (must be readonly, copied regardless otherwise)</li>
</ul>
<blockquote>
<p><strong>Note</strong>: use <code>in</code> only with readonly value types, because mutable value types can undo the performance benefits. (Mutable value types are typically a bad idea in any case.)</p>
</blockquote>
<p>While the method can use members of the passed reference type, it can't normally replace it with a different object.<br />
But if a reference type argument is marked with ref, the method has access to the variable, so it could replace it with a reference to a completely different object.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-57-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-57-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-57-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-57-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-57-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-57-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-57-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-57-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-57-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-57-10">10</a></span>
<span class="normal"><a href="#__codelineno-57-11">11</a></span>
<span class="normal"><a href="#__codelineno-57-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-57-1" name="__codelineno-57-1"></a><span class="c1">// method declaration</span>
<a id="__codelineno-57-2" name="__codelineno-57-2"></a><span class="n">type</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">param1</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">param2</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">param3</span><span class="p">,</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">param4</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<a id="__codelineno-57-3" name="__codelineno-57-3"></a><span class="p">{</span>
<a id="__codelineno-57-4" name="__codelineno-57-4"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-57-5" name="__codelineno-57-5"></a><span class="p">}</span>
<a id="__codelineno-57-6" name="__codelineno-57-6"></a>
<a id="__codelineno-57-7" name="__codelineno-57-7"></a><span class="c1">// method call needs REF &amp; OUT keywords, IN keyword is optional (pass by reference regardless)</span>
<a id="__codelineno-57-8" name="__codelineno-57-8"></a><span class="n">MethodName</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">arg2</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">arg3</span><span class="p">,</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">arg4</span><span class="p">);</span>
<a id="__codelineno-57-9" name="__codelineno-57-9"></a><span class="n">MethodName</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">arg2</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">arg3</span><span class="p">,</span><span class="w"> </span><span class="n">arg4</span><span class="p">);</span>
<a id="__codelineno-57-10" name="__codelineno-57-10"></a>
<a id="__codelineno-57-11" name="__codelineno-57-11"></a><span class="n">type</span><span class="w"> </span><span class="nf">OutMethod</span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">param1</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">param2</span><span class="p">){}</span>
<a id="__codelineno-57-12" name="__codelineno-57-12"></a><span class="n">OutMethod</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">arg2</span><span class="p">);</span><span class="w"> </span><span class="c1">// create out variable on the fly</span>
</code></pre></div></td></tr></table></div>
<h3 id="returning-multiple-values-with-tuples">Returning Multiple Values with Tuples</h3>
<p><strong>Must</strong> be C# 7+.<br />
The retuned tuple MUST match the tuple-type in the instantiation</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-58-1">1</a></span>
<span class="normal"><a href="#__codelineno-58-2">2</a></span>
<span class="normal"><a href="#__codelineno-58-3">3</a></span>
<span class="normal"><a href="#__codelineno-58-4">4</a></span>
<span class="normal"><a href="#__codelineno-58-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-58-1" name="__codelineno-58-1"></a><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">returnedVar1</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">returnedVar2</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="n">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<a id="__codelineno-58-2" name="__codelineno-58-2"></a><span class="p">{</span>
<a id="__codelineno-58-3" name="__codelineno-58-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-58-4" name="__codelineno-58-4"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="n">expression</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<a id="__codelineno-58-5" name="__codelineno-58-5"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="returning-multiple-values-w-structs-return-struct-variable">Returning Multiple Values W/ Structs (Return Struct Variable)</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-59-1">1</a></span>
<span class="normal"><a href="#__codelineno-59-2">2</a></span>
<span class="normal"><a href="#__codelineno-59-3">3</a></span>
<span class="normal"><a href="#__codelineno-59-4">4</a></span>
<span class="normal"><a href="#__codelineno-59-5">5</a></span>
<span class="normal"><a href="#__codelineno-59-6">6</a></span>
<span class="normal"><a href="#__codelineno-59-7">7</a></span>
<span class="normal"><a href="#__codelineno-59-8">8</a></span>
<span class="normal"><a href="#__codelineno-59-9">9</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-59-1" name="__codelineno-59-1"></a><span class="n">StructName</span><span class="w"> </span><span class="nf">MethodName</span><span class="w"> </span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<a id="__codelineno-59-2" name="__codelineno-59-2"></a><span class="p">{</span>
<a id="__codelineno-59-3" name="__codelineno-59-3"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-59-4" name="__codelineno-59-4"></a><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StructName</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-59-5" name="__codelineno-59-5"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-59-6" name="__codelineno-59-6"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-59-7" name="__codelineno-59-7"></a>
<a id="__codelineno-59-8" name="__codelineno-59-8"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">variable</span><span class="p">;</span>
<a id="__codelineno-59-9" name="__codelineno-59-9"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="local-functions">Local Functions</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-60-1">1</a></span>
<span class="normal"><a href="#__codelineno-60-2">2</a></span>
<span class="normal"><a href="#__codelineno-60-3">3</a></span>
<span class="normal"><a href="#__codelineno-60-4">4</a></span>
<span class="normal"><a href="#__codelineno-60-5">5</a></span>
<span class="normal"><a href="#__codelineno-60-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-60-1" name="__codelineno-60-1"></a><span class="n">type</span><span class="w"> </span><span class="nf">OuterMethod</span><span class="p">(...)</span>
<a id="__codelineno-60-2" name="__codelineno-60-2"></a><span class="p">{</span>
<a id="__codelineno-60-3" name="__codelineno-60-3"></a><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">InnerMethod</span><span class="p">();</span>
<a id="__codelineno-60-4" name="__codelineno-60-4"></a>
<a id="__codelineno-60-5" name="__codelineno-60-5"></a><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="nf">InnerMethod</span><span class="p">(...)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-60-6" name="__codelineno-60-6"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="extension-methods">Extension Methods</h3>
<p>Extension methods allow their usage applied to the extended type as if their declaration was inside the object's class.<br />
Extension methods are not really members of the class for which they are defined.<br />
It's just an illusion maintained by the C# compiler, one that it keeps up even in situations where method invocation happens implicitly.</p>
<blockquote>
<p><strong>Note</strong>: Extension Method can be declared only inside static classes. Extension methods are available only if their namespace is imported with the <code>using</code> keyword.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-61-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-61-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-61-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-61-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-61-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-61-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-61-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-61-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-61-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-61-10">10</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-61-1" name="__codelineno-61-1"></a><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ExtensionMethods</span>
<a id="__codelineno-61-2" name="__codelineno-61-2"></a><span class="p">{</span>
<a id="__codelineno-61-3" name="__codelineno-61-3"></a><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="nf">ExtensionMethod</span><span class="p">(</span><span class="k">this</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">param</span><span class="p">)</span>
<a id="__codelineno-61-4" name="__codelineno-61-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-61-5" name="__codelineno-61-5"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-61-6" name="__codelineno-61-6"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-61-7" name="__codelineno-61-7"></a><span class="p">}</span>
<a id="__codelineno-61-8" name="__codelineno-61-8"></a>
<a id="__codelineno-61-9" name="__codelineno-61-9"></a><span class="n">type</span><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<a id="__codelineno-61-10" name="__codelineno-61-10"></a><span class="kt">var</span><span class="p">.</span><span class="n">ExtensionMethod</span><span class="p">();</span><span class="w"> </span><span class="c1">// use the method on a object as if the method belongs to the object</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="iterators"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/iterators">Iterators</a></h2>
<p>An iterator can be used to step through collections such as lists and arrays.</p>
<p>An iterator method or <code>get</code> accessor performs a custom iteration over a collection. An iterator method uses the <code>yield return</code> statement to return each element one at a time.<br />
When a <code>yield return</code> statement is reached, the current location in code is remembered. Execution is restarted from that location the next time the iterator function is called.</p>
<p>It's possible to use a <code>yield break</code> statement or exception to end the iteration.</p>
<blockquote>
<p><strong>Note</strong>: Since an iterator returns an <code>IEnumerable&lt;T&gt;</code> is can be used to implement a <code>GetEnumerator()</code>.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-62-1">1</a></span>
<span class="normal"><a href="#__codelineno-62-2">2</a></span>
<span class="normal"><a href="#__codelineno-62-3">3</a></span>
<span class="normal"><a href="#__codelineno-62-4">4</a></span>
<span class="normal"><a href="#__codelineno-62-5">5</a></span>
<span class="normal"><a href="#__codelineno-62-6">6</a></span>
<span class="normal"><a href="#__codelineno-62-7">7</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-62-1" name="__codelineno-62-1"></a><span class="c1">// simple iterator</span>
<a id="__codelineno-62-2" name="__codelineno-62-2"></a><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">Collections</span><span class="p">.</span><span class="n">IEnumerable</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="n">IterateRange</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">end</span><span class="p">)</span>
<a id="__codelineno-62-3" name="__codelineno-62-3"></a><span class="p">{</span>
<a id="__codelineno-62-4" name="__codelineno-62-4"></a><span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">start</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">end</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
<a id="__codelineno-62-5" name="__codelineno-62-5"></a><span class="w"> </span><span class="k">yield</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<a id="__codelineno-62-6" name="__codelineno-62-6"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-62-7" name="__codelineno-62-7"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="structs-custom-value-types-classes-custom-reference-types">Structs (Custom Value Types) &amp; Classes (Custom Reference Types)</h2>
<p><img alt="reference-vs-value" src="../../../img/dotnet_pass-by-reference-vs-pass-by-value-animation.gif" /></p>
<p><strong>Structure</strong> types have <em>value semantics</em>. That is, a variable of a structure type contains an <em>instance</em> of the type.</p>
<p><strong>Class</strong> types have <em>reference semantics</em>. That is, a variable of a class type contains a <em>reference to an instance</em> of the type, not the instance itself.</p>
<p>Typically, you use structure types to design small data-centric types that provide little or no behavior. If you're focused on the behavior of a type, consider defining a class.<br />
Because structure types have value semantics, we recommend you to define immutable structure types.</p>
<p>Creating a new instance of a value type doesn't necessarily mean allocating more memory, whereas with reference types, a new instance means anew heap block.<br />
This is why it's OK for each operation performed with a value type to produce a new instance.</p>
<p>The most important question is : does the identity of an instance matter? In other words, is the distinction between one object and another object important?</p>
<p>An important and related question is: does an instance of the type contain state that changes over time?<br />
Modifiable value types tend to be problematic, because it's all too easy to end up working with some copy of a value, and not the correct instance.<br />
So it's usually a good idea for value types to be immutable. This doesn't mean that variables of these types cannot be modified;<br />
it just means that to modify the variable, its contents must be replaced entirely with a different value.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-63-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-63-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-63-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-63-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-63-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-63-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-63-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-63-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-63-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-63-10">10</a></span>
<span class="normal"><a href="#__codelineno-63-11">11</a></span>
<span class="normal"><a href="#__codelineno-63-12">12</a></span>
<span class="normal"><a href="#__codelineno-63-13">13</a></span>
<span class="normal"><a href="#__codelineno-63-14">14</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-63-1" name="__codelineno-63-1"></a><span class="k">public</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">Point</span>
<a id="__codelineno-63-2" name="__codelineno-63-2"></a><span class="p">{</span>
<a id="__codelineno-63-3" name="__codelineno-63-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Point</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">y</span><span class="p">)</span>
<a id="__codelineno-63-4" name="__codelineno-63-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-63-5" name="__codelineno-63-5"></a><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
<a id="__codelineno-63-6" name="__codelineno-63-6"></a><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
<a id="__codelineno-63-7" name="__codelineno-63-7"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-63-8" name="__codelineno-63-8"></a>
<a id="__codelineno-63-9" name="__codelineno-63-9"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">X</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-63-10" name="__codelineno-63-10"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Y</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-63-11" name="__codelineno-63-11"></a>
<a id="__codelineno-63-12" name="__codelineno-63-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="nf">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">$&quot;({X}, {Y})&quot;</span><span class="p">;</span>
<a id="__codelineno-63-13" name="__codelineno-63-13"></a>
<a id="__codelineno-63-14" name="__codelineno-63-14"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: From C# 10 is possible to have a parameterless constructor and make a new struct using a <code>with</code> statement.
<strong>Note</strong>: From C# 11 uninitialized values will be filed with their defaults</p>
</blockquote>
<p>The only way to affect a struct variable both inside a method and outside is to use the <code>ref</code> keyword;</p>
<h3 id="modifiers-methods-variables">Modifiers (Methods &amp; Variables)</h3>
<p>A locally scoped variable is only accessible inside of the code block in which it's defined.<br />
If you attempt to access the variable outside of the code block, you'll get a compiler error.</p>
<p><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers">Access Modifiers</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-64-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-64-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-64-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-64-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-64-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-64-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-64-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-64-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-64-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-64-10">10</a></span>
<span class="normal"><a href="#__codelineno-64-11">11</a></span>
<span class="normal"><a href="#__codelineno-64-12">12</a></span>
<span class="normal"><a href="#__codelineno-64-13">13</a></span>
<span class="normal"><a href="#__codelineno-64-14">14</a></span>
<span class="normal"><a href="#__codelineno-64-15">15</a></span>
<span class="normal"><a href="#__codelineno-64-16">16</a></span>
<span class="normal"><a href="#__codelineno-64-17">17</a></span>
<span class="normal"><a href="#__codelineno-64-18">18</a></span>
<span class="normal"><a href="#__codelineno-64-19">19</a></span>
<span class="normal"><a href="#__codelineno-64-20">20</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-64-1" name="__codelineno-64-1"></a><span class="c1">// ACCESS MODIFIERS</span>
<a id="__codelineno-64-2" name="__codelineno-64-2"></a><span class="k">public</span><span class="w"> </span><span class="c1">// visible from everywhere</span>
<a id="__codelineno-64-3" name="__codelineno-64-3"></a><span class="k">private</span><span class="w"> </span><span class="c1">// not visible outside of the class (default for members)</span>
<a id="__codelineno-64-4" name="__codelineno-64-4"></a><span class="k">protected</span><span class="w"> </span><span class="c1">// visible only to the same class and extending classes</span>
<a id="__codelineno-64-5" name="__codelineno-64-5"></a><span class="k">internal</span><span class="w"> </span><span class="c1">// available for use only within the assembly (default for classes)</span>
<a id="__codelineno-64-6" name="__codelineno-64-6"></a><span class="k">protected</span><span class="w"> </span><span class="k">internal</span><span class="w"> </span><span class="c1">// can be accessed by any code in the assembly in which it&#39;s declared, or from within a derived class in another assembly</span>
<a id="__codelineno-64-7" name="__codelineno-64-7"></a><span class="k">private</span><span class="w"> </span><span class="k">protected</span><span class="w"> </span><span class="c1">// can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class</span>
<a id="__codelineno-64-8" name="__codelineno-64-8"></a><span class="n">file</span><span class="w"> </span><span class="c1">// can be accessed only in the same file in which is declared. Will not clash with other classes/method/interface with the same name</span>
<a id="__codelineno-64-9" name="__codelineno-64-9"></a>
<a id="__codelineno-64-10" name="__codelineno-64-10"></a><span class="k">readonly</span><span class="w"> </span><span class="c1">// value can be read but not modified</span>
<a id="__codelineno-64-11" name="__codelineno-64-11"></a><span class="k">static</span><span class="w"> </span><span class="c1">// not of the instance of a class</span>
<a id="__codelineno-64-12" name="__codelineno-64-12"></a><span class="k">sealed</span><span class="w"> </span><span class="c1">// cannot be inherited or overridden (default case), sealing a virtual class/method prevents further modifications (on methods sealed must always be used with override)</span>
<a id="__codelineno-64-13" name="__codelineno-64-13"></a><span class="k">abstract</span><span class="w"> </span><span class="c1">// derived classes MUST implement this</span>
<a id="__codelineno-64-14" name="__codelineno-64-14"></a><span class="k">virtual</span><span class="w"> </span><span class="c1">// can be overridden by derived classes (applicable to Properties)</span>
<a id="__codelineno-64-15" name="__codelineno-64-15"></a><span class="k">new</span><span class="w"> </span><span class="c1">// hide base&#39;s (parent&#39;s) method</span>
<a id="__codelineno-64-16" name="__codelineno-64-16"></a>
<a id="__codelineno-64-17" name="__codelineno-64-17"></a><span class="k">async</span><span class="w"> </span><span class="c1">// method, lambda expression, or anonymous method is asynchronous</span>
<a id="__codelineno-64-18" name="__codelineno-64-18"></a><span class="n">volatile</span><span class="w"> </span><span class="c1">// field might be modified by multiple threads that are executing at the same time</span>
<a id="__codelineno-64-19" name="__codelineno-64-19"></a><span class="k">unsafe</span><span class="w"> </span><span class="c1">// unsafe context, required for any operation involving pointers</span>
<a id="__codelineno-64-20" name="__codelineno-64-20"></a><span class="k">extern</span><span class="w"> </span><span class="c1">// method is implemented externally</span>
</code></pre></div></td></tr></table></div>
<p><code>partial</code> indicates that other parts of the class, struct, or interface can be defined in the namespace.<br />
All the parts must use the partial keyword.<br />
All the parts must be available at compile time to form the final type.<br />
All the parts must have the same accessibility.</p>
<p>If any part is declared abstract, then the whole type is considered abstract.<br />
If any part is declared sealed, then the whole type is considered sealed.<br />
If any part declares a base type, then the whole type inherits that class.</p>
<h3 id="methods_1">Methods</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-65-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-65-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-65-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-65-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-65-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-65-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-65-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-65-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-65-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-65-10">10</a></span>
<span class="normal"><a href="#__codelineno-65-11">11</a></span>
<span class="normal"><a href="#__codelineno-65-12">12</a></span>
<span class="normal"><a href="#__codelineno-65-13">13</a></span>
<span class="normal"><a href="#__codelineno-65-14">14</a></span>
<span class="normal"><a href="#__codelineno-65-15">15</a></span>
<span class="normal"><a href="#__codelineno-65-16">16</a></span>
<span class="normal"><a href="#__codelineno-65-17">17</a></span>
<span class="normal"><a href="#__codelineno-65-18">18</a></span>
<span class="normal"><a href="#__codelineno-65-19">19</a></span>
<span class="normal"><a href="#__codelineno-65-20">20</a></span>
<span class="normal"><a href="#__codelineno-65-21">21</a></span>
<span class="normal"><a href="#__codelineno-65-22">22</a></span>
<span class="normal"><a href="#__codelineno-65-23">23</a></span>
<span class="normal"><a href="#__codelineno-65-24">24</a></span>
<span class="normal"><a href="#__codelineno-65-25">25</a></span>
<span class="normal"><a href="#__codelineno-65-26">26</a></span>
<span class="normal"><a href="#__codelineno-65-27">27</a></span>
<span class="normal"><a href="#__codelineno-65-28">28</a></span>
<span class="normal"><a href="#__codelineno-65-29">29</a></span>
<span class="normal"><a href="#__codelineno-65-30">30</a></span>
<span class="normal"><a href="#__codelineno-65-31">31</a></span>
<span class="normal"><a href="#__codelineno-65-32">32</a></span>
<span class="normal"><a href="#__codelineno-65-33">33</a></span>
<span class="normal"><a href="#__codelineno-65-34">34</a></span>
<span class="normal"><a href="#__codelineno-65-35">35</a></span>
<span class="normal"><a href="#__codelineno-65-36">36</a></span>
<span class="normal"><a href="#__codelineno-65-37">37</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-65-1" name="__codelineno-65-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">Class</span>
<a id="__codelineno-65-2" name="__codelineno-65-2"></a><span class="p">{</span>
<a id="__codelineno-65-3" name="__codelineno-65-3"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">Argument</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// static method, can operate ONLY on STATIC VARIABLES</span>
<a id="__codelineno-65-4" name="__codelineno-65-4"></a>
<a id="__codelineno-65-5" name="__codelineno-65-5"></a><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">Argument</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// instance method, can operate on INSTANCE VARIABLES</span>
<a id="__codelineno-65-6" name="__codelineno-65-6"></a>
<a id="__codelineno-65-7" name="__codelineno-65-7"></a><span class="w"> </span><span class="c1">// override inherited method</span>
<a id="__codelineno-65-8" name="__codelineno-65-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span>
<a id="__codelineno-65-9" name="__codelineno-65-9"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-65-10" name="__codelineno-65-10"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-65-11" name="__codelineno-65-11"></a>
<a id="__codelineno-65-12" name="__codelineno-65-12"></a><span class="w"> </span><span class="c1">// visrual methods CAN be overridden</span>
<a id="__codelineno-65-13" name="__codelineno-65-13"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span>
<a id="__codelineno-65-14" name="__codelineno-65-14"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-65-15" name="__codelineno-65-15"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-65-16" name="__codelineno-65-16"></a><span class="p">}</span><span class="err">```</span>
<a id="__codelineno-65-17" name="__codelineno-65-17"></a>
<a id="__codelineno-65-18" name="__codelineno-65-18"></a><span class="err">###</span><span class="w"> </span><span class="n">Constructors</span>
<a id="__codelineno-65-19" name="__codelineno-65-19"></a>
<a id="__codelineno-65-20" name="__codelineno-65-20"></a><span class="err">```</span><span class="n">cs</span>
<a id="__codelineno-65-21" name="__codelineno-65-21"></a><span class="k">class</span><span class="w"> </span><span class="nf">Class</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">Parameter</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="c1">// primary constructor (like records)</span>
<a id="__codelineno-65-22" name="__codelineno-65-22"></a><span class="p">{</span>
<a id="__codelineno-65-23" name="__codelineno-65-23"></a>
<a id="__codelineno-65-24" name="__codelineno-65-24"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Class</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// parameterless constructor</span>
<a id="__codelineno-65-25" name="__codelineno-65-25"></a>
<a id="__codelineno-65-26" name="__codelineno-65-26"></a><span class="w"> </span><span class="c1">// standard constructor</span>
<a id="__codelineno-65-27" name="__codelineno-65-27"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Class</span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">parameter</span><span class="p">)</span>
<a id="__codelineno-65-28" name="__codelineno-65-28"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-65-29" name="__codelineno-65-29"></a><span class="w"> </span><span class="n">_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">field</span><span class="p">;</span>
<a id="__codelineno-65-30" name="__codelineno-65-30"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-65-31" name="__codelineno-65-31"></a>
<a id="__codelineno-65-32" name="__codelineno-65-32"></a><span class="w"> </span><span class="c1">// extends an existing constructor adding parameters to the existing ones</span>
<a id="__codelineno-65-33" name="__codelineno-65-33"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Class</span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">other</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">this</span><span class="p">(</span><span class="n">parameter</span><span class="p">)</span>
<a id="__codelineno-65-34" name="__codelineno-65-34"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-65-35" name="__codelineno-65-35"></a><span class="w"> </span><span class="n">_other</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">other</span><span class="p">;</span>
<a id="__codelineno-65-36" name="__codelineno-65-36"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-65-37" name="__codelineno-65-37"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: if a <em>primary constructor</em> is used all other constructors must use <code>this(...)</code> to invoke it</p>
</blockquote>
<h3 id="properties-fields">Properties &amp; Fields</h3>
<p><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties">Properties Docs</a></p>
<p>A <em>field</em> is a variable of any type that is declared directly in a class or struct. Fields are members of their containing type.<br />
A <em>property</em> is a member that provides a flexible mechanism to read, write, or compute the value of a private field.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-66-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-66-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-66-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-66-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-66-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-66-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-66-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-66-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-66-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-66-10">10</a></span>
<span class="normal"><a href="#__codelineno-66-11">11</a></span>
<span class="normal"><a href="#__codelineno-66-12">12</a></span>
<span class="normal"><a href="#__codelineno-66-13">13</a></span>
<span class="normal"><a href="#__codelineno-66-14">14</a></span>
<span class="normal"><a href="#__codelineno-66-15">15</a></span>
<span class="normal"><a href="#__codelineno-66-16">16</a></span>
<span class="normal"><a href="#__codelineno-66-17">17</a></span>
<span class="normal"><a href="#__codelineno-66-18">18</a></span>
<span class="normal"><a href="#__codelineno-66-19">19</a></span>
<span class="normal"><a href="#__codelineno-66-20">20</a></span>
<span class="normal"><a href="#__codelineno-66-21">21</a></span>
<span class="normal"><a href="#__codelineno-66-22">22</a></span>
<span class="normal"><a href="#__codelineno-66-23">23</a></span>
<span class="normal"><a href="#__codelineno-66-24">24</a></span>
<span class="normal"><a href="#__codelineno-66-25">25</a></span>
<span class="normal"><a href="#__codelineno-66-26">26</a></span>
<span class="normal"><a href="#__codelineno-66-27">27</a></span>
<span class="normal"><a href="#__codelineno-66-28">28</a></span>
<span class="normal"><a href="#__codelineno-66-29">29</a></span>
<span class="normal"><a href="#__codelineno-66-30">30</a></span>
<span class="normal"><a href="#__codelineno-66-31">31</a></span>
<span class="normal"><a href="#__codelineno-66-32">32</a></span>
<span class="normal"><a href="#__codelineno-66-33">33</a></span>
<span class="normal"><a href="#__codelineno-66-34">34</a></span>
<span class="normal"><a href="#__codelineno-66-35">35</a></span>
<span class="normal"><a href="#__codelineno-66-36">36</a></span>
<span class="normal"><a href="#__codelineno-66-37">37</a></span>
<span class="normal"><a href="#__codelineno-66-38">38</a></span>
<span class="normal"><a href="#__codelineno-66-39">39</a></span>
<span class="normal"><a href="#__codelineno-66-40">40</a></span>
<span class="normal"><a href="#__codelineno-66-41">41</a></span>
<span class="normal"><a href="#__codelineno-66-42">42</a></span>
<span class="normal"><a href="#__codelineno-66-43">43</a></span>
<span class="normal"><a href="#__codelineno-66-44">44</a></span>
<span class="normal"><a href="#__codelineno-66-45">45</a></span>
<span class="normal"><a href="#__codelineno-66-46">46</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-66-1" name="__codelineno-66-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">Class</span>
<a id="__codelineno-66-2" name="__codelineno-66-2"></a><span class="p">{</span>
<a id="__codelineno-66-3" name="__codelineno-66-3"></a>
<a id="__codelineno-66-4" name="__codelineno-66-4"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="c1">// static (non-instance) public field w/ initializer</span>
<a id="__codelineno-66-5" name="__codelineno-66-5"></a>
<a id="__codelineno-66-6" name="__codelineno-66-6"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="c1">// private instance field w/ initializer</span>
<a id="__codelineno-66-7" name="__codelineno-66-7"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">_field</span><span class="p">;</span><span class="w"> </span><span class="c1">// private instance field, initialized by constructor</span>
<a id="__codelineno-66-8" name="__codelineno-66-8"></a>
<a id="__codelineno-66-9" name="__codelineno-66-9"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">_backingField</span><span class="p">;</span>
<a id="__codelineno-66-10" name="__codelineno-66-10"></a>
<a id="__codelineno-66-11" name="__codelineno-66-11"></a><span class="w"> </span><span class="c1">// PROPERTY</span>
<a id="__codelineno-66-12" name="__codelineno-66-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Property</span>
<a id="__codelineno-66-13" name="__codelineno-66-13"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-66-14" name="__codelineno-66-14"></a><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">_backingField</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-15" name="__codelineno-66-15"></a><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">_backingField</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-16" name="__codelineno-66-16"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-17" name="__codelineno-66-17"></a>
<a id="__codelineno-66-18" name="__codelineno-66-18"></a><span class="w"> </span><span class="c1">// PROPERTY WITH EXPRESSION BODY DEFINITIONS</span>
<a id="__codelineno-66-19" name="__codelineno-66-19"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Property</span>
<a id="__codelineno-66-20" name="__codelineno-66-20"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-66-21" name="__codelineno-66-21"></a><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">_backingField</span><span class="p">;</span>
<a id="__codelineno-66-22" name="__codelineno-66-22"></a><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">_backingField</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<a id="__codelineno-66-23" name="__codelineno-66-23"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-24" name="__codelineno-66-24"></a>
<a id="__codelineno-66-25" name="__codelineno-66-25"></a><span class="w"> </span><span class="c1">// REQUIRED PROPERTY prop must be set at obj init (in constructor or initializer)</span>
<a id="__codelineno-66-26" name="__codelineno-66-26"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">required</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-27" name="__codelineno-66-27"></a>
<a id="__codelineno-66-28" name="__codelineno-66-28"></a><span class="w"> </span><span class="c1">// EXPRESSION-BODIED READ-ONLY PROPERTY</span>
<a id="__codelineno-66-29" name="__codelineno-66-29"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-66-30" name="__codelineno-66-30"></a>
<a id="__codelineno-66-31" name="__codelineno-66-31"></a><span class="w"> </span><span class="c1">// AUTO-PROPERTIES</span>
<a id="__codelineno-66-32" name="__codelineno-66-32"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-33" name="__codelineno-66-33"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// settable only inside class</span>
<a id="__codelineno-66-34" name="__codelineno-66-34"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="n">init</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// settable only in constructor, initializer, keyword with</span>
<a id="__codelineno-66-35" name="__codelineno-66-35"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// can only be setted by constructor</span>
<a id="__codelineno-66-36" name="__codelineno-66-36"></a>
<a id="__codelineno-66-37" name="__codelineno-66-37"></a><span class="w"> </span><span class="c1">// MIXED</span>
<a id="__codelineno-66-38" name="__codelineno-66-38"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Property</span>
<a id="__codelineno-66-39" name="__codelineno-66-39"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-66-40" name="__codelineno-66-40"></a><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">_backingField</span><span class="p">;</span>
<a id="__codelineno-66-41" name="__codelineno-66-41"></a><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-42" name="__codelineno-66-42"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-66-43" name="__codelineno-66-43"></a>
<a id="__codelineno-66-44" name="__codelineno-66-44"></a><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="c1">// set</span>
<a id="__codelineno-66-45" name="__codelineno-66-45"></a><span class="w"> </span><span class="n">Property</span><span class="p">;</span><span class="w"> </span><span class="c1">// get</span>
<a id="__codelineno-66-46" name="__codelineno-66-46"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: The <code>init</code> accessor is a variant of the <code>set</code> accessor which can only be called during object initialization.<br />
Because <code>init</code> accessors can only be called during initialization, they are allowed to <em>mutate</em> <code>readonly</code> fields of the enclosing class, just like in a constructor.
<strong>Note</strong>: creating at least one constructor hides the one provided by default (w/ zero parameters).</p>
</blockquote>
<h3 id="object-and-collection-initializers"><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers">Object and Collection Initializers</a></h3>
<p><strong>Object initializers</strong> allow to assign values to any accessible fields or properties of an object at creation time without having to invoke a constructor followed by lines of assignment statements.<br />
The object initializer syntax enables to specify arguments for a constructor or omit the arguments (and parentheses syntax).</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-67-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-67-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-67-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-67-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-67-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-67-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-67-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-67-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-67-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-67-10">10</a></span>
<span class="normal"><a href="#__codelineno-67-11">11</a></span>
<span class="normal"><a href="#__codelineno-67-12">12</a></span>
<span class="normal"><a href="#__codelineno-67-13">13</a></span>
<span class="normal"><a href="#__codelineno-67-14">14</a></span>
<span class="normal"><a href="#__codelineno-67-15">15</a></span>
<span class="normal"><a href="#__codelineno-67-16">16</a></span>
<span class="normal"><a href="#__codelineno-67-17">17</a></span>
<span class="normal"><a href="#__codelineno-67-18">18</a></span>
<span class="normal"><a href="#__codelineno-67-19">19</a></span>
<span class="normal"><a href="#__codelineno-67-20">20</a></span>
<span class="normal"><a href="#__codelineno-67-21">21</a></span>
<span class="normal"><a href="#__codelineno-67-22">22</a></span>
<span class="normal"><a href="#__codelineno-67-23">23</a></span>
<span class="normal"><a href="#__codelineno-67-24">24</a></span>
<span class="normal"><a href="#__codelineno-67-25">25</a></span>
<span class="normal"><a href="#__codelineno-67-26">26</a></span>
<span class="normal"><a href="#__codelineno-67-27">27</a></span>
<span class="normal"><a href="#__codelineno-67-28">28</a></span>
<span class="normal"><a href="#__codelineno-67-29">29</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-67-1" name="__codelineno-67-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Class</span>
<a id="__codelineno-67-2" name="__codelineno-67-2"></a><span class="p">{</span>
<a id="__codelineno-67-3" name="__codelineno-67-3"></a><span class="w"> </span><span class="c1">// Auto-implemented properties.</span>
<a id="__codelineno-67-4" name="__codelineno-67-4"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop1</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-67-5" name="__codelineno-67-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-67-6" name="__codelineno-67-6"></a>
<a id="__codelineno-67-7" name="__codelineno-67-7"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Class</span><span class="p">()</span>
<a id="__codelineno-67-8" name="__codelineno-67-8"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-67-9" name="__codelineno-67-9"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-67-10" name="__codelineno-67-10"></a>
<a id="__codelineno-67-11" name="__codelineno-67-11"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Class</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">arg</span><span class="p">)</span>
<a id="__codelineno-67-12" name="__codelineno-67-12"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-67-13" name="__codelineno-67-13"></a><span class="w"> </span><span class="n">Prop1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg</span><span class="p">;</span>
<a id="__codelineno-67-14" name="__codelineno-67-14"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-67-15" name="__codelineno-67-15"></a><span class="p">}</span>
<a id="__codelineno-67-16" name="__codelineno-67-16"></a>
<a id="__codelineno-67-17" name="__codelineno-67-17"></a><span class="c1">// standard way</span>
<a id="__codelineno-67-18" name="__codelineno-67-18"></a><span class="n">Class</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Class</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span>
<a id="__codelineno-67-19" name="__codelineno-67-19"></a><span class="n">obj</span><span class="p">.</span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg2</span><span class="p">;</span>
<a id="__codelineno-67-20" name="__codelineno-67-20"></a>
<a id="__codelineno-67-21" name="__codelineno-67-21"></a><span class="c1">// known target type</span>
<a id="__codelineno-67-22" name="__codelineno-67-22"></a><span class="n">Class</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<a id="__codelineno-67-23" name="__codelineno-67-23"></a>
<a id="__codelineno-67-24" name="__codelineno-67-24"></a><span class="c1">// object initializers</span>
<a id="__codelineno-67-25" name="__codelineno-67-25"></a><span class="n">Class</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Class</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg2</span><span class="p">,</span><span class="w"> </span><span class="n">Prop1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg1</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// w/o constructor</span>
<a id="__codelineno-67-26" name="__codelineno-67-26"></a><span class="n">Class</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Class</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg2</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// w/ constructor</span>
<a id="__codelineno-67-27" name="__codelineno-67-27"></a>
<a id="__codelineno-67-28" name="__codelineno-67-28"></a><span class="c1">// with keyword</span>
<a id="__codelineno-67-29" name="__codelineno-67-29"></a><span class="kt">var</span><span class="w"> </span><span class="n">copy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">original</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Prop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newValue</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// other props are copies of the original</span>
</code></pre></div></td></tr></table></div>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-68-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-68-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-68-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-68-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-68-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-68-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-68-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-68-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-68-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-68-10">10</a></span>
<span class="normal"><a href="#__codelineno-68-11">11</a></span>
<span class="normal"><a href="#__codelineno-68-12">12</a></span>
<span class="normal"><a href="#__codelineno-68-13">13</a></span>
<span class="normal"><a href="#__codelineno-68-14">14</a></span>
<span class="normal"><a href="#__codelineno-68-15">15</a></span>
<span class="normal"><a href="#__codelineno-68-16">16</a></span>
<span class="normal"><a href="#__codelineno-68-17">17</a></span>
<span class="normal"><a href="#__codelineno-68-18">18</a></span>
<span class="normal"><a href="#__codelineno-68-19">19</a></span>
<span class="normal"><a href="#__codelineno-68-20">20</a></span>
<span class="normal"><a href="#__codelineno-68-21">21</a></span>
<span class="normal"><a href="#__codelineno-68-22">22</a></span>
<span class="normal"><a href="#__codelineno-68-23">23</a></span>
<span class="normal"><a href="#__codelineno-68-24">24</a></span>
<span class="normal"><a href="#__codelineno-68-25">25</a></span>
<span class="normal"><a href="#__codelineno-68-26">26</a></span>
<span class="normal"><a href="#__codelineno-68-27">27</a></span>
<span class="normal"><a href="#__codelineno-68-28">28</a></span>
<span class="normal"><a href="#__codelineno-68-29">29</a></span>
<span class="normal"><a href="#__codelineno-68-30">30</a></span>
<span class="normal"><a href="#__codelineno-68-31">31</a></span>
<span class="normal"><a href="#__codelineno-68-32">32</a></span>
<span class="normal"><a href="#__codelineno-68-33">33</a></span>
<span class="normal"><a href="#__codelineno-68-34">34</a></span>
<span class="normal"><a href="#__codelineno-68-35">35</a></span>
<span class="normal"><a href="#__codelineno-68-36">36</a></span>
<span class="normal"><a href="#__codelineno-68-37">37</a></span>
<span class="normal"><a href="#__codelineno-68-38">38</a></span>
<span class="normal"><a href="#__codelineno-68-39">39</a></span>
<span class="normal"><a href="#__codelineno-68-40">40</a></span>
<span class="normal"><a href="#__codelineno-68-41">41</a></span>
<span class="normal"><a href="#__codelineno-68-42">42</a></span>
<span class="normal"><a href="#__codelineno-68-43">43</a></span>
<span class="normal"><a href="#__codelineno-68-44">44</a></span>
<span class="normal"><a href="#__codelineno-68-45">45</a></span>
<span class="normal"><a href="#__codelineno-68-46">46</a></span>
<span class="normal"><a href="#__codelineno-68-47">47</a></span>
<span class="normal"><a href="#__codelineno-68-48">48</a></span>
<span class="normal"><a href="#__codelineno-68-49">49</a></span>
<span class="normal"><a href="#__codelineno-68-50">50</a></span>
<span class="normal"><a href="#__codelineno-68-51">51</a></span>
<span class="normal"><a href="#__codelineno-68-52">52</a></span>
<span class="normal"><a href="#__codelineno-68-53">53</a></span>
<span class="normal"><a href="#__codelineno-68-54">54</a></span>
<span class="normal"><a href="#__codelineno-68-55">55</a></span>
<span class="normal"><a href="#__codelineno-68-56">56</a></span>
<span class="normal"><a href="#__codelineno-68-57">57</a></span>
<span class="normal"><a href="#__codelineno-68-58">58</a></span>
<span class="normal"><a href="#__codelineno-68-59">59</a></span>
<span class="normal"><a href="#__codelineno-68-60">60</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-68-1" name="__codelineno-68-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Matrix</span>
<a id="__codelineno-68-2" name="__codelineno-68-2"></a><span class="p">{</span>
<a id="__codelineno-68-3" name="__codelineno-68-3"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="kt">double</span><span class="p">[,]</span><span class="w"> </span><span class="n">matrix</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">double</span><span class="p">[</span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">];</span>
<a id="__codelineno-68-4" name="__codelineno-68-4"></a>
<a id="__codelineno-68-5" name="__codelineno-68-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="k">this</span><span class="p">[</span><span class="kt">int</span><span class="w"> </span><span class="n">row</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">column</span><span class="p">]</span>
<a id="__codelineno-68-6" name="__codelineno-68-6"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-68-7" name="__codelineno-68-7"></a><span class="w"> </span><span class="c1">// The embedded array will throw out of range exceptions as appropriate.</span>
<a id="__codelineno-68-8" name="__codelineno-68-8"></a><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">,</span><span class="w"> </span><span class="n">column</span><span class="p">];</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-68-9" name="__codelineno-68-9"></a><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">,</span><span class="w"> </span><span class="n">column</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-68-10" name="__codelineno-68-10"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-68-11" name="__codelineno-68-11"></a><span class="p">}</span>
<a id="__codelineno-68-12" name="__codelineno-68-12"></a>
<a id="__codelineno-68-13" name="__codelineno-68-13"></a><span class="c1">// collection initializer</span>
<a id="__codelineno-68-14" name="__codelineno-68-14"></a><span class="kt">var</span><span class="w"> </span><span class="n">identity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Matrix</span>
<a id="__codelineno-68-15" name="__codelineno-68-15"></a><span class="p">{</span>
<a id="__codelineno-68-16" name="__codelineno-68-16"></a><span class="w"> </span><span class="na">[0, 0]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span>
<a id="__codelineno-68-17" name="__codelineno-68-17"></a><span class="w"> </span><span class="na">[0, 1]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.0</span><span class="p">,</span>
<a id="__codelineno-68-18" name="__codelineno-68-18"></a><span class="w"> </span><span class="na">[0, 2]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.0</span><span class="p">,</span>
<a id="__codelineno-68-19" name="__codelineno-68-19"></a>
<a id="__codelineno-68-20" name="__codelineno-68-20"></a><span class="w"> </span><span class="na">[1, 0]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.0</span><span class="p">,</span>
<a id="__codelineno-68-21" name="__codelineno-68-21"></a><span class="w"> </span><span class="na">[1, 1]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span>
<a id="__codelineno-68-22" name="__codelineno-68-22"></a><span class="w"> </span><span class="na">[1, 2]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.0</span><span class="p">,</span>
<a id="__codelineno-68-23" name="__codelineno-68-23"></a>
<a id="__codelineno-68-24" name="__codelineno-68-24"></a><span class="w"> </span><span class="na">[2, 0]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.0</span><span class="p">,</span>
<a id="__codelineno-68-25" name="__codelineno-68-25"></a><span class="w"> </span><span class="na">[2, 1]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.0</span><span class="p">,</span>
<a id="__codelineno-68-26" name="__codelineno-68-26"></a><span class="w"> </span><span class="na">[2, 2]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span>
<a id="__codelineno-68-27" name="__codelineno-68-27"></a><span class="p">};</span>
<a id="__codelineno-68-28" name="__codelineno-68-28"></a>
<a id="__codelineno-68-29" name="__codelineno-68-29"></a><span class="n">List</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-68-30" name="__codelineno-68-30"></a><span class="n">List</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="p">];</span>
<a id="__codelineno-68-31" name="__codelineno-68-31"></a>
<a id="__codelineno-68-32" name="__codelineno-68-32"></a><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-68-33" name="__codelineno-68-33"></a><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-68-34" name="__codelineno-68-34"></a><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="w"> </span><span class="p">];</span>
<a id="__codelineno-68-35" name="__codelineno-68-35"></a>
<a id="__codelineno-68-36" name="__codelineno-68-36"></a><span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-68-37" name="__codelineno-68-37"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;zero&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-38" name="__codelineno-68-38"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;one&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-39" name="__codelineno-68-39"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;two&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-40" name="__codelineno-68-40"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;three&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-41" name="__codelineno-68-41"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;four&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-42" name="__codelineno-68-42"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;five&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-43" name="__codelineno-68-43"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;six&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-44" name="__codelineno-68-44"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">7</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;seven&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-45" name="__codelineno-68-45"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;eight&quot;</span><span class="w"> </span><span class="p">},</span>
<a id="__codelineno-68-46" name="__codelineno-68-46"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">9</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;nine&quot;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-68-47" name="__codelineno-68-47"></a><span class="p">};</span>
<a id="__codelineno-68-48" name="__codelineno-68-48"></a>
<a id="__codelineno-68-49" name="__codelineno-68-49"></a><span class="n">Dictionary</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span>
<a id="__codelineno-68-50" name="__codelineno-68-50"></a><span class="w"> </span><span class="m">0</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;zero&quot;</span><span class="p">,</span>
<a id="__codelineno-68-51" name="__codelineno-68-51"></a><span class="w"> </span><span class="m">1</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;one&quot;</span><span class="p">,</span>
<a id="__codelineno-68-52" name="__codelineno-68-52"></a><span class="w"> </span><span class="m">2</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;two&quot;</span><span class="p">,</span>
<a id="__codelineno-68-53" name="__codelineno-68-53"></a><span class="w"> </span><span class="m">3</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;three&quot;</span><span class="p">,</span>
<a id="__codelineno-68-54" name="__codelineno-68-54"></a><span class="w"> </span><span class="m">4</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;four&quot;</span><span class="p">,</span>
<a id="__codelineno-68-55" name="__codelineno-68-55"></a><span class="w"> </span><span class="m">5</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;five&quot;</span><span class="p">,</span>
<a id="__codelineno-68-56" name="__codelineno-68-56"></a><span class="w"> </span><span class="m">6</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;six&quot;</span><span class="p">,</span>
<a id="__codelineno-68-57" name="__codelineno-68-57"></a><span class="w"> </span><span class="m">7</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;seven&quot;</span><span class="p">,</span>
<a id="__codelineno-68-58" name="__codelineno-68-58"></a><span class="w"> </span><span class="m">8</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;eight&quot;</span><span class="p">,</span>
<a id="__codelineno-68-59" name="__codelineno-68-59"></a><span class="w"> </span><span class="m">9</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;nine&quot;</span>
<a id="__codelineno-68-60" name="__codelineno-68-60"></a><span class="p">];</span>
</code></pre></div></td></tr></table></div>
<h3 id="static-class"><code>Static</code> Class</h3>
<p>The <code>static</code> keyword declares that a member is not associated with any particular instance of the class.<br />
Static classes <strong>can't</strong> instantiate objects and all their methods <strong>must</strong> be static.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-69-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-69-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-69-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-69-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-69-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-69-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-69-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-69-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-69-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-69-10">10</a></span>
<span class="normal"><a href="#__codelineno-69-11">11</a></span>
<span class="normal"><a href="#__codelineno-69-12">12</a></span>
<span class="normal"><a href="#__codelineno-69-13">13</a></span>
<span class="normal"><a href="#__codelineno-69-14">14</a></span>
<span class="normal"><a href="#__codelineno-69-15">15</a></span>
<span class="normal"><a href="#__codelineno-69-16">16</a></span>
<span class="normal"><a href="#__codelineno-69-17">17</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-69-1" name="__codelineno-69-1"></a><span class="k">static</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Class</span>
<a id="__codelineno-69-2" name="__codelineno-69-2"></a><span class="p">{</span>
<a id="__codelineno-69-3" name="__codelineno-69-3"></a><span class="w"> </span><span class="c1">// static constructor, not called explicitly, has no arguments</span>
<a id="__codelineno-69-4" name="__codelineno-69-4"></a><span class="w"> </span><span class="c1">// triggered by one of two events, whichever occurs first: creating an instance, or accessing any static member of the class.</span>
<a id="__codelineno-69-5" name="__codelineno-69-5"></a><span class="w"> </span><span class="c1">// since it&#39;s static and takes no arguments there can be at most one for each class</span>
<a id="__codelineno-69-6" name="__codelineno-69-6"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="nf">Class</span><span class="p">()</span>
<a id="__codelineno-69-7" name="__codelineno-69-7"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-69-8" name="__codelineno-69-8"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-69-9" name="__codelineno-69-9"></a>
<a id="__codelineno-69-10" name="__codelineno-69-10"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<a id="__codelineno-69-11" name="__codelineno-69-11"></a>
<a id="__codelineno-69-12" name="__codelineno-69-12"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<a id="__codelineno-69-13" name="__codelineno-69-13"></a>
<a id="__codelineno-69-14" name="__codelineno-69-14"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<a id="__codelineno-69-15" name="__codelineno-69-15"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-69-16" name="__codelineno-69-16"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-69-17" name="__codelineno-69-17"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="class-members-init-order">Class Members Init Order</h3>
<p><strong>Static Field or Method Usage</strong>:</p>
<ol>
<li>Static field initializers in order of apparition</li>
<li>Static Constructor</li>
</ol>
<p><strong>Class Instantiation (<code>new</code> operator)</strong>:</p>
<ol>
<li>Instance field initializers in order of apparition</li>
<li>Instance Constructor</li>
</ol>
<p><strong>Object Creation</strong>: <code>Class object = new Class(arguments);</code>
<strong>Instance Method Usage</strong>: <code>object.method(arguments);</code>
<strong>Static Method Usage</strong>: <code>Class.method(arguments);</code></p>
<h3 id="indexers">Indexers</h3>
<p>An <strong>indexer</strong> is a property that takes one or more arguments, and is accessed with the same syntax as is used for arrays.<br />
This is useful when writing a class that contains a collection of objects.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-70-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-70-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-70-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-70-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-70-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-70-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-70-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-70-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-70-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-70-10">10</a></span>
<span class="normal"><a href="#__codelineno-70-11">11</a></span>
<span class="normal"><a href="#__codelineno-70-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-70-1" name="__codelineno-70-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Class</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span>
<a id="__codelineno-70-2" name="__codelineno-70-2"></a><span class="p">{</span>
<a id="__codelineno-70-3" name="__codelineno-70-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="k">this</span><span class="p">[</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">]</span>
<a id="__codelineno-70-4" name="__codelineno-70-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-70-5" name="__codelineno-70-5"></a><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">...;</span><span class="w"> </span><span class="c1">// return the i-th element in the collection</span>
<a id="__codelineno-70-6" name="__codelineno-70-6"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-70-7" name="__codelineno-70-7"></a><span class="p">}</span>
<a id="__codelineno-70-8" name="__codelineno-70-8"></a>
<a id="__codelineno-70-9" name="__codelineno-70-9"></a><span class="c1">// null conditional index access</span>
<a id="__codelineno-70-10" name="__codelineno-70-10"></a><span class="n">Class</span><span class="o">?</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">objWithIndexer</span><span class="o">?</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a id="__codelineno-70-11" name="__codelineno-70-11"></a><span class="c1">// same as</span>
<a id="__codelineno-70-12" name="__codelineno-70-12"></a><span class="n">Class</span><span class="o">?</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">objWithIndexer</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">objWithIndexer</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
</code></pre></div></td></tr></table></div>
<h3 id="abstract-classes">Abstract Classes</h3>
<p>The <code>abstract</code> modifier indicates that the thing being modified has a missing or incomplete implementation.<br />
The <code>abstract</code> modifier can be used with classes, methods, properties, indexers, and events.<br />
Use the <code>abstract</code> modifier in a class declaration to indicate that a class is intended only to be a base class of other classes, not instantiated on its own.<br />
Members marked as <code>abstract</code> must be implemented by non-abstract classes that derive from the abstract class.</p>
<p><code>abstract</code> classes have the following features:</p>
<ul>
<li>An <code>abstract</code> class cannot be instantiated.</li>
<li>An <code>abstract</code> class may contain <code>abstract</code> methods and accessors.</li>
<li>It is not possible to modify an <code>abstract</code> class with the <code>sealed</code> modifier because the two modifiers have opposite meanings.
The <code>sealed</code> modifier prevents a class from being inherited and the <code>abstract</code> modifier requires a class to be inherited.</li>
<li>A <em>non-abstract</em> class derived from an <code>abstract</code> class must include actual implementations of all inherited <code>abstract</code> methods and accessors.</li>
</ul>
<blockquote>
<p><strong>Note</strong>: Use the <code>abstract</code> modifier in a method or property declaration to indicate that the method or property does not contain implementation.</p>
</blockquote>
<p><code>abstract</code> methods have the following features:</p>
<ul>
<li>An <code>abstract</code> method is implicitly a <code>virtual</code> method.</li>
<li>
<p><code>abstract</code> method declarations are only permitted in <code>abstract</code> classes.</p>
</li>
<li>
<p>Because an <code>abstract</code> method declaration provides no actual implementation, there is no method body; the method declaration simply ends with a semicolon and there are no curly braces following the signature.</p>
</li>
<li>The implementation is provided by a method <em>override</em>, which is a member of a non-abstract class.</li>
<li>It is an error to use the <code>static</code> or <code>virtual</code> modifiers in an <code>abstract</code> method declaration.</li>
</ul>
<p><code>abstract</code> properties behave like <code>abstract</code> methods, except for the differences in declaration and invocation syntax.</p>
<ul>
<li>It is an error to use the <code>abstract</code> modifier on a <code>static</code> property.</li>
<li>An <code>abstract</code> inherited property can be overridden in a derived class by including a property declaration that uses the <code>override</code> modifier.</li>
</ul>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-71-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-71-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-71-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-71-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-71-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-71-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-71-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-71-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-71-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-71-10">10</a></span>
<span class="normal"><a href="#__codelineno-71-11">11</a></span>
<span class="normal"><a href="#__codelineno-71-12">12</a></span>
<span class="normal"><a href="#__codelineno-71-13">13</a></span>
<span class="normal"><a href="#__codelineno-71-14">14</a></span>
<span class="normal"><a href="#__codelineno-71-15">15</a></span>
<span class="normal"><a href="#__codelineno-71-16">16</a></span>
<span class="normal"><a href="#__codelineno-71-17">17</a></span>
<span class="normal"><a href="#__codelineno-71-18">18</a></span>
<span class="normal"><a href="#__codelineno-71-19">19</a></span>
<span class="normal"><a href="#__codelineno-71-20">20</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-71-1" name="__codelineno-71-1"></a><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Abstract</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Interface</span>
<a id="__codelineno-71-2" name="__codelineno-71-2"></a><span class="p">{</span>
<a id="__codelineno-71-3" name="__codelineno-71-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-71-4" name="__codelineno-71-4"></a>
<a id="__codelineno-71-5" name="__codelineno-71-5"></a><span class="w"> </span><span class="c1">// interface methods can be mapped to abstract methods</span>
<a id="__codelineno-71-6" name="__codelineno-71-6"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">();</span>
<a id="__codelineno-71-7" name="__codelineno-71-7"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">();</span><span class="w"> </span><span class="c1">// force overriding (derived classes must provide new implementation)</span>
<a id="__codelineno-71-8" name="__codelineno-71-8"></a><span class="p">}</span>
<a id="__codelineno-71-9" name="__codelineno-71-9"></a>
<a id="__codelineno-71-10" name="__codelineno-71-10"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Derived</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Abstract</span>
<a id="__codelineno-71-11" name="__codelineno-71-11"></a><span class="p">{</span>
<a id="__codelineno-71-12" name="__codelineno-71-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Property</span>
<a id="__codelineno-71-13" name="__codelineno-71-13"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-71-14" name="__codelineno-71-14"></a><span class="w"> </span><span class="c1">// new behaviour</span>
<a id="__codelineno-71-15" name="__codelineno-71-15"></a><span class="w"> </span><span class="k">get</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-71-16" name="__codelineno-71-16"></a><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-71-17" name="__codelineno-71-17"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-71-18" name="__codelineno-71-18"></a>
<a id="__codelineno-71-19" name="__codelineno-71-19"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* statements */</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// implementation of abstract method</span>
<a id="__codelineno-71-20" name="__codelineno-71-20"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="cloning">Cloning</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-72-1">1</a></span>
<span class="normal"><a href="#__codelineno-72-2">2</a></span>
<span class="normal"><a href="#__codelineno-72-3">3</a></span>
<span class="normal"><a href="#__codelineno-72-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-72-1" name="__codelineno-72-1"></a><span class="n">Class</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Class</span><span class="p">()</span>
<a id="__codelineno-72-2" name="__codelineno-72-2"></a>
<a id="__codelineno-72-3" name="__codelineno-72-3"></a><span class="n">Object</span><span class="p">.</span><span class="n">MemberwiseClone</span><span class="p">();</span><span class="w"> </span><span class="c1">// Returns shallow copy of the object</span>
<a id="__codelineno-72-4" name="__codelineno-72-4"></a><span class="n">IClonable</span><span class="p">.</span><span class="n">Clone</span><span class="p">();</span><span class="w"> </span><span class="c1">// Creates a new object that is a copy of the current instance.</span>
</code></pre></div></td></tr></table></div>
<h3 id="deconstruction">Deconstruction</h3>
<p>Deconstruction is not limited to tuples. By providing a <code>Deconstruct(...)</code> method(s) C# allows to use the same syntax with the users types.</p>
<blockquote>
<p><strong>Note</strong>: Types with a deconstructor can also use <em>positional pattern matching</em>.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-73-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-73-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-73-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-73-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-73-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-73-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-73-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-73-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-73-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-73-10">10</a></span>
<span class="normal"><a href="#__codelineno-73-11">11</a></span>
<span class="normal"><a href="#__codelineno-73-12">12</a></span>
<span class="normal"><a href="#__codelineno-73-13">13</a></span>
<span class="normal"><a href="#__codelineno-73-14">14</a></span>
<span class="normal"><a href="#__codelineno-73-15">15</a></span>
<span class="normal"><a href="#__codelineno-73-16">16</a></span>
<span class="normal"><a href="#__codelineno-73-17">17</a></span>
<span class="normal"><a href="#__codelineno-73-18">18</a></span>
<span class="normal"><a href="#__codelineno-73-19">19</a></span>
<span class="normal"><a href="#__codelineno-73-20">20</a></span>
<span class="normal"><a href="#__codelineno-73-21">21</a></span>
<span class="normal"><a href="#__codelineno-73-22">22</a></span>
<span class="normal"><a href="#__codelineno-73-23">23</a></span>
<span class="normal"><a href="#__codelineno-73-24">24</a></span>
<span class="normal"><a href="#__codelineno-73-25">25</a></span>
<span class="normal"><a href="#__codelineno-73-26">26</a></span>
<span class="normal"><a href="#__codelineno-73-27">27</a></span>
<span class="normal"><a href="#__codelineno-73-28">28</a></span>
<span class="normal"><a href="#__codelineno-73-29">29</a></span>
<span class="normal"><a href="#__codelineno-73-30">30</a></span>
<span class="normal"><a href="#__codelineno-73-31">31</a></span>
<span class="normal"><a href="#__codelineno-73-32">32</a></span>
<span class="normal"><a href="#__codelineno-73-33">33</a></span>
<span class="normal"><a href="#__codelineno-73-34">34</a></span>
<span class="normal"><a href="#__codelineno-73-35">35</a></span>
<span class="normal"><a href="#__codelineno-73-36">36</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-73-1" name="__codelineno-73-1"></a><span class="k">public</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">Size</span>
<a id="__codelineno-73-2" name="__codelineno-73-2"></a><span class="p">{</span>
<a id="__codelineno-73-3" name="__codelineno-73-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Size</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">w</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">h</span><span class="p">)</span>
<a id="__codelineno-73-4" name="__codelineno-73-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-73-5" name="__codelineno-73-5"></a><span class="w"> </span><span class="n">W</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">w</span><span class="p">;</span>
<a id="__codelineno-73-6" name="__codelineno-73-6"></a><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">h</span><span class="p">;</span>
<a id="__codelineno-73-7" name="__codelineno-73-7"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-73-8" name="__codelineno-73-8"></a>
<a id="__codelineno-73-9" name="__codelineno-73-9"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Deconstruct</span><span class="p">(</span><span class="k">out</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">w</span><span class="p">,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">h</span><span class="p">)</span>
<a id="__codelineno-73-10" name="__codelineno-73-10"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-73-11" name="__codelineno-73-11"></a><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">W</span><span class="p">;</span>
<a id="__codelineno-73-12" name="__codelineno-73-12"></a><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">H</span><span class="p">;</span>
<a id="__codelineno-73-13" name="__codelineno-73-13"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-73-14" name="__codelineno-73-14"></a>
<a id="__codelineno-73-15" name="__codelineno-73-15"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">W</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-73-16" name="__codelineno-73-16"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">H</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-73-17" name="__codelineno-73-17"></a><span class="p">}</span>
<a id="__codelineno-73-18" name="__codelineno-73-18"></a>
<a id="__codelineno-73-19" name="__codelineno-73-19"></a><span class="c1">// deconstruction</span>
<a id="__codelineno-73-20" name="__codelineno-73-20"></a><span class="kt">var</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Size</span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">);</span>
<a id="__codelineno-73-21" name="__codelineno-73-21"></a><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">w</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">h</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="p">;</span><span class="w"> </span><span class="c1">// w = 1, h = 2</span>
<a id="__codelineno-73-22" name="__codelineno-73-22"></a>
<a id="__codelineno-73-23" name="__codelineno-73-23"></a>
<a id="__codelineno-73-24" name="__codelineno-73-24"></a><span class="c1">// positional patter matching</span>
<a id="__codelineno-73-25" name="__codelineno-73-25"></a><span class="n">s</span><span class="w"> </span><span class="k">switch</span>
<a id="__codelineno-73-26" name="__codelineno-73-26"></a><span class="p">{</span>
<a id="__codelineno-73-27" name="__codelineno-73-27"></a><span class="w"> </span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">&quot;Empty&quot;</span><span class="p">,</span>
<a id="__codelineno-73-28" name="__codelineno-73-28"></a><span class="w"> </span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">&quot;Extremely narrow&quot;</span><span class="p">,</span>
<a id="__codelineno-73-29" name="__codelineno-73-29"></a><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">w</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">$&quot;Extremely short, and this wide: {w}&quot;</span><span class="p">,</span>
<a id="__codelineno-73-30" name="__codelineno-73-30"></a><span class="w"> </span><span class="n">Size</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">&quot;Normal&quot;</span><span class="p">,</span>
<a id="__codelineno-73-31" name="__codelineno-73-31"></a><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">&quot;Not a shape&quot;</span>
<a id="__codelineno-73-32" name="__codelineno-73-32"></a><span class="p">};</span>
<a id="__codelineno-73-33" name="__codelineno-73-33"></a>
<a id="__codelineno-73-34" name="__codelineno-73-34"></a><span class="c1">// Assignment &amp; Declaration</span>
<a id="__codelineno-73-35" name="__codelineno-73-35"></a><span class="kt">int</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a id="__codelineno-73-36" name="__codelineno-73-36"></a><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">width</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size</span><span class="p">;</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="operator-overloading">Operator Overloading</h2>
<p>A user-defined type can overload a predefined C# operator. That is, a type can provide the custom implementation of an operation in case one or both of the operands are of that type.</p>
<p>Use the operator keyword to declare an operator. An operator declaration must satisfy the following rules:</p>
<ul>
<li>It includes both a public and a static modifier.</li>
<li>A unary operator has one input parameter. A binary operator has two input parameters.
In each case, at least one parameter must have type <code>T</code> or <code>T?</code> where <code>T</code> is the type that contains the operator declaration.</li>
</ul>
<p><a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/operator-overloading#overloadable-operators">Overloadable operators</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-74-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-74-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-74-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-74-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-74-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-74-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-74-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-74-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-74-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-74-10">10</a></span>
<span class="normal"><a href="#__codelineno-74-11">11</a></span>
<span class="normal"><a href="#__codelineno-74-12">12</a></span>
<span class="normal"><a href="#__codelineno-74-13">13</a></span>
<span class="normal"><a href="#__codelineno-74-14">14</a></span>
<span class="normal"><a href="#__codelineno-74-15">15</a></span>
<span class="normal"><a href="#__codelineno-74-16">16</a></span>
<span class="normal"><a href="#__codelineno-74-17">17</a></span>
<span class="normal"><a href="#__codelineno-74-18">18</a></span>
<span class="normal"><a href="#__codelineno-74-19">19</a></span>
<span class="normal"><a href="#__codelineno-74-20">20</a></span>
<span class="normal"><a href="#__codelineno-74-21">21</a></span>
<span class="normal"><a href="#__codelineno-74-22">22</a></span>
<span class="normal"><a href="#__codelineno-74-23">23</a></span>
<span class="normal"><a href="#__codelineno-74-24">24</a></span>
<span class="normal"><a href="#__codelineno-74-25">25</a></span>
<span class="normal"><a href="#__codelineno-74-26">26</a></span>
<span class="normal"><a href="#__codelineno-74-27">27</a></span>
<span class="normal"><a href="#__codelineno-74-28">28</a></span>
<span class="normal"><a href="#__codelineno-74-29">29</a></span>
<span class="normal"><a href="#__codelineno-74-30">30</a></span>
<span class="normal"><a href="#__codelineno-74-31">31</a></span>
<span class="normal"><a href="#__codelineno-74-32">32</a></span>
<span class="normal"><a href="#__codelineno-74-33">33</a></span>
<span class="normal"><a href="#__codelineno-74-34">34</a></span>
<span class="normal"><a href="#__codelineno-74-35">35</a></span>
<span class="normal"><a href="#__codelineno-74-36">36</a></span>
<span class="normal"><a href="#__codelineno-74-37">37</a></span>
<span class="normal"><a href="#__codelineno-74-38">38</a></span>
<span class="normal"><a href="#__codelineno-74-39">39</a></span>
<span class="normal"><a href="#__codelineno-74-40">40</a></span>
<span class="normal"><a href="#__codelineno-74-41">41</a></span>
<span class="normal"><a href="#__codelineno-74-42">42</a></span>
<span class="normal"><a href="#__codelineno-74-43">43</a></span>
<span class="normal"><a href="#__codelineno-74-44">44</a></span>
<span class="normal"><a href="#__codelineno-74-45">45</a></span>
<span class="normal"><a href="#__codelineno-74-46">46</a></span>
<span class="normal"><a href="#__codelineno-74-47">47</a></span>
<span class="normal"><a href="#__codelineno-74-48">48</a></span>
<span class="normal"><a href="#__codelineno-74-49">49</a></span>
<span class="normal"><a href="#__codelineno-74-50">50</a></span>
<span class="normal"><a href="#__codelineno-74-51">51</a></span>
<span class="normal"><a href="#__codelineno-74-52">52</a></span>
<span class="normal"><a href="#__codelineno-74-53">53</a></span>
<span class="normal"><a href="#__codelineno-74-54">54</a></span>
<span class="normal"><a href="#__codelineno-74-55">55</a></span>
<span class="normal"><a href="#__codelineno-74-56">56</a></span>
<span class="normal"><a href="#__codelineno-74-57">57</a></span>
<span class="normal"><a href="#__codelineno-74-58">58</a></span>
<span class="normal"><a href="#__codelineno-74-59">59</a></span>
<span class="normal"><a href="#__codelineno-74-60">60</a></span>
<span class="normal"><a href="#__codelineno-74-61">61</a></span>
<span class="normal"><a href="#__codelineno-74-62">62</a></span>
<span class="normal"><a href="#__codelineno-74-63">63</a></span>
<span class="normal"><a href="#__codelineno-74-64">64</a></span>
<span class="normal"><a href="#__codelineno-74-65">65</a></span>
<span class="normal"><a href="#__codelineno-74-66">66</a></span>
<span class="normal"><a href="#__codelineno-74-67">67</a></span>
<span class="normal"><a href="#__codelineno-74-68">68</a></span>
<span class="normal"><a href="#__codelineno-74-69">69</a></span>
<span class="normal"><a href="#__codelineno-74-70">70</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-74-1" name="__codelineno-74-1"></a><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<a id="__codelineno-74-2" name="__codelineno-74-2"></a>
<a id="__codelineno-74-3" name="__codelineno-74-3"></a><span class="k">public</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">Fraction</span>
<a id="__codelineno-74-4" name="__codelineno-74-4"></a><span class="p">{</span>
<a id="__codelineno-74-5" name="__codelineno-74-5"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">num</span><span class="p">;</span>
<a id="__codelineno-74-6" name="__codelineno-74-6"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">readonly</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">den</span><span class="p">;</span>
<a id="__codelineno-74-7" name="__codelineno-74-7"></a>
<a id="__codelineno-74-8" name="__codelineno-74-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Fraction</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">numerator</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">denominator</span><span class="p">)</span>
<a id="__codelineno-74-9" name="__codelineno-74-9"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-74-10" name="__codelineno-74-10"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">denominator</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">0</span><span class="p">)</span>
<a id="__codelineno-74-11" name="__codelineno-74-11"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-74-12" name="__codelineno-74-12"></a><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">ArgumentException</span><span class="p">(</span><span class="s">&quot;Denominator cannot be zero.&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">nameof</span><span class="p">(</span><span class="n">denominator</span><span class="p">));</span>
<a id="__codelineno-74-13" name="__codelineno-74-13"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-74-14" name="__codelineno-74-14"></a><span class="w"> </span><span class="n">num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">numerator</span><span class="p">;</span>
<a id="__codelineno-74-15" name="__codelineno-74-15"></a><span class="w"> </span><span class="n">den</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">denominator</span><span class="p">;</span>
<a id="__codelineno-74-16" name="__codelineno-74-16"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-74-17" name="__codelineno-74-17"></a>
<a id="__codelineno-74-18" name="__codelineno-74-18"></a><span class="w"> </span><span class="c1">// unary arithmetic operators overloading</span>
<a id="__codelineno-74-19" name="__codelineno-74-19"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">+</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
<a id="__codelineno-74-20" name="__codelineno-74-20"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">-</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Fraction</span><span class="p">(</span><span class="o">-</span><span class="n">a</span><span class="p">.</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">den</span><span class="p">);</span>
<a id="__codelineno-74-21" name="__codelineno-74-21"></a>
<a id="__codelineno-74-22" name="__codelineno-74-22"></a><span class="w"> </span><span class="c1">// binary arithmetic operators overloading</span>
<a id="__codelineno-74-23" name="__codelineno-74-23"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">+</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>
<a id="__codelineno-74-24" name="__codelineno-74-24"></a><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Fraction</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">den</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">den</span><span class="p">);</span>
<a id="__codelineno-74-25" name="__codelineno-74-25"></a>
<a id="__codelineno-74-26" name="__codelineno-74-26"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">-</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>
<a id="__codelineno-74-27" name="__codelineno-74-27"></a><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="o">-</span><span class="n">b</span><span class="p">);</span>
<a id="__codelineno-74-28" name="__codelineno-74-28"></a>
<a id="__codelineno-74-29" name="__codelineno-74-29"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">*</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>
<a id="__codelineno-74-30" name="__codelineno-74-30"></a><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Fraction</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">den</span><span class="p">);</span>
<a id="__codelineno-74-31" name="__codelineno-74-31"></a>
<a id="__codelineno-74-32" name="__codelineno-74-32"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">/</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>
<a id="__codelineno-74-33" name="__codelineno-74-33"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-74-34" name="__codelineno-74-34"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">0</span><span class="p">)</span>
<a id="__codelineno-74-35" name="__codelineno-74-35"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-74-36" name="__codelineno-74-36"></a><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">DivideByZeroException</span><span class="p">();</span>
<a id="__codelineno-74-37" name="__codelineno-74-37"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-74-38" name="__codelineno-74-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="nf">Fraction</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">den</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">num</span><span class="p">);</span>
<a id="__codelineno-74-39" name="__codelineno-74-39"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-74-40" name="__codelineno-74-40"></a>
<a id="__codelineno-74-41" name="__codelineno-74-41"></a><span class="w"> </span><span class="c1">// conversion operator overloading</span>
<a id="__codelineno-74-42" name="__codelineno-74-42"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">implicit</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="nf">float</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">f</span><span class="p">.</span><span class="n">den</span><span class="p">;</span>
<a id="__codelineno-74-43" name="__codelineno-74-43"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">explicit</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="nf">Fraction</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Fraction</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">);</span>
<a id="__codelineno-74-44" name="__codelineno-74-44"></a>
<a id="__codelineno-74-45" name="__codelineno-74-45"></a><span class="w"> </span><span class="c1">// true &amp; false operator overloading (truthiness and falseness more than exact boolean value)</span>
<a id="__codelineno-74-46" name="__codelineno-74-46"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="nf">true</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a id="__codelineno-74-47" name="__codelineno-74-47"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="nf">false</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a id="__codelineno-74-48" name="__codelineno-74-48"></a><span class="w"> </span><span class="c1">// if &amp;, |, true, false are overloaded than &amp;&amp; and || will work</span>
<a id="__codelineno-74-49" name="__codelineno-74-49"></a>
<a id="__codelineno-74-50" name="__codelineno-74-50"></a><span class="w"> </span><span class="c1">// comparison operators overloading</span>
<a id="__codelineno-74-51" name="__codelineno-74-51"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">==</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f1</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f2</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">f1</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">f2</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f1</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">f2</span><span class="p">.</span><span class="n">den</span><span class="p">;</span>
<a id="__codelineno-74-52" name="__codelineno-74-52"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">!=</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f1</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f2</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">f1</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">f2</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">f1</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">f2</span><span class="p">.</span><span class="n">den</span><span class="p">;</span>
<a id="__codelineno-74-53" name="__codelineno-74-53"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">&gt;</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f1</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f2</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">...;</span>
<a id="__codelineno-74-54" name="__codelineno-74-54"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">&gt;=</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f1</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f2</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">...;</span>
<a id="__codelineno-74-55" name="__codelineno-74-55"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">&lt;</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f1</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f2</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">...;</span>
<a id="__codelineno-74-56" name="__codelineno-74-56"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">&lt;=</span><span class="p">(</span><span class="n">Fraction</span><span class="w"> </span><span class="n">f1</span><span class="p">,</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f2</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">...;</span>
<a id="__codelineno-74-57" name="__codelineno-74-57"></a>
<a id="__codelineno-74-58" name="__codelineno-74-58"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">Equals</span><span class="p">(</span><span class="kt">object</span><span class="w"> </span><span class="n">obj</span><span class="p">)</span>
<a id="__codelineno-74-59" name="__codelineno-74-59"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-74-60" name="__codelineno-74-60"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Fraction</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">f</span><span class="p">.</span><span class="n">num</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">den</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">f</span><span class="p">.</span><span class="n">den</span><span class="p">;</span><span class="w"> </span><span class="c1">// same type + same values</span>
<a id="__codelineno-74-61" name="__codelineno-74-61"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-74-62" name="__codelineno-74-62"></a>
<a id="__codelineno-74-63" name="__codelineno-74-63"></a><span class="w"> </span><span class="c1">// required if Equals has been implemented</span>
<a id="__codelineno-74-64" name="__codelineno-74-64"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">GetHashCode</span><span class="p">()</span>
<a id="__codelineno-74-65" name="__codelineno-74-65"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-74-66" name="__codelineno-74-66"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">num</span><span class="p">,</span><span class="w"> </span><span class="n">den</span><span class="p">).</span><span class="n">GetHashCode</span><span class="p">();</span>
<a id="__codelineno-74-67" name="__codelineno-74-67"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-74-68" name="__codelineno-74-68"></a>
<a id="__codelineno-74-69" name="__codelineno-74-69"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="nf">ToString</span><span class="p">()</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">$&quot;{num} / {den}&quot;</span><span class="p">;</span>
<a id="__codelineno-74-70" name="__codelineno-74-70"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="nested-types">Nested Types</h3>
<p>A type defined at <em>global scope</em> can be only <code>public</code>or <code>internal</code>.
private wouldn't make sense since that makes something accessible only from within its containing type, and there is no containing type at global scope.<br />
But a nested type does have a containing type, so if a nested type is <code>private</code>, that type can be used only from inside the type within which it is nested.</p>
<blockquote>
<p><strong>Note</strong>: Code in a nested type is allowed to use nonpublic members of its containing type. However, an instance of a nested type does not automatically get a reference to an instance of its containing type.</p>
</blockquote>
<hr />
<h2 id="interfaces">Interfaces</h2>
<p>An interface declares methods, properties, and events, but it doesn't have to define their bodies.<br />
An interface is effectively a list of the members that a type will need to provide if it wants to implement the interface.</p>
<p>C# 8.0 adds the ability to define default implementations for some or all methods, and also to define nested types and static fields.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-75-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-75-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-75-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-75-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-75-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-75-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-75-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-75-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-75-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-75-10">10</a></span>
<span class="normal"><a href="#__codelineno-75-11">11</a></span>
<span class="normal"><a href="#__codelineno-75-12">12</a></span>
<span class="normal"><a href="#__codelineno-75-13">13</a></span>
<span class="normal"><a href="#__codelineno-75-14">14</a></span>
<span class="normal"><a href="#__codelineno-75-15">15</a></span>
<span class="normal"><a href="#__codelineno-75-16">16</a></span>
<span class="normal"><a href="#__codelineno-75-17">17</a></span>
<span class="normal"><a href="#__codelineno-75-18">18</a></span>
<span class="normal"><a href="#__codelineno-75-19">19</a></span>
<span class="normal"><a href="#__codelineno-75-20">20</a></span>
<span class="normal"><a href="#__codelineno-75-21">21</a></span>
<span class="normal"><a href="#__codelineno-75-22">22</a></span>
<span class="normal"><a href="#__codelineno-75-23">23</a></span>
<span class="normal"><a href="#__codelineno-75-24">24</a></span>
<span class="normal"><a href="#__codelineno-75-25">25</a></span>
<span class="normal"><a href="#__codelineno-75-26">26</a></span>
<span class="normal"><a href="#__codelineno-75-27">27</a></span>
<span class="normal"><a href="#__codelineno-75-28">28</a></span>
<span class="normal"><a href="#__codelineno-75-29">29</a></span>
<span class="normal"><a href="#__codelineno-75-30">30</a></span>
<span class="normal"><a href="#__codelineno-75-31">31</a></span>
<span class="normal"><a href="#__codelineno-75-32">32</a></span>
<span class="normal"><a href="#__codelineno-75-33">33</a></span>
<span class="normal"><a href="#__codelineno-75-34">34</a></span>
<span class="normal"><a href="#__codelineno-75-35">35</a></span>
<span class="normal"><a href="#__codelineno-75-36">36</a></span>
<span class="normal"><a href="#__codelineno-75-37">37</a></span>
<span class="normal"><a href="#__codelineno-75-38">38</a></span>
<span class="normal"><a href="#__codelineno-75-39">39</a></span>
<span class="normal"><a href="#__codelineno-75-40">40</a></span>
<span class="normal"><a href="#__codelineno-75-41">41</a></span>
<span class="normal"><a href="#__codelineno-75-42">42</a></span>
<span class="normal"><a href="#__codelineno-75-43">43</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-75-1" name="__codelineno-75-1"></a><span class="c1">// can only be public or internal if not nested, any accessibility otherwise</span>
<a id="__codelineno-75-2" name="__codelineno-75-2"></a><span class="k">public</span><span class="w"> </span><span class="k">interface</span><span class="w"> </span><span class="n">IContract</span>
<a id="__codelineno-75-3" name="__codelineno-75-3"></a><span class="p">{</span>
<a id="__codelineno-75-4" name="__codelineno-75-4"></a><span class="w"> </span><span class="c1">// properties</span>
<a id="__codelineno-75-5" name="__codelineno-75-5"></a><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-75-6" name="__codelineno-75-6"></a>
<a id="__codelineno-75-7" name="__codelineno-75-7"></a><span class="w"> </span><span class="c1">// methods (only signature)</span>
<a id="__codelineno-75-8" name="__codelineno-75-8"></a><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
<a id="__codelineno-75-9" name="__codelineno-75-9"></a>
<a id="__codelineno-75-10" name="__codelineno-75-10"></a><span class="w"> </span><span class="c1">// default interface implementations</span>
<a id="__codelineno-75-11" name="__codelineno-75-11"></a><span class="w"> </span><span class="c1">// (method has body), if not implemented in inheriting class the implementation will be this</span>
<a id="__codelineno-75-12" name="__codelineno-75-12"></a><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-75-13" name="__codelineno-75-13"></a>
<a id="__codelineno-75-14" name="__codelineno-75-14"></a><span class="w"> </span><span class="c1">// constants</span>
<a id="__codelineno-75-15" name="__codelineno-75-15"></a><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">CONSTANT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">value</span><span class="p">;</span>
<a id="__codelineno-75-16" name="__codelineno-75-16"></a>
<a id="__codelineno-75-17" name="__codelineno-75-17"></a><span class="w"> </span><span class="c1">// static properties</span>
<a id="__codelineno-75-18" name="__codelineno-75-18"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">StaticProperty</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-75-19" name="__codelineno-75-19"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">StaticMethod</span><span class="p">();</span>
<a id="__codelineno-75-20" name="__codelineno-75-20"></a>
<a id="__codelineno-75-21" name="__codelineno-75-21"></a><span class="w"> </span><span class="c1">// static abstract members</span>
<a id="__codelineno-75-22" name="__codelineno-75-22"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">AbstractProperty</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-75-23" name="__codelineno-75-23"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">AbstractMethod</span><span class="p">();</span>
<a id="__codelineno-75-24" name="__codelineno-75-24"></a>
<a id="__codelineno-75-25" name="__codelineno-75-25"></a><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="n">IContract</span><span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="o">+</span><span class="p">(</span><span class="n">IContract</span><span class="w"> </span><span class="n">source</span><span class="p">);</span>
<a id="__codelineno-75-26" name="__codelineno-75-26"></a>
<a id="__codelineno-75-27" name="__codelineno-75-27"></a><span class="w"> </span><span class="c1">// nested types are valid, accessibility is needed</span>
<a id="__codelineno-75-28" name="__codelineno-75-28"></a><span class="p">}</span>
<a id="__codelineno-75-29" name="__codelineno-75-29"></a>
<a id="__codelineno-75-30" name="__codelineno-75-30"></a><span class="k">public</span><span class="w"> </span><span class="k">interface</span><span class="w"> </span><span class="n">IContract</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// interfaces can be generic</span>
<a id="__codelineno-75-31" name="__codelineno-75-31"></a>
<a id="__codelineno-75-32" name="__codelineno-75-32"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Contract</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">IContract</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* ... */</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-75-33" name="__codelineno-75-33"></a>
<a id="__codelineno-75-34" name="__codelineno-75-34"></a><span class="kt">var</span><span class="w"> </span><span class="n">contract</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Contract</span><span class="p">();</span>
<a id="__codelineno-75-35" name="__codelineno-75-35"></a><span class="n">contract</span><span class="p">.</span><span class="n">Property</span><span class="p">;</span>
<a id="__codelineno-75-36" name="__codelineno-75-36"></a><span class="n">contract</span><span class="p">.</span><span class="n">Method</span><span class="p">();</span>
<a id="__codelineno-75-37" name="__codelineno-75-37"></a>
<a id="__codelineno-75-38" name="__codelineno-75-38"></a><span class="n">contract</span><span class="p">.</span><span class="n">AbstractProperty</span><span class="p">;</span>
<a id="__codelineno-75-39" name="__codelineno-75-39"></a><span class="n">contract</span><span class="p">.</span><span class="n">AbstractMethod</span><span class="p">();</span>
<a id="__codelineno-75-40" name="__codelineno-75-40"></a>
<a id="__codelineno-75-41" name="__codelineno-75-41"></a><span class="n">IContract</span><span class="p">.</span><span class="n">CONSTANT</span><span class="p">;</span>
<a id="__codelineno-75-42" name="__codelineno-75-42"></a><span class="n">IContract</span><span class="p">.</span><span class="n">StaticProperty</span><span class="p">;</span>
<a id="__codelineno-75-43" name="__codelineno-75-43"></a><span class="n">IContract</span><span class="p">.</span><span class="n">StaticMethod</span><span class="p">();</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: Interfaces are reference types. Despite this, it's possible tp implement interfaces on both classes and structs.<br />
However, be careful when doing so with a struct, because when getting hold of an interface-typed reference to a struct, it will be a reference to a <em>box</em>,<br />
which is effectively an object that holds a copy of a struct in a way that can be referred to via a reference.</p>
</blockquote>
<hr />
<h2 id="generics">Generics</h2>
<p><a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/">Generics Docs</a>
<a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods">Generic Methods Docs</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-76-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-76-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-76-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-76-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-76-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-76-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-76-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-76-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-76-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-76-10">10</a></span>
<span class="normal"><a href="#__codelineno-76-11">11</a></span>
<span class="normal"><a href="#__codelineno-76-12">12</a></span>
<span class="normal"><a href="#__codelineno-76-13">13</a></span>
<span class="normal"><a href="#__codelineno-76-14">14</a></span>
<span class="normal"><a href="#__codelineno-76-15">15</a></span>
<span class="normal"><a href="#__codelineno-76-16">16</a></span>
<span class="normal"><a href="#__codelineno-76-17">17</a></span>
<span class="normal"><a href="#__codelineno-76-18">18</a></span>
<span class="normal"><a href="#__codelineno-76-19">19</a></span>
<span class="normal"><a href="#__codelineno-76-20">20</a></span>
<span class="normal"><a href="#__codelineno-76-21">21</a></span>
<span class="normal"><a href="#__codelineno-76-22">22</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-76-1" name="__codelineno-76-1"></a><span class="c1">// type parameter T in angle brackets</span>
<a id="__codelineno-76-2" name="__codelineno-76-2"></a><span class="c1">// WARNING: T is not instantiable, new t(), new t[] are INVALID</span>
<a id="__codelineno-76-3" name="__codelineno-76-3"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-76-4" name="__codelineno-76-4"></a>
<a id="__codelineno-76-5" name="__codelineno-76-5"></a><span class="w"> </span><span class="c1">// constructors</span>
<a id="__codelineno-76-6" name="__codelineno-76-6"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">GenericClass</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-76-7" name="__codelineno-76-7"></a>
<a id="__codelineno-76-8" name="__codelineno-76-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">GenericClass</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">data</span><span class="p">){</span>
<a id="__codelineno-76-9" name="__codelineno-76-9"></a><span class="w"> </span><span class="n">Generic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">data</span><span class="p">;</span>
<a id="__codelineno-76-10" name="__codelineno-76-10"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-76-11" name="__codelineno-76-11"></a>
<a id="__codelineno-76-12" name="__codelineno-76-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">Generic</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// generic type auto-property</span>
<a id="__codelineno-76-13" name="__codelineno-76-13"></a>
<a id="__codelineno-76-14" name="__codelineno-76-14"></a><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">GenericMethodName</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// same generic as class</span>
<a id="__codelineno-76-15" name="__codelineno-76-15"></a><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="n">GenericMethodName</span><span class="o">&lt;</span><span class="n">S</span><span class="o">&gt;</span><span class="p">(</span><span class="n">S</span><span class="w"> </span><span class="n">s</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// new generic type</span>
<a id="__codelineno-76-16" name="__codelineno-76-16"></a><span class="p">}</span>
<a id="__codelineno-76-17" name="__codelineno-76-17"></a>
<a id="__codelineno-76-18" name="__codelineno-76-18"></a><span class="n">GenericClass</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">GenericClass</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<a id="__codelineno-76-19" name="__codelineno-76-19"></a><span class="n">GenericClass</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="p">[]</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">GenericClass</span><span class="o">&lt;&gt;</span><span class="p">[];</span><span class="w"> </span><span class="c1">// invalid</span>
<a id="__codelineno-76-20" name="__codelineno-76-20"></a>
<a id="__codelineno-76-21" name="__codelineno-76-21"></a><span class="n">obj</span><span class="p">.</span><span class="n">GenericMethodName</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="p">();</span><span class="w"> </span><span class="c1">// generic method call</span>
<a id="__codelineno-76-22" name="__codelineno-76-22"></a><span class="n">obj</span><span class="p">.</span><span class="n">GenericMethodName</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">);</span><span class="w"> </span><span class="c1">// type deduced by input, input type and generic method type must match</span>
</code></pre></div></td></tr></table></div>
<h3 id="multiple-generics">Multiple Generics</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-77-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-77-1" name="__codelineno-77-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T1</span><span class="p">,</span><span class="w"> </span><span class="n">T2</span><span class="p">,</span><span class="w"> </span><span class="p">...</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// number of generic types is not limited</span>
</code></pre></div></td></tr></table></div>
<h3 id="parameters-constraints">Parameters Constraints</h3>
<p>Specify an interface or class that the generic type must implement/inherit.</p>
<p>C# supports only six kinds of constraints on a type argument:</p>
<ul>
<li>type constraint</li>
<li>reference type constraint</li>
<li>value type constraint</li>
<li><code>notnull</code></li>
<li><code>unmanaged</code></li>
<li><code>new()</code></li>
</ul>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-78-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-78-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-78-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-78-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-78-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-78-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-78-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-78-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-78-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-78-10">10</a></span>
<span class="normal"><a href="#__codelineno-78-11">11</a></span>
<span class="normal"><a href="#__codelineno-78-12">12</a></span>
<span class="normal"><a href="#__codelineno-78-13">13</a></span>
<span class="normal"><a href="#__codelineno-78-14">14</a></span>
<span class="normal"><a href="#__codelineno-78-15">15</a></span>
<span class="normal"><a href="#__codelineno-78-16">16</a></span>
<span class="normal"><a href="#__codelineno-78-17">17</a></span>
<span class="normal"><a href="#__codelineno-78-18">18</a></span>
<span class="normal"><a href="#__codelineno-78-19">19</a></span>
<span class="normal"><a href="#__codelineno-78-20">20</a></span>
<span class="normal"><a href="#__codelineno-78-21">21</a></span>
<span class="normal"><a href="#__codelineno-78-22">22</a></span>
<span class="normal"><a href="#__codelineno-78-23">23</a></span>
<span class="normal"><a href="#__codelineno-78-24">24</a></span>
<span class="normal"><a href="#__codelineno-78-25">25</a></span>
<span class="normal"><a href="#__codelineno-78-26">26</a></span>
<span class="normal"><a href="#__codelineno-78-27">27</a></span>
<span class="normal"><a href="#__codelineno-78-28">28</a></span>
<span class="normal"><a href="#__codelineno-78-29">29</a></span>
<span class="normal"><a href="#__codelineno-78-30">30</a></span>
<span class="normal"><a href="#__codelineno-78-31">31</a></span>
<span class="normal"><a href="#__codelineno-78-32">32</a></span>
<span class="normal"><a href="#__codelineno-78-33">33</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-78-1" name="__codelineno-78-1"></a><span class="c1">// type constraints</span>
<a id="__codelineno-78-2" name="__codelineno-78-2"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Interface</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-78-3" name="__codelineno-78-3"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">GenericClass</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-78-4" name="__codelineno-78-4"></a>
<a id="__codelineno-78-5" name="__codelineno-78-5"></a><span class="c1">// Enums and Delegates (type constraints)</span>
<a id="__codelineno-78-6" name="__codelineno-78-6"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Enum</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-78-7" name="__codelineno-78-7"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Delegate</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-78-8" name="__codelineno-78-8"></a>
<a id="__codelineno-78-9" name="__codelineno-78-9"></a><span class="c1">// reference type constraints (cannot be primitives or structs) --&gt; can test nullability, can use AS operator</span>
<a id="__codelineno-78-10" name="__codelineno-78-10"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// T must be not nullable reference type</span>
<a id="__codelineno-78-11" name="__codelineno-78-11"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">class</span><span class="o">?</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// T can be (not)nullable reference type</span>
<a id="__codelineno-78-12" name="__codelineno-78-12"></a>
<a id="__codelineno-78-13" name="__codelineno-78-13"></a><span class="c1">// value type constraint</span>
<a id="__codelineno-78-14" name="__codelineno-78-14"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// T must be a struct or a primitive type</span>
<a id="__codelineno-78-15" name="__codelineno-78-15"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">unmanaged</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// T must be a value type and its contents can only be value types, recursively</span>
<a id="__codelineno-78-16" name="__codelineno-78-16"></a>
<a id="__codelineno-78-17" name="__codelineno-78-17"></a><span class="c1">// no nulls</span>
<a id="__codelineno-78-18" name="__codelineno-78-18"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">notnull</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// T must be a value type or a not nullable reference type</span>
<a id="__codelineno-78-19" name="__codelineno-78-19"></a>
<a id="__codelineno-78-20" name="__codelineno-78-20"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">new</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// T must provide a parameterless constructor, cannot be abstract</span>
<a id="__codelineno-78-21" name="__codelineno-78-21"></a>
<a id="__codelineno-78-22" name="__codelineno-78-22"></a><span class="c1">// multiple constraints</span>
<a id="__codelineno-78-23" name="__codelineno-78-23"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericClass</span><span class="o">&lt;</span><span class="n">T1</span><span class="p">,</span><span class="w"> </span><span class="n">T2</span><span class="o">&gt;</span>
<a id="__codelineno-78-24" name="__codelineno-78-24"></a><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T1</span><span class="p">:</span><span class="w"> </span><span class="n">Interface</span>
<a id="__codelineno-78-25" name="__codelineno-78-25"></a><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T2</span><span class="p">:</span><span class="w"> </span><span class="n">Interface1</span><span class="p">,</span><span class="w"> </span><span class="n">Interface2</span>
<a id="__codelineno-78-26" name="__codelineno-78-26"></a><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-78-27" name="__codelineno-78-27"></a>
<a id="__codelineno-78-28" name="__codelineno-78-28"></a><span class="c1">// generic methods constraints</span>
<a id="__codelineno-78-29" name="__codelineno-78-29"></a><span class="k">public</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">GenericMethod</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">class</span><span class="o">?</span>
<a id="__codelineno-78-30" name="__codelineno-78-30"></a><span class="p">{</span>
<a id="__codelineno-78-31" name="__codelineno-78-31"></a><span class="w"> </span><span class="c1">// code here</span>
<a id="__codelineno-78-32" name="__codelineno-78-32"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-78-33" name="__codelineno-78-33"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="inheritance">Inheritance</h2>
<p>Classes support only single inheritance. Interfaces offer a form of multiple inheritance. Value types do not support inheritance at all.<br />
One reason for this is that value types are not normally used by reference, which removes one of the main benefits of inheritance: runtime polymorphism.</p>
<p>Since a derived class inherits everything the base class has—all its fields, methods, and other members,<br />
both public and private—an instance of the derived class can do anything an instance of the base could do.</p>
<blockquote>
<p><strong>Note</strong>: When deriving from a class, it's not possible to make the derived class more visible than its base. This restriction does not apply to interfaces.<br />
A <code>public</code> class is free to implement <code>internal</code> or <code>private</code> interfaces. However, it does apply to an interface's bases: a <code>public</code> interface cannot derive from an <code>internal</code> interface.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-79-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-79-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-79-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-79-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-79-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-79-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-79-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-79-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-79-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-79-10">10</a></span>
<span class="normal"><a href="#__codelineno-79-11">11</a></span>
<span class="normal"><a href="#__codelineno-79-12">12</a></span>
<span class="normal"><a href="#__codelineno-79-13">13</a></span>
<span class="normal"><a href="#__codelineno-79-14">14</a></span>
<span class="normal"><a href="#__codelineno-79-15">15</a></span>
<span class="normal"><a href="#__codelineno-79-16">16</a></span>
<span class="normal"><a href="#__codelineno-79-17">17</a></span>
<span class="normal"><a href="#__codelineno-79-18">18</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-79-1" name="__codelineno-79-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">BaseClass</span>
<a id="__codelineno-79-2" name="__codelineno-79-2"></a><span class="p">{</span>
<a id="__codelineno-79-3" name="__codelineno-79-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="n">Property</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-79-4" name="__codelineno-79-4"></a>
<a id="__codelineno-79-5" name="__codelineno-79-5"></a><span class="w"> </span><span class="c1">// to be overridden method must be ABSTRACT or VIRTUAL</span>
<a id="__codelineno-79-6" name="__codelineno-79-6"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-79-7" name="__codelineno-79-7"></a><span class="p">}</span>
<a id="__codelineno-79-8" name="__codelineno-79-8"></a>
<a id="__codelineno-79-9" name="__codelineno-79-9"></a><span class="c1">// the base class is ALWAYS the first after the colons</span>
<a id="__codelineno-79-10" name="__codelineno-79-10"></a><span class="k">class</span><span class="w"> </span><span class="nc">ChildClass</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">BaseClass</span><span class="p">,</span><span class="w"> </span><span class="n">Interface</span><span class="p">,</span><span class="w"> </span><span class="n">Interface</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span>
<a id="__codelineno-79-11" name="__codelineno-79-11"></a><span class="p">{</span>
<a id="__codelineno-79-12" name="__codelineno-79-12"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// override base&#39;s method (same signature)</span>
<a id="__codelineno-79-13" name="__codelineno-79-13"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">override</span><span class="w"> </span><span class="n">DerivedType</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// override base&#39;s method, can return more specific type (covariant return type, C# 9)</span>
<a id="__codelineno-79-14" name="__codelineno-79-14"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// hide base&#39;s method and prevent name conflict warning (hiding method can change signature)</span>
<a id="__codelineno-79-15" name="__codelineno-79-15"></a>
<a id="__codelineno-79-16" name="__codelineno-79-16"></a><span class="w"> </span><span class="k">base</span><span class="p">.</span><span class="n">Method</span><span class="p">();</span><span class="w"> </span><span class="c1">// call base method</span>
<a id="__codelineno-79-17" name="__codelineno-79-17"></a><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Interface</span><span class="p">.</span><span class="n">Method</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// explicit implementation of an interface member (resolve name conflict between interfaces)</span>
<a id="__codelineno-79-18" name="__codelineno-79-18"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="downcasting">Downcasting</h3>
<p>Downcasting is the conversion from a base class type to one of it's derived types.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-80-1">1</a></span>
<span class="normal"><a href="#__codelineno-80-2">2</a></span>
<span class="normal"><a href="#__codelineno-80-3">3</a></span>
<span class="normal"><a href="#__codelineno-80-4">4</a></span>
<span class="normal"><a href="#__codelineno-80-5">5</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-80-1" name="__codelineno-80-1"></a><span class="n">Base</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<a id="__codelineno-80-2" name="__codelineno-80-2"></a><span class="kt">var</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Derived</span><span class="p">)</span><span class="w"> </span><span class="n">b</span><span class="p">;</span><span class="w"> </span><span class="c1">// explicit casting (if conversion fails throws InvalidCastException)</span>
<a id="__codelineno-80-3" name="__codelineno-80-3"></a><span class="kt">var</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">Derived</span><span class="p">;</span><span class="w"> </span><span class="c1">// as operator (if conversion fails AS will return NULL)</span>
<a id="__codelineno-80-4" name="__codelineno-80-4"></a><span class="k">if</span><span class="p">(</span><span class="n">b</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Derived</span><span class="w"> </span><span class="n">d</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// type pattern, d contains converted obj (if conversion fails IS returns FALSE)</span>
<a id="__codelineno-80-5" name="__codelineno-80-5"></a><span class="k">if</span><span class="p">(</span><span class="n">b</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Derived</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// simple type pattern (if conversion fails IS returns FALSE)</span>
</code></pre></div></td></tr></table></div>
<h3 id="inheritance-constructors">Inheritance &amp; Constructors</h3>
<p>All of a base class's constructors are available to a derived type, but they can be invoked only by constructors in the derived class.<br />
All constructors are required to invoke a constructor on their base class, and if it's not specified which to invoke, the compiler invokes the base's zero-argument constructor.<br />
If the base has not a zero-argument constructor the compilation will cause an error. It's possible to invoke a base constructor explicitly to avoid this error.</p>
<p>Initialization order:</p>
<ol>
<li>Derived class field initializers</li>
<li>Base class field initializers</li>
<li>Base class constructor</li>
<li>Derived class constructor</li>
</ol>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-81-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-81-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-81-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-81-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-81-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-81-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-81-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-81-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-81-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-81-10">10</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-81-1" name="__codelineno-81-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Base</span>
<a id="__codelineno-81-2" name="__codelineno-81-2"></a><span class="p">{</span>
<a id="__codelineno-81-3" name="__codelineno-81-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Base</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span>
<a id="__codelineno-81-4" name="__codelineno-81-4"></a><span class="p">}</span>
<a id="__codelineno-81-5" name="__codelineno-81-5"></a>
<a id="__codelineno-81-6" name="__codelineno-81-6"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Derived</span>
<a id="__codelineno-81-7" name="__codelineno-81-7"></a><span class="p">{</span>
<a id="__codelineno-81-8" name="__codelineno-81-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Derived</span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="k">value</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// invoke base constructor explicitly passing a fixed value (base has no zero-arg constructor)</span>
<a id="__codelineno-81-9" name="__codelineno-81-9"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Derived</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="p">(</span><span class="n">param</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// invoke base constructor explicitly</span>
<a id="__codelineno-81-10" name="__codelineno-81-10"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="generics-inheritance">Generics Inheritance</h3>
<p>If you derive from a generic class, you must supply the type arguments it requires.<br />
You must provide concrete types unless your derived type is generic, in which case it can use its own type parameters as arguments.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-82-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-82-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-82-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-82-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-82-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-82-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-82-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-82-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-82-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-82-10">10</a></span>
<span class="normal"><a href="#__codelineno-82-11">11</a></span>
<span class="normal"><a href="#__codelineno-82-12">12</a></span>
<span class="normal"><a href="#__codelineno-82-13">13</a></span>
<span class="normal"><a href="#__codelineno-82-14">14</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-82-1" name="__codelineno-82-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericBase1</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span>
<a id="__codelineno-82-2" name="__codelineno-82-2"></a><span class="p">{</span>
<a id="__codelineno-82-3" name="__codelineno-82-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">Item</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-82-4" name="__codelineno-82-4"></a><span class="p">}</span>
<a id="__codelineno-82-5" name="__codelineno-82-5"></a>
<a id="__codelineno-82-6" name="__codelineno-82-6"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericBase2</span><span class="o">&lt;</span><span class="n">TKey</span><span class="p">,</span><span class="w"> </span><span class="n">TValue</span><span class="o">&gt;</span>
<a id="__codelineno-82-7" name="__codelineno-82-7"></a><span class="p">{</span>
<a id="__codelineno-82-8" name="__codelineno-82-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">TKey</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-82-9" name="__codelineno-82-9"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">TValue</span><span class="w"> </span><span class="n">Value</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-82-10" name="__codelineno-82-10"></a><span class="p">}</span>
<a id="__codelineno-82-11" name="__codelineno-82-11"></a>
<a id="__codelineno-82-12" name="__codelineno-82-12"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">NonGenericDerived</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">GenericBase1</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// derived is not generic, must use concrete type for base class</span>
<a id="__codelineno-82-13" name="__codelineno-82-13"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">GenericDerived</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">GenericBase1</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// derived is generic, can use it&#39;s generic type</span>
<a id="__codelineno-82-14" name="__codelineno-82-14"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">MixedDerived</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">GenericBase2</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="c1">// derived is generic but base has two types, can use it&#39;s generic type but</span>
</code></pre></div></td></tr></table></div>
<p>It's allowed to use derived type as a type argument to the base class. And it's also possible to specify a constraint on a type argument requiring it to derive from the derived type.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-83-1">1</a></span>
<span class="normal"><a href="#__codelineno-83-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-83-1" name="__codelineno-83-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Derived</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">base</span><span class="o">&lt;</span><span class="n">Derived</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span>
<a id="__codelineno-83-2" name="__codelineno-83-2"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Derived</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Derived</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span>
</code></pre></div></td></tr></table></div>
<h3 id="covariance-contravariance-only-for-interfaces">Covariance &amp; Contravariance (only for interfaces)</h3>
<p><a href="http://tomasp.net/blog/variance-explained.aspx/">The theory behind covariance and contravariance in C#</a></p>
<p><strong>Covariance</strong> and <strong>Contravariance</strong> are terms that refer to the ability to use a more derived type (more specific) or a less derived type (less specific) than originally specified.<br />
Generic type parameters support covariance and contravariance to provide greater flexibility in assigning and using generic types.</p>
<ul>
<li><strong>Covariance</strong>: Enables to use a more derived type than originally specified.</li>
<li><strong>Contravariance</strong>: Enables to use a more generic (less derived) type than originally specified.</li>
<li><strong>Invariance</strong>: it's possible to use <em>only</em> the type originally specified; so an invariant generic type parameter is neither covariant nor contravariant.</li>
</ul>
<p><img alt="covariance-vs-contravariance" src="../../../img/dotnet_covariant_contravariant.avif" /></p>
<blockquote>
<p><strong>Note</strong>: annotate generic type parameters with <code>out</code> and <code>in</code> annotations to specify whether they should behave covariantly or contravariantly.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-84-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-84-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-84-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-84-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-84-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-84-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-84-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-84-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-84-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-84-10">10</a></span>
<span class="normal"><a href="#__codelineno-84-11">11</a></span>
<span class="normal"><a href="#__codelineno-84-12">12</a></span>
<span class="normal"><a href="#__codelineno-84-13">13</a></span>
<span class="normal"><a href="#__codelineno-84-14">14</a></span>
<span class="normal"><a href="#__codelineno-84-15">15</a></span>
<span class="normal"><a href="#__codelineno-84-16">16</a></span>
<span class="normal"><a href="#__codelineno-84-17">17</a></span>
<span class="normal"><a href="#__codelineno-84-18">18</a></span>
<span class="normal"><a href="#__codelineno-84-19">19</a></span>
<span class="normal"><a href="#__codelineno-84-20">20</a></span>
<span class="normal"><a href="#__codelineno-84-21">21</a></span>
<span class="normal"><a href="#__codelineno-84-22">22</a></span>
<span class="normal"><a href="#__codelineno-84-23">23</a></span>
<span class="normal"><a href="#__codelineno-84-24">24</a></span>
<span class="normal"><a href="#__codelineno-84-25">25</a></span>
<span class="normal"><a href="#__codelineno-84-26">26</a></span>
<span class="normal"><a href="#__codelineno-84-27">27</a></span>
<span class="normal"><a href="#__codelineno-84-28">28</a></span>
<span class="normal"><a href="#__codelineno-84-29">29</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-84-1" name="__codelineno-84-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Base</span><span class="w"> </span><span class="p">{};</span>
<a id="__codelineno-84-2" name="__codelineno-84-2"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Derived</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Base</span><span class="w"> </span><span class="p">{}</span>
<a id="__codelineno-84-3" name="__codelineno-84-3"></a>
<a id="__codelineno-84-4" name="__codelineno-84-4"></a><span class="c1">// COVARIANCE (supply more specific type)</span>
<a id="__codelineno-84-5" name="__codelineno-84-5"></a><span class="c1">// method is &quot;read only&quot; since it does not modify its argument</span>
<a id="__codelineno-84-6" name="__codelineno-84-6"></a><span class="c1">// IEnumerable is covariant (has out parameter) since only &quot;provides&quot; objects</span>
<a id="__codelineno-84-7" name="__codelineno-84-7"></a><span class="k">void</span><span class="w"> </span><span class="nf">PrintBase</span><span class="p">(</span><span class="n">IEnumerable</span><span class="o">&lt;</span><span class="n">Base</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bases</span><span class="p">)</span>
<a id="__codelineno-84-8" name="__codelineno-84-8"></a><span class="p">{</span>
<a id="__codelineno-84-9" name="__codelineno-84-9"></a><span class="w"> </span><span class="k">foreach</span><span class="p">(</span><span class="n">Base</span><span class="w"> </span><span class="k">base</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bases</span><span class="p">)</span>
<a id="__codelineno-84-10" name="__codelineno-84-10"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-84-11" name="__codelineno-84-11"></a><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WritLine</span><span class="p">(</span><span class="k">base</span><span class="p">);</span>
<a id="__codelineno-84-12" name="__codelineno-84-12"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-84-13" name="__codelineno-84-13"></a><span class="p">}</span>
<a id="__codelineno-84-14" name="__codelineno-84-14"></a>
<a id="__codelineno-84-15" name="__codelineno-84-15"></a><span class="n">IEnumerable</span><span class="o">&lt;</span><span class="n">Derived</span><span class="o">&gt;</span><span class="w"> </span><span class="n">derivedItems</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Derived</span><span class="p">[]</span><span class="w"> </span><span class="p">{...};</span><span class="w"> </span><span class="c1">// array is enumerable of Derived objects</span>
<a id="__codelineno-84-16" name="__codelineno-84-16"></a><span class="n">Method</span><span class="p">(</span><span class="n">derivedItems</span><span class="p">);</span><span class="w"> </span><span class="c1">// valid since Derived objects are also Base objects and operation is read only</span>
<a id="__codelineno-84-17" name="__codelineno-84-17"></a>
<a id="__codelineno-84-18" name="__codelineno-84-18"></a>
<a id="__codelineno-84-19" name="__codelineno-84-19"></a><span class="c1">// CONTRAVARIANCE (supply less specific type)</span>
<a id="__codelineno-84-20" name="__codelineno-84-20"></a><span class="c1">// IComparer is contravariant (has in parameter) since &quot;takes in&quot; objects</span>
<a id="__codelineno-84-21" name="__codelineno-84-21"></a><span class="k">void</span><span class="w"> </span><span class="nf">CompareDerived</span><span class="p">(</span><span class="n">IComparer</span><span class="o">&lt;</span><span class="n">Derived</span><span class="o">&gt;</span><span class="w"> </span><span class="n">comparer</span><span class="p">)</span>
<a id="__codelineno-84-22" name="__codelineno-84-22"></a><span class="p">{</span>
<a id="__codelineno-84-23" name="__codelineno-84-23"></a><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">d1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Derived</span><span class="p">();</span>
<a id="__codelineno-84-24" name="__codelineno-84-24"></a><span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">d2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Derived</span><span class="p">();</span>
<a id="__codelineno-84-25" name="__codelineno-84-25"></a><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">comparer</span><span class="p">.</span><span class="n">Compare</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span><span class="w"> </span><span class="n">d2</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* some action */</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-84-26" name="__codelineno-84-26"></a><span class="p">}</span>
<a id="__codelineno-84-27" name="__codelineno-84-27"></a>
<a id="__codelineno-84-28" name="__codelineno-84-28"></a><span class="n">IComparator</span><span class="o">&lt;</span><span class="n">Base</span><span class="o">&gt;</span><span class="w"> </span><span class="n">baseComparator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BaseComparator</span><span class="p">();</span>
<a id="__codelineno-84-29" name="__codelineno-84-29"></a><span class="n">CompareDerived</span><span class="p">(</span><span class="n">baseComparator</span><span class="p">);</span><span class="w"> </span><span class="c1">// valid since baseComparator can compare Base objects and thus can compare Derived objects</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="delegates">Delegates</h2>
<p>A <strong>delegate</strong> is a type that represents a <em>reference to a method</em> with a particular parameter list and return type. Delegates are used to pass methods as arguments to other methods.<br />
This ability to refer to a method as a parameter makes delegates ideal for defining callback methods.</p>
<p>Any method from any accessible class or struct that matches the delegate type can be assigned to the delegate. The method can be either static or an instance method.<br />
This makes it possible to programmatically change method calls, and also plug new code into existing classes.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-85-1">1</a></span>
<span class="normal"><a href="#__codelineno-85-2">2</a></span>
<span class="normal"><a href="#__codelineno-85-3">3</a></span>
<span class="normal"><a href="#__codelineno-85-4">4</a></span>
<span class="normal"><a href="#__codelineno-85-5">5</a></span>
<span class="normal"><a href="#__codelineno-85-6">6</a></span>
<span class="normal"><a href="#__codelineno-85-7">7</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-85-1" name="__codelineno-85-1"></a><span class="c1">// delegate definition</span>
<a id="__codelineno-85-2" name="__codelineno-85-2"></a><span class="k">public</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Delegate</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span><span class="w"> </span><span class="c1">// can take any method with specified type params and return type</span>
<a id="__codelineno-85-3" name="__codelineno-85-3"></a><span class="k">public</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span><span class="n">T</span><span class="w"> </span><span class="n">param</span><span class="p">);</span><span class="w"> </span><span class="c1">// generic delegate</span>
<a id="__codelineno-85-4" name="__codelineno-85-4"></a>
<a id="__codelineno-85-5" name="__codelineno-85-5"></a><span class="c1">// delegate creation</span>
<a id="__codelineno-85-6" name="__codelineno-85-6"></a><span class="kt">var</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="p">(</span><span class="n">Method</span><span class="p">);</span><span class="w"> </span><span class="c1">// explicit creation, useful when compiler cannot infer delegate type</span>
<a id="__codelineno-85-7" name="__codelineno-85-7"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Method</span><span class="p">;</span><span class="w"> </span><span class="c1">// implicit creation</span>
</code></pre></div></td></tr></table></div>
<h3 id="multicast-delegates"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.multicastdelegate">Multicast Delegates</a></h3>
<p><strong>Multicast Delegates</strong> are delegates that can have more than one element in their invocation list.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-86-1">1</a></span>
<span class="normal"><a href="#__codelineno-86-2">2</a></span>
<span class="normal"><a href="#__codelineno-86-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-86-1" name="__codelineno-86-1"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">multicastDelegate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Method1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">Method2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">...;</span><span class="w"> </span><span class="c1">// multicast delegate creation</span>
<a id="__codelineno-86-2" name="__codelineno-86-2"></a><span class="n">multicastDelegate</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">Method</span><span class="p">;</span><span class="w"> </span><span class="c1">// add method to delegate</span>
<a id="__codelineno-86-3" name="__codelineno-86-3"></a><span class="n">multicastDelegate</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">Method</span><span class="p">;</span><span class="w"> </span><span class="c1">// remove method from delegate</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: Delegate removal behaves in a potentially surprising way if the delegate removed refers to multiple methods.<br />
Subtraction of a multicast delegate succeeds only if the delegate from which subtract contains all of the methods in the delegate being subtracted <em>sequentially and in the same order</em>.</p>
</blockquote>
<h3 id="delegate-invocation">Delegate Invocation</h3>
<p>Invoking a delegate with a single target method works as though the code had called the target method in the conventional way.<br />
Invoking a multicast delegate is just like calling each of its target methods in turn.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-87-1">1</a></span>
<span class="normal"><a href="#__codelineno-87-2">2</a></span>
<span class="normal"><a href="#__codelineno-87-3">3</a></span>
<span class="normal"><a href="#__codelineno-87-4">4</a></span>
<span class="normal"><a href="#__codelineno-87-5">5</a></span>
<span class="normal"><a href="#__codelineno-87-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-87-1" name="__codelineno-87-1"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Method</span><span class="p">;</span>
<a id="__codelineno-87-2" name="__codelineno-87-2"></a>
<a id="__codelineno-87-3" name="__codelineno-87-3"></a><span class="k">delegate</span><span class="p">(</span><span class="n">args</span><span class="p">);</span><span class="w"> </span><span class="c1">// use delegate as standard method</span>
<a id="__codelineno-87-4" name="__codelineno-87-4"></a><span class="k">delegate</span><span class="p">.</span><span class="n">DynamicInvoke</span><span class="p">(</span><span class="n">argsArray</span><span class="p">);</span><span class="w"> </span><span class="c1">// Dynamically invokes the method represented by the current delegate.</span>
<a id="__codelineno-87-5" name="__codelineno-87-5"></a>
<a id="__codelineno-87-6" name="__codelineno-87-6"></a><span class="n">multicastDelegate</span><span class="p">.</span><span class="n">GetInvocationList</span><span class="p">();</span><span class="w"> </span><span class="c1">// list of methods called by the delegate</span>
</code></pre></div></td></tr></table></div>
<h3 id="common-delegate-types">Common Delegate Types</h3>
<blockquote>
<p><strong>Note</strong>: Each delegate has an overload taking from zero to 16 arguments;</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-88-1">1</a></span>
<span class="normal"><a href="#__codelineno-88-2">2</a></span>
<span class="normal"><a href="#__codelineno-88-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-88-1" name="__codelineno-88-1"></a><span class="k">public</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="n">Action</span><span class="o">&lt;</span><span class="k">in</span><span class="w"> </span><span class="n">T1</span><span class="p">,</span><span class="w"> </span><span class="p">...</span><span class="o">&gt;</span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
<a id="__codelineno-88-2" name="__codelineno-88-2"></a><span class="k">public</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="n">TResult</span><span class="w"> </span><span class="n">Func</span><span class="o">&lt;</span><span class="k">in</span><span class="w"> </span><span class="n">T1</span><span class="p">,</span><span class="w"> </span><span class="p">...,</span><span class="w"> </span><span class="k">out</span><span class="w"> </span><span class="n">TResult</span><span class="o">&gt;</span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
<a id="__codelineno-88-3" name="__codelineno-88-3"></a><span class="k">public</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">Predicate</span><span class="o">&lt;</span><span class="k">in</span><span class="w"> </span><span class="n">T1</span><span class="p">,</span><span class="w"> </span><span class="p">...</span><span class="o">&gt;</span><span class="p">(</span><span class="n">T1</span><span class="w"> </span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
</code></pre></div></td></tr></table></div>
<h3 id="type-compatibility">Type Compatibility</h3>
<p>Delegate types do not derive from one another. Any delegate type defined in C# will derive directly from <code>MulticastDelegate</code>.<br />
However, the type system supports certain implicit reference conversions for generic delegate types through covariance and contravariance. The rules are very similar to those for interfaces.</p>
<h2 id="anonymous-functions-lambda-expressions">Anonymous Functions (Lambda Expressions)</h2>
<p>Delegates without explicit separated method.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-89-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-89-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-89-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-89-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-89-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-89-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-89-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-89-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-89-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-89-10">10</a></span>
<span class="normal"><a href="#__codelineno-89-11">11</a></span>
<span class="normal"><a href="#__codelineno-89-12">12</a></span>
<span class="normal"><a href="#__codelineno-89-13">13</a></span>
<span class="normal"><a href="#__codelineno-89-14">14</a></span>
<span class="normal"><a href="#__codelineno-89-15">15</a></span>
<span class="normal"><a href="#__codelineno-89-16">16</a></span>
<span class="normal"><a href="#__codelineno-89-17">17</a></span>
<span class="normal"><a href="#__codelineno-89-18">18</a></span>
<span class="normal"><a href="#__codelineno-89-19">19</a></span>
<span class="normal"><a href="#__codelineno-89-20">20</a></span>
<span class="normal"><a href="#__codelineno-89-21">21</a></span>
<span class="normal"><a href="#__codelineno-89-22">22</a></span>
<span class="normal"><a href="#__codelineno-89-23">23</a></span>
<span class="normal"><a href="#__codelineno-89-24">24</a></span>
<span class="normal"><a href="#__codelineno-89-25">25</a></span>
<span class="normal"><a href="#__codelineno-89-26">26</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-89-1" name="__codelineno-89-1"></a><span class="c1">// lambda variations</span>
<a id="__codelineno-89-2" name="__codelineno-89-2"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-89-3" name="__codelineno-89-3"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-89-4" name="__codelineno-89-4"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">input</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-89-5" name="__codelineno-89-5"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">input</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-89-6" name="__codelineno-89-6"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-89-7" name="__codelineno-89-7"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">input</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-89-8" name="__codelineno-89-8"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">input</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-89-9" name="__codelineno-89-9"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">default</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// lambda default parameter</span>
<a id="__codelineno-89-10" name="__codelineno-89-10"></a>
<a id="__codelineno-89-11" name="__codelineno-89-11"></a><span class="c1">// static modifier prevents unintentional capture of local variables or instance state by the lambda</span>
<a id="__codelineno-89-12" name="__codelineno-89-12"></a><span class="n">Delegate</span><span class="o">&lt;</span><span class="n">Type</span><span class="o">&gt;</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="k">static</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="n">input</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expr</span><span class="o">&gt;</span><span class="p">;</span>
<a id="__codelineno-89-13" name="__codelineno-89-13"></a>
<a id="__codelineno-89-14" name="__codelineno-89-14"></a><span class="n">Type</span><span class="w"> </span><span class="n">variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">&lt;</span><span class="n">expression</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="c1">// ignore arguments of the method passed to the delegate</span>
<a id="__codelineno-89-15" name="__codelineno-89-15"></a>
<a id="__codelineno-89-16" name="__codelineno-89-16"></a><span class="c1">// lambda type inference</span>
<a id="__codelineno-89-17" name="__codelineno-89-17"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">;</span>
<a id="__codelineno-89-18" name="__codelineno-89-18"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="c1">// inferring the return type</span>
<a id="__codelineno-89-19" name="__codelineno-89-19"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="c1">// inferring the signature</span>
<a id="__codelineno-89-20" name="__codelineno-89-20"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">Required</span><span class="p">]</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="c1">// adding attributes on parameters</span>
<a id="__codelineno-89-21" name="__codelineno-89-21"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">Required</span><span class="p">]</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
<a id="__codelineno-89-22" name="__codelineno-89-22"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="k">return</span><span class="p">:</span><span class="w"> </span><span class="n">Required</span><span class="p">]</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="c1">// adding attribute for a return type</span>
<a id="__codelineno-89-23" name="__codelineno-89-23"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">default</span><span class="p">;</span><span class="w"> </span><span class="c1">// explicit return type</span>
<a id="__codelineno-89-24" name="__codelineno-89-24"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="k">ref</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="c1">// using ref on structs</span>
<a id="__codelineno-89-25" name="__codelineno-89-25"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">;</span><span class="w"> </span><span class="c1">// explicitly specifying the return type of an implicit input</span>
<a id="__codelineno-89-26" name="__codelineno-89-26"></a><span class="kt">var</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">Write</span><span class="p">(</span><span class="s">&quot;Help&quot;</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="events"><a href="https://www.tutorialsteacher.com/csharp/csharp-event">Events</a></h2>
<p>Structs and classes can declare events. This kind of member enables a type to provide notifications when interesting things happen, using a subscription-based model.</p>
<p>The class who raises events is called <em>Publisher</em>, and the class who receives the notification is called <em>Subscriber</em>. There can be multiple subscribers of a single event.<br />
Typically, a publisher raises an event when some action occurred. The subscribers, who are interested in getting a notification when an action occurred, should register with an event and handle it.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-90-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-90-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-90-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-90-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-90-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-90-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-90-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-90-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-90-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-90-10">10</a></span>
<span class="normal"><a href="#__codelineno-90-11">11</a></span>
<span class="normal"><a href="#__codelineno-90-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-90-1" name="__codelineno-90-1"></a><span class="k">public</span><span class="w"> </span><span class="k">delegate</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">EventDelegate</span><span class="p">(</span><span class="kt">object</span><span class="w"> </span><span class="n">sender</span><span class="p">,</span><span class="w"> </span><span class="n">CustomEventArgs</span><span class="w"> </span><span class="n">args</span><span class="p">);</span><span class="w"> </span><span class="c1">// called on event trigger</span>
<a id="__codelineno-90-2" name="__codelineno-90-2"></a>
<a id="__codelineno-90-3" name="__codelineno-90-3"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Publisher</span>
<a id="__codelineno-90-4" name="__codelineno-90-4"></a><span class="p">{</span>
<a id="__codelineno-90-5" name="__codelineno-90-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">event</span><span class="w"> </span><span class="n">EventDelegate</span><span class="w"> </span><span class="n">Event</span><span class="p">;</span>
<a id="__codelineno-90-6" name="__codelineno-90-6"></a>
<a id="__codelineno-90-7" name="__codelineno-90-7"></a><span class="w"> </span><span class="c1">// A derived class should always call the On&lt;EventName&gt; method of the base class to ensure that registered delegates receive the event.</span>
<a id="__codelineno-90-8" name="__codelineno-90-8"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnEvent</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">param</span><span class="p">)</span>
<a id="__codelineno-90-9" name="__codelineno-90-9"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-90-10" name="__codelineno-90-10"></a><span class="w"> </span><span class="n">Event</span><span class="o">?.</span><span class="n">Invoke</span><span class="p">(</span><span class="n">param</span><span class="p">);</span>
<a id="__codelineno-90-11" name="__codelineno-90-11"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-90-12" name="__codelineno-90-12"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="registering-event-handlers">Registering Event Handlers</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-91-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-91-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-91-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-91-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-91-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-91-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-91-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-91-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-91-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-91-10">10</a></span>
<span class="normal"><a href="#__codelineno-91-11">11</a></span>
<span class="normal"><a href="#__codelineno-91-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-91-1" name="__codelineno-91-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Subscriber</span>
<a id="__codelineno-91-2" name="__codelineno-91-2"></a><span class="p">{</span>
<a id="__codelineno-91-3" name="__codelineno-91-3"></a><span class="w"> </span><span class="n">Publisher</span><span class="w"> </span><span class="n">publisher</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Publisher</span><span class="p">();</span>
<a id="__codelineno-91-4" name="__codelineno-91-4"></a>
<a id="__codelineno-91-5" name="__codelineno-91-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Subscriber</span><span class="p">()</span>
<a id="__codelineno-91-6" name="__codelineno-91-6"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-91-7" name="__codelineno-91-7"></a><span class="w"> </span><span class="n">publisher</span><span class="p">.</span><span class="n">OnEvent</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">Handler</span><span class="p">;</span><span class="w"> </span><span class="c1">// register handler (+= syntax)</span>
<a id="__codelineno-91-8" name="__codelineno-91-8"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-91-9" name="__codelineno-91-9"></a>
<a id="__codelineno-91-10" name="__codelineno-91-10"></a><span class="w"> </span><span class="c1">// event handler, matches the signature of the Event delegate.</span>
<a id="__codelineno-91-11" name="__codelineno-91-11"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Handler</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* act */</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-91-12" name="__codelineno-91-12"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="built-in-eventhandler-delegate">Built-In EventHandler Delegate</h3>
<p>.NET includes built-in delegate types <code>EventHandler</code> and <code>EventHandler&lt;TEventArgs&gt;</code> for the most common events.<br />
Typically, any event should include two parameters: the <em>source</em> of the event and event <em>data</em>.<br />
The <code>EventHandler</code> delegate is used for all events that do not include event data, the <code>EventHandler&lt;TEventArgs&gt;</code> delegate is used for events that include data to be sent to handlers.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-92-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-92-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-92-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-92-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-92-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-92-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-92-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-92-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-92-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-92-10">10</a></span>
<span class="normal"><a href="#__codelineno-92-11">11</a></span>
<span class="normal"><a href="#__codelineno-92-12">12</a></span>
<span class="normal"><a href="#__codelineno-92-13">13</a></span>
<span class="normal"><a href="#__codelineno-92-14">14</a></span>
<span class="normal"><a href="#__codelineno-92-15">15</a></span>
<span class="normal"><a href="#__codelineno-92-16">16</a></span>
<span class="normal"><a href="#__codelineno-92-17">17</a></span>
<span class="normal"><a href="#__codelineno-92-18">18</a></span>
<span class="normal"><a href="#__codelineno-92-19">19</a></span>
<span class="normal"><a href="#__codelineno-92-20">20</a></span>
<span class="normal"><a href="#__codelineno-92-21">21</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-92-1" name="__codelineno-92-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Publisher</span>
<a id="__codelineno-92-2" name="__codelineno-92-2"></a><span class="p">{</span>
<a id="__codelineno-92-3" name="__codelineno-92-3"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">event</span><span class="w"> </span><span class="n">EventHandler</span><span class="w"> </span><span class="n">Event</span><span class="p">;</span>
<a id="__codelineno-92-4" name="__codelineno-92-4"></a>
<a id="__codelineno-92-5" name="__codelineno-92-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnEvent</span><span class="p">(</span><span class="n">EventArgs</span><span class="w"> </span><span class="n">e</span><span class="p">)</span>
<a id="__codelineno-92-6" name="__codelineno-92-6"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-92-7" name="__codelineno-92-7"></a><span class="w"> </span><span class="n">Event</span><span class="o">?.</span><span class="n">Invoke</span><span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<a id="__codelineno-92-8" name="__codelineno-92-8"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-92-9" name="__codelineno-92-9"></a><span class="p">}</span>
<a id="__codelineno-92-10" name="__codelineno-92-10"></a>
<a id="__codelineno-92-11" name="__codelineno-92-11"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Subscriber</span>
<a id="__codelineno-92-12" name="__codelineno-92-12"></a><span class="p">{</span>
<a id="__codelineno-92-13" name="__codelineno-92-13"></a><span class="w"> </span><span class="n">Publisher</span><span class="w"> </span><span class="n">publisher</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Publisher</span><span class="p">();</span>
<a id="__codelineno-92-14" name="__codelineno-92-14"></a>
<a id="__codelineno-92-15" name="__codelineno-92-15"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Subscriber</span><span class="p">()</span>
<a id="__codelineno-92-16" name="__codelineno-92-16"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-92-17" name="__codelineno-92-17"></a><span class="w"> </span><span class="n">publisher</span><span class="p">.</span><span class="n">OnEvent</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">Handler</span><span class="p">;</span><span class="w"> </span><span class="c1">// register handler (+= syntax)</span>
<a id="__codelineno-92-18" name="__codelineno-92-18"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-92-19" name="__codelineno-92-19"></a>
<a id="__codelineno-92-20" name="__codelineno-92-20"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Handler</span><span class="p">(</span><span class="kt">object</span><span class="w"> </span><span class="n">sender</span><span class="p">,</span><span class="w"> </span><span class="n">EventArgs</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* act */</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-92-21" name="__codelineno-92-21"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="custom-event-args">Custom Event Args</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-93-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-93-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-93-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-93-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-93-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-93-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-93-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-93-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-93-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-93-10">10</a></span>
<span class="normal"><a href="#__codelineno-93-11">11</a></span>
<span class="normal"><a href="#__codelineno-93-12">12</a></span>
<span class="normal"><a href="#__codelineno-93-13">13</a></span>
<span class="normal"><a href="#__codelineno-93-14">14</a></span>
<span class="normal"><a href="#__codelineno-93-15">15</a></span>
<span class="normal"><a href="#__codelineno-93-16">16</a></span>
<span class="normal"><a href="#__codelineno-93-17">17</a></span>
<span class="normal"><a href="#__codelineno-93-18">18</a></span>
<span class="normal"><a href="#__codelineno-93-19">19</a></span>
<span class="normal"><a href="#__codelineno-93-20">20</a></span>
<span class="normal"><a href="#__codelineno-93-21">21</a></span>
<span class="normal"><a href="#__codelineno-93-22">22</a></span>
<span class="normal"><a href="#__codelineno-93-23">23</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-93-1" name="__codelineno-93-1"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">CustomEventArgs</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">EventArgs</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-93-2" name="__codelineno-93-2"></a>
<a id="__codelineno-93-3" name="__codelineno-93-3"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Publisher</span>
<a id="__codelineno-93-4" name="__codelineno-93-4"></a><span class="p">{</span>
<a id="__codelineno-93-5" name="__codelineno-93-5"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">event</span><span class="w"> </span><span class="n">EventHandler</span><span class="o">&lt;</span><span class="n">CustomEventArgs</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Event</span><span class="p">;</span>
<a id="__codelineno-93-6" name="__codelineno-93-6"></a>
<a id="__codelineno-93-7" name="__codelineno-93-7"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">virtual</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">OnEvent</span><span class="p">(</span><span class="n">CustomEventArgs</span><span class="w"> </span><span class="n">e</span><span class="p">)</span>
<a id="__codelineno-93-8" name="__codelineno-93-8"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-93-9" name="__codelineno-93-9"></a><span class="w"> </span><span class="n">Event</span><span class="o">?.</span><span class="n">Invoke</span><span class="p">(</span><span class="k">this</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="p">);</span>
<a id="__codelineno-93-10" name="__codelineno-93-10"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-93-11" name="__codelineno-93-11"></a><span class="p">}</span>
<a id="__codelineno-93-12" name="__codelineno-93-12"></a>
<a id="__codelineno-93-13" name="__codelineno-93-13"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Subscriber</span>
<a id="__codelineno-93-14" name="__codelineno-93-14"></a><span class="p">{</span>
<a id="__codelineno-93-15" name="__codelineno-93-15"></a><span class="w"> </span><span class="n">Publisher</span><span class="w"> </span><span class="n">publisher</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Publisher</span><span class="p">();</span>
<a id="__codelineno-93-16" name="__codelineno-93-16"></a>
<a id="__codelineno-93-17" name="__codelineno-93-17"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">Subscriber</span><span class="p">()</span>
<a id="__codelineno-93-18" name="__codelineno-93-18"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-93-19" name="__codelineno-93-19"></a><span class="w"> </span><span class="n">publisher</span><span class="p">.</span><span class="n">OnEvent</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">Handler</span><span class="p">;</span><span class="w"> </span><span class="c1">// register handler (+= syntax)</span>
<a id="__codelineno-93-20" name="__codelineno-93-20"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-93-21" name="__codelineno-93-21"></a>
<a id="__codelineno-93-22" name="__codelineno-93-22"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">Handler</span><span class="p">(</span><span class="kt">object</span><span class="w"> </span><span class="n">sender</span><span class="p">,</span><span class="w"> </span><span class="n">CustomEventArgs</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* act */</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-93-23" name="__codelineno-93-23"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="assemblies">Assemblies</h2>
<p>In .NET the proper term for a software component is an <strong>assembly</strong>, and it is typically a <code>.dll</code> or <code>.exe</code> file.<br />
Occasionally, an assembly will be split into multiple files, but even then it is an indivisible unit of deployment: it has to be wholly available to the runtime, or not at all.</p>
<p>Assemblies are an important aspect of the type system, because each type is identified not just by its <em>name</em> and <em>namespace</em>, but also by its containing <em>assembly</em>.<br />
Assemblies provide a kind of encapsulation that operates at a larger scale than individual types, thanks to the <code>internal</code> accessibility specifier, which works at the assembly level.</p>
<p>The runtime provides an <em>assembly loader</em>, which automatically finds and loads the assemblies a program needs.<br />
To ensure that the loader can find the right components, assemblies have structured names that include version information, and they can optionally contain a globally unique element to prevent ambiguity.</p>
<h3 id="anatomy-of-an-assembly">Anatomy of an Assembly</h3>
<p>Assemblies use the <strong>Win32 Portable Executable</strong> (PE) file format, the same format that executables (EXEs) and dynamic link libraries (DLLs) have always used in "modern" (since NT) versions of Windows.</p>
<p>The C# compiler produces an assembly as its output, with an extension of either <code>.dll</code> or <code>.exe</code>.<br />
Tools that understand the PE file format will recognize a .NET assembly as a valid, but rather dull, PE file.<br />
The CLR essentially uses PE files as containers for a .NET-specific data format, so to classic Win32 tools, a C# DLL will not appear to export any APIs.</p>
<p>With .NET Core 3.0 or later, .NET assemblies won't be built with an extension of <code>.exe</code>.<br />
Even project types that produce directly runnable outputs (such as console or WPF applications) produce a <code>.dll</code> as their primary output.<br />
They also generate an executable file too, but it's not a .NET assembly. It's just a bootstrapper that starts the runtime and then loads and executes your application's main assembly.</p>
<blockquote>
<p><strong>Note</strong>: C# compiles to a binary intermediate language (IL), which is not directly executable.<br />
The normal Windows mechanisms for loading and running the code in an executable or DLL won't work with IL, because that can run only with the help of the CLR.</p>
</blockquote>
<h3 id="net-metadata">.NET MEtadata</h3>
<p>As well as containing the compiled IL, an assembly contains metadata, which provides a full description of all of the types it defines, whether <code>public</code> or <code>private</code>.<br />
The CLR needs to have complete knowledge of all the types that the code uses to be able to make sense of the IL and turn it into running code, the binary format for IL frequently refers to the containing assembly's metadata and is meaningless without it.</p>
<h3 id="resources">Resources</h3>
<p>It's possible to embed binary resources in a DLL alongside the code and metadata. To embed a file select "Embedded Resource" as it's <em>Build Action</em> in the file properties.<br />
This compiles a copy of the file into the assembly.</p>
<p>To extract the resource at runtime use the <code>Assembly</code> class's <code>GetManifestResourceStream</code> method which is par of the <strong>Reflection API</strong>.</p>
<h3 id="multifile-assembly">Multifile Assembly</h3>
<p>.NET Framework allowed an assembly to span multiple files.<br />
It was possible to split the code and metadata across multiple modules, and it was also possible for some binary streams that are logically embedded in an assembly to be put in separate files.<br />
This feature was rarely used, and .NET Core does not support it. However, it's necessary to know about it because some of its consequences persist.<br />
In particular, parts of the design of the Reflection API make no sense unless this feature is known.</p>
<p>With a multifile assembly, there's always one master file that represents the assembly. This will be a PE file, and it contains a particular element of the metadata called the <strong>assembly manifest</strong>.<br />
This is not to be confused with the Win32-style manifest that most executables contain.<br />
The assembly manifest is just a description of what's in the assembly, including a list of any external modules or other external files; in a multimodule assembly, the manifest describes which types are defined in which files.</p>
<h3 id="assembly-resolution">Assembly Resolution</h3>
<p>When the runtime needs to load an assembly, it goes through a process called <em>assembly resolution</em>.</p>
<p>.NET Core supports two deployment options for applications:</p>
<ul>
<li><strong>self-contained</strong></li>
<li><strong>framework-dependent</strong></li>
</ul>
<h3 id="self-contained-deployment">Self-Contained Deployment</h3>
<p>When publishing a self-contained application, it includes a complete copy of .NET Core, the whole of the CLR and all the built-in assemblies.<br />
When building this way, assembly resolution is pretty straightforward because everything ends up in one folder.</p>
<p>There are two main advantages to self-contained deployment:</p>
<ul>
<li>there is no need to install .NET on target machines</li>
<li>it's known exactly what version of .NET and which versions of all DLLs are running</li>
</ul>
<p>With self-contained deployment, unless the application directs the CLR to look elsewhere everything will load from the application folder, including all assemblies built into .NET.</p>
<h4 id="framework-dependent-deployment">Framework-Dependent Deployment</h4>
<p>The default build behavior for applications is to create a framework-dependent executable. In this case, the code relies on a suitable version of .NET Core already being installed on the machine.<br />
Framework-dependent applications necessarily use a more complex resolution mechanism than self-contained ones.</p>
<p>When such an application starts up it will first determine exactly which version of .NET Core to run.<br />
The chosen runtime version selects not just the CLR, but also the assemblies making up the parts of the class library built into .NET.</p>
<h3 id="assembly-names">Assembly Names</h3>
<p>Assembly names are structured. They always include a <strong>simple name</strong>, which is the name by which normally refer to the DLL.<br />
This is usually the same as the filename but without the extension. It doesn't technically have to be but the assembly resolution mechanism assumes that it is.</p>
<p>Assembly names always include a <strong>version number</strong>. There are also some optional components, including <strong>the public key token</strong>, a string of <em>hexadecimal digits</em>, which is required to have a unique name.</p>
<h4 id="strong-names">Strong Names</h4>
<p>If an assembly's name includes a public key token, it is said to be a <strong>strong name</strong>. Microsoft advises that any .NET component that is published for shared use (e.g: made available via NuGet) should have a strong name.</p>
<p>As the terminology suggests, an assembly name's public key token has a connection with cryptography. It is the hexadecimal representation of a 64-bit hash of a public key.<br />
Strongly named assemblies are required to contain a copy of the full public key from which the hash was generated.<br />
The assembly file format also provides space fora digital signature, generated with the corresponding private key.</p>
<p>The uniqueness of a strong name relies on the fact that key generation systems use cryptographically secure random-number generators, and the chances of two people generating two key pairs with the same public key token are vanishingly small.<br />
The assurance that the assembly has ot been tampered with comes from the fact that a strongly named assembly must be signed, and only someone in possession of the private key can generate a valid signature. Any attempt to modify the assembly after signing it will invalidate the signature.</p>
<h4 id="version">Version</h4>
<p>All assembly names include a four-part version number: <code>major.minor.build.revision</code>. However, there's no particular significance to any of these.<br />
The binary format that IL uses for assembly names and references limits the range of these numbers, each part must fit in a 16-bit unsigned integer (a <code>ushort</code>), and the highest allowable value in a version part is actually one less than the maximum value that would fit, making the highest legal version number <code>65534.65534.65534.65534</code>.</p>
<p>As far as the CLR is concerned, there's really only one interesting thing you can do with a version number, which is to compare it with some other version number, either they match or one is higher than the other.</p>
<p>The build system tells the compiler which version number to use for the assembly name via an assembly-level attribute.</p>
<blockquote>
<p><strong>Note</strong>: NuGet packages also have version numbers, and these do not need to be connected in any way to assembly versions. NuGet does treat the components of a package version number as having particular significance: it has adopted the widely used <em>semantic versioning</em> rules.</p>
</blockquote>
<h4 id="culture">Culture</h4>
<p>All assembly names include a <strong>culture</strong> component.<br />
This is not optional, although the most common value for this is the default <code>neutral</code>, indicating that the assembly contains no culture-specific code or data.</p>
<p>The culture is usually set to something else only on assemblies that contain culture-specific resources. The culture of an assembly's name is designed to support localization of resources such as images and strings.</p>
<hr />
<h2 id="reflection">Reflection</h2>
<p>The CLR knows a great deal about the types the programs define and use. It requires all assemblies to provide detailed metadata, describing each member of every type, including private implementation details.<br />
It relies on this information to perform critical functions, such as JIT compilation and garbage collection. However, it does not keep this knowledge to itself.</p>
<p>The <strong>reflection API</strong> grants access to this detailed type information, so the code can discover everything that the runtime can see.</p>
<p>Reflection is particularly useful in extensible frameworks, because they can use it to adapt their behavior at runtime based on the structure of the code.</p>
<p>The reflection API defines various classes in the <code>System.Reflection</code> namespace. These classes have a structural relationship that mirrors the way that assemblies and the type system work.</p>
<h3 id="assembly">Assembly</h3>
<p>The <code>Assembly</code> class defines three context-sensitive static methods that each return an <code>Assembly</code>.<br />
The <code>GetEntryAssembly</code> method returns the object representing the EXE file containing the program's <code>Main</code> method.<br />
The <code>GetExecutingAssembly</code> method returns the assembly that contains the method from which it has been called it.<br />
<code>GetCallingAssembly</code> walks up the stack by one level, and returns the assembly containing the code that called the method that called <code>GetCallingAssembly</code>.</p>
<p>To inspect an assembly info use the <code>ReflectionOnlyLoadFrom</code> (or <code>ReflectionOnlyLoad</code>) method of the <code>Assembly</code> class.<br />
This loads the assembly in such a way that it's possible to inspect its type information, but no code in the assembly will execute, nor will any assemblies it depends on be loaded automatically.</p>
<hr />
<h2 id="attributes">Attributes</h2>
<p>In .NET, it's possible to <em>annotate</em> components, types, and their members with attributes.<br />
An attribute's purpose is to control or modify the behavior of a framework, a tool, the compiler, or the CLR.</p>
<p>Attributes are passive containers of information that do nothing on their own.</p>
<h3 id="applying-attributes">Applying Attributes</h3>
<p>To avoid having to introduce an extra set of concepts into the type system, .NET models attributes as instances of .NET types.<br />
To be used as an attribute, a type must derive from the <code>System.Attribute</code> class, but it can otherwise be entirely ordinary.</p>
<p>It's possible to pass arguments to the attribute <em>constructor</em> in the annotation.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-94-1">1</a></span>
<span class="normal"><a href="#__codelineno-94-2">2</a></span>
<span class="normal"><a href="#__codelineno-94-3">3</a></span>
<span class="normal"><a href="#__codelineno-94-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-94-1" name="__codelineno-94-1"></a><span class="na">[AttName]</span><span class="w"> </span><span class="c1">// simple attribute</span>
<a id="__codelineno-94-2" name="__codelineno-94-2"></a>
<a id="__codelineno-94-3" name="__codelineno-94-3"></a><span class="na">[AttName(value)]</span><span class="w"> </span><span class="c1">// valorize private fields (through the constructor)</span>
<a id="__codelineno-94-4" name="__codelineno-94-4"></a><span class="na">[AttrName(Name = value)]</span><span class="w"> </span><span class="c1">// valorize public properties or fields (no constructor needed)</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: The real name of an attribute ends with "Attribute" (<code>[AttrName]</code> refers to the <code>AttrNameAttribute</code> class)</p>
</blockquote>
<h3 id="multiple-attributes">Multiple Attributes</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-95-1">1</a></span>
<span class="normal"><a href="#__codelineno-95-2">2</a></span>
<span class="normal"><a href="#__codelineno-95-3">3</a></span>
<span class="normal"><a href="#__codelineno-95-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-95-1" name="__codelineno-95-1"></a><span class="na">[Attribute1]</span>
<a id="__codelineno-95-2" name="__codelineno-95-2"></a><span class="na">[Attribute2]</span>
<a id="__codelineno-95-3" name="__codelineno-95-3"></a>
<a id="__codelineno-95-4" name="__codelineno-95-4"></a><span class="na">[Attribute1, Attribute2]</span>
</code></pre></div></td></tr></table></div>
<h3 id="defining-custom-attribute-types">Defining Custom Attribute Types</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-96-1">1</a></span>
<span class="normal"><a href="#__codelineno-96-2">2</a></span>
<span class="normal"><a href="#__codelineno-96-3">3</a></span>
<span class="normal"><a href="#__codelineno-96-4">4</a></span>
<span class="normal"><a href="#__codelineno-96-5">5</a></span>
<span class="normal"><a href="#__codelineno-96-6">6</a></span>
<span class="normal"><a href="#__codelineno-96-7">7</a></span>
<span class="normal"><a href="#__codelineno-96-8">8</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-96-1" name="__codelineno-96-1"></a><span class="c1">// specify what the attribute can be applied to (enforced by c# compiler)</span>
<a id="__codelineno-96-2" name="__codelineno-96-2"></a><span class="na">[AttributeUsage(AttributeTargets.&lt;TargetType&gt;)]</span>
<a id="__codelineno-96-3" name="__codelineno-96-3"></a><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">CustomAttribute</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">Attribute</span>
<a id="__codelineno-96-4" name="__codelineno-96-4"></a><span class="p">{</span>
<a id="__codelineno-96-5" name="__codelineno-96-5"></a><span class="w"> </span><span class="c1">// properties to hold information</span>
<a id="__codelineno-96-6" name="__codelineno-96-6"></a>
<a id="__codelineno-96-7" name="__codelineno-96-7"></a><span class="w"> </span><span class="c1">// constructor (used to valorize private fields)</span>
<a id="__codelineno-96-8" name="__codelineno-96-8"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>NOTE</strong>: From C# 11 attributes can be generic and have type constraints</p>
</blockquote>
<h3 id="retrieving-attributes">Retrieving Attributes</h3>
<p>It's possible to discover which attributes have been applied through the reflection API.<br />
The various targets of attribute have a reflection type representing them (<code>MethodInfo</code>, <code>PropertyInfo</code>, ...) which all implement the interface <code>ICustomAttributeProvider</code>.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-97-1">1</a></span>
<span class="normal"><a href="#__codelineno-97-2">2</a></span>
<span class="normal"><a href="#__codelineno-97-3">3</a></span>
<span class="normal"><a href="#__codelineno-97-4">4</a></span>
<span class="normal"><a href="#__codelineno-97-5">5</a></span>
<span class="normal"><a href="#__codelineno-97-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-97-1" name="__codelineno-97-1"></a><span class="k">public</span><span class="w"> </span><span class="k">interface</span><span class="w"> </span><span class="n">ICustomAttributeProvider</span>
<a id="__codelineno-97-2" name="__codelineno-97-2"></a><span class="p">{</span>
<a id="__codelineno-97-3" name="__codelineno-97-3"></a><span class="w"> </span><span class="kt">object</span><span class="p">[]</span><span class="w"> </span><span class="nf">GetCustomAttributes</span><span class="p">(</span><span class="kt">bool</span><span class="w"> </span><span class="n">inherit</span><span class="p">);</span>
<a id="__codelineno-97-4" name="__codelineno-97-4"></a><span class="w"> </span><span class="kt">object</span><span class="p">[]</span><span class="w"> </span><span class="nf">GetCustomAttributes</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">attributeType</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">inherit</span><span class="p">);</span>
<a id="__codelineno-97-5" name="__codelineno-97-5"></a><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">IsDefined</span><span class="p">(</span><span class="n">Type</span><span class="w"> </span><span class="n">attribueType</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">inherit</span><span class="p">);</span>
<a id="__codelineno-97-6" name="__codelineno-97-6"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="files-streams">Files &amp; Streams</h2>
<p>A .NET <strong>stream</strong> is simply a <em>sequence of bytes</em>. That makes a stream a useful abstraction for many commonly encountered features such as a file on disk, or the body of an HTTP response.<br />
A console application uses streams to represent its input and output.</p>
<p>The <code>Stream</code> class is defined in the <code>System.IO</code> namespace.<br />
It is an abstract base class, with concrete derived types such as <code>FileStream</code> or <code>GZipStream</code> representing particular kinds of streams.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-98-1">1</a></span>
<span class="normal"><a href="#__codelineno-98-2">2</a></span>
<span class="normal"><a href="#__codelineno-98-3">3</a></span>
<span class="normal"><a href="#__codelineno-98-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-98-1" name="__codelineno-98-1"></a><span class="c1">// The most important members of Stream</span>
<a id="__codelineno-98-2" name="__codelineno-98-2"></a><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">Read</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span><span class="w"> </span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">offset</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">);</span>
<a id="__codelineno-98-3" name="__codelineno-98-3"></a><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Write</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span><span class="w"> </span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">offset</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">);</span>
<a id="__codelineno-98-4" name="__codelineno-98-4"></a><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">Position</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="k">set</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<p>Some streams are <em>read-only</em>. For example, if input stream for a console app represents the keyboard or the output of some other program, there's no meaningful way for the program to write to that stream.<br />
Some streams are <em>write-only</em>, such as the output stream of a console application.<br />
If <code>Read</code> is called on a write-only stream or <code>Write</code> on a read-only one, these methods throw a <code>NotSupportedException</code>.</p>
<p>Both <code>Read</code> and <code>Write</code> take a <code>byte[]</code> array as their first argument, and these methods copy data into or out of that array, respectively.<br />
The <code>offset</code> and <code>count</code> arguments that follow indicate the array element at which to start, and the number of bytes to read or write.<br />
There are no arguments to specify the <em>offset</em> within the stream at which to read or write. This is managed by the <code>Position</code> property.<br />
This starts at zero, but at each read or write, the position advances by the number of bytes processed.</p>
<p>The <code>Read</code> method returns an <code>int</code>. This tells how many bytes were read from the stream, the method <em>does not guarantee</em> to provide the amount of data requested.<br />
The reason <code>Read</code> is slightly tricky is that some streams are live, representing a source of information that produces data gradually as the program runs.</p>
<blockquote>
<p><strong>Note</strong>: If asked for more than one byte at a time, a <code>Stream</code> is always free to return less data than requested from Read for any reason. Never presume that a call to <code>Read</code> returned as much data as it could.</p>
</blockquote>
<h3 id="position-seeking">Position &amp; Seeking</h3>
<p>Streams automatically update their current position each time a read or write operation is completed. The <code>Position</code> property can be set to move to the desired location.<br />
This is not guaranteed to work because it's not always possible to support it. Some streams will throw <code>NotSupportedException</code> when trying to set the <code>Position</code> property.</p>
<p>Stream also defines a Seek method, this allows to specify the position required relative to the stream's current position.<br />
Passing <code>SeekOrigin.Current</code> as second argument will set the position by adding the first argument to the current position.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-99-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-99-1" name="__codelineno-99-1"></a><span class="k">public</span><span class="w"> </span><span class="k">abstract</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="nf">Seek</span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="n">offset</span><span class="p">,</span><span class="w"> </span><span class="n">SeekOrigin</span><span class="w"> </span><span class="n">origin</span><span class="p">);</span><span class="w"> </span><span class="c1">// offset can be negative</span>
</code></pre></div></td></tr></table></div>
<h3 id="flushing">Flushing</h3>
<p>Writing data to a Stream does not necessarily cause the data to reach its destination immediately.<br />
When a call to <code>Write</code> returns, all that is known is that it has copied the data <em>somewhere</em>; but that might be a buffer in memory, not the final target.</p>
<p>The Stream class therefore offers a <code>Flush</code> method. This tells the stream that it has to do whatever work is required to ensure that any buffered data is written to its target, even if that means making suboptimal use of the buffer.</p>
<p>A stream automatically flushes its contents when calling <code>Dispose</code>. Flush only when it's needed to keep a stream open after writing out buffered data.<br />
It is particularly important if there will be extended periods during which the stream is open but inactive.</p>
<blockquote>
<p><strong>Note</strong>: When using a <code>FileStream</code>, the <code>Flush</code> method does not necessarily guarantee that the data being flushed has made it to disk yet. It merely makes the stream pass the data to the OS.<br />
Before calling <code>Flush</code>, the OS hasn't even seen the data, so if the process terminates suddenly, the data would be lost.<br />
After <code>Flush</code> has returned, the OS has everything the code has written, so the process could be terminated without loss of data.<br />
However, the OS may perform additional buffering of its own, so if the power fails before the OS gets around to writing everything to disk, the data will still be lost.</p>
</blockquote>
<p>To guarantee that data has been written persistently (rather than merely ensuring that it has been handed it to the OS), use either the <code>WriteThrough</code> flag, or call the <code>Flush</code> overload that takes a bool, passing <code>true</code> to force flushing to disk.</p>
<h3 id="streamreader-streamwriter-text-files"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.streamreader">StreamReader</a> &amp; <a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.streamwriter">StreamWriter</a> (Text Files)</h3>
<p>The most useful concrete text-oriented streams types are <code>StreamReader</code> and <code>StreamWriter</code>, which wrap a <code>Stream</code> object.<br />
It's possible to constructing them by passing a <code>Stream</code> as a constructor argument, or a string containing the path of a file, in which case they will automatically construct a <code>FileStream</code> and then wrap that.</p>
<p><a href="https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding">Encoding</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-100-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-100-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-100-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-100-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-100-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-100-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-100-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-100-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-100-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-100-10">10</a></span>
<span class="normal"><a href="#__codelineno-100-11">11</a></span>
<span class="normal"><a href="#__codelineno-100-12">12</a></span>
<span class="normal"><a href="#__codelineno-100-13">13</a></span>
<span class="normal"><a href="#__codelineno-100-14">14</a></span>
<span class="normal"><a href="#__codelineno-100-15">15</a></span>
<span class="normal"><a href="#__codelineno-100-16">16</a></span>
<span class="normal"><a href="#__codelineno-100-17">17</a></span>
<span class="normal"><a href="#__codelineno-100-18">18</a></span>
<span class="normal"><a href="#__codelineno-100-19">19</a></span>
<span class="normal"><a href="#__codelineno-100-20">20</a></span>
<span class="normal"><a href="#__codelineno-100-21">21</a></span>
<span class="normal"><a href="#__codelineno-100-22">22</a></span>
<span class="normal"><a href="#__codelineno-100-23">23</a></span>
<span class="normal"><a href="#__codelineno-100-24">24</a></span>
<span class="normal"><a href="#__codelineno-100-25">25</a></span>
<span class="normal"><a href="#__codelineno-100-26">26</a></span>
<span class="normal"><a href="#__codelineno-100-27">27</a></span>
<span class="normal"><a href="#__codelineno-100-28">28</a></span>
<span class="normal"><a href="#__codelineno-100-29">29</a></span>
<span class="normal"><a href="#__codelineno-100-30">30</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-100-1" name="__codelineno-100-1"></a><span class="c1">// Will detect encoding from stream contents</span>
<a id="__codelineno-100-2" name="__codelineno-100-2"></a><span class="n">StreamReader</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamReader</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span>
<a id="__codelineno-100-3" name="__codelineno-100-3"></a><span class="n">StreamReader</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamReader</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">Text</span><span class="p">.</span><span class="n">Encoding</span><span class="w"> </span><span class="n">encoding</span><span class="p">);</span><span class="w"> </span><span class="c1">// encoding is System.Text.Encoding</span>
<a id="__codelineno-100-4" name="__codelineno-100-4"></a>
<a id="__codelineno-100-5" name="__codelineno-100-5"></a><span class="c1">// Default Encoding: UTF-8 w/o BOM (Byte Order Mark)</span>
<a id="__codelineno-100-6" name="__codelineno-100-6"></a><span class="n">StreamWriter</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamWriter</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span>
<a id="__codelineno-100-7" name="__codelineno-100-7"></a><span class="n">StreamWriter</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamWriter</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">boolean</span><span class="p">);</span><span class="w"> </span><span class="c1">// true to append data to the file; false to overwrite the file.</span>
<a id="__codelineno-100-8" name="__codelineno-100-8"></a><span class="n">StreamReader</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamReader</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">Text</span><span class="p">.</span><span class="n">Encoding</span><span class="w"> </span><span class="n">encoding</span><span class="p">);</span><span class="w"> </span><span class="c1">// encoding is System.Text.Encoding</span>
<a id="__codelineno-100-9" name="__codelineno-100-9"></a><span class="n">StreamReader</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamReader</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">append</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">Text</span><span class="p">.</span><span class="n">Encoding</span><span class="w"> </span><span class="n">encoding</span><span class="p">);</span><span class="w"> </span><span class="c1">// encoding is System.Text.Encoding</span>
<a id="__codelineno-100-10" name="__codelineno-100-10"></a>
<a id="__codelineno-100-11" name="__codelineno-100-11"></a><span class="c1">// USAGE</span>
<a id="__codelineno-100-12" name="__codelineno-100-12"></a><span class="k">try</span>
<a id="__codelineno-100-13" name="__codelineno-100-13"></a><span class="p">{</span>
<a id="__codelineno-100-14" name="__codelineno-100-14"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="p">(</span><span class="n">StreamReader</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamReader</span><span class="p">(</span><span class="n">path</span><span class="p">))</span><span class="w"> </span><span class="c1">// stream to read</span>
<a id="__codelineno-100-15" name="__codelineno-100-15"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-100-16" name="__codelineno-100-16"></a><span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">file</span><span class="p">.</span><span class="n">EndOfStream</span><span class="p">)</span><span class="w"> </span><span class="c1">// keep reading until the end op file</span>
<a id="__codelineno-100-17" name="__codelineno-100-17"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-100-18" name="__codelineno-100-18"></a><span class="w"> </span><span class="n">file</span><span class="p">.</span><span class="n">ReadLine</span><span class="p">();</span><span class="w"> </span><span class="c1">// read a whole line from the file</span>
<a id="__codelineno-100-19" name="__codelineno-100-19"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-100-20" name="__codelineno-100-20"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-100-21" name="__codelineno-100-21"></a>
<a id="__codelineno-100-22" name="__codelineno-100-22"></a><span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="p">(</span><span class="n">StreamWriter</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">StreamWriter</span><span class="p">(</span><span class="n">path</span><span class="p">))</span><span class="w"> </span><span class="c1">// stream to write</span>
<a id="__codelineno-100-23" name="__codelineno-100-23"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-100-24" name="__codelineno-100-24"></a><span class="w"> </span><span class="n">file</span><span class="p">.</span><span class="n">write</span><span class="p">();</span><span class="w"> </span><span class="c1">// write to file</span>
<a id="__codelineno-100-25" name="__codelineno-100-25"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-100-26" name="__codelineno-100-26"></a><span class="p">}</span>
<a id="__codelineno-100-27" name="__codelineno-100-27"></a><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span>
<a id="__codelineno-100-28" name="__codelineno-100-28"></a><span class="p">{</span>
<a id="__codelineno-100-29" name="__codelineno-100-29"></a><span class="w"> </span><span class="c1">// handle exception</span>
<a id="__codelineno-100-30" name="__codelineno-100-30"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="stringreader-stringwriter">StringReader &amp; StringWriter</h3>
<p>The <code>StringReader</code> and <code>StringWriter</code> classes serve a similar purpose to <code>MemoryStream</code>: they are useful when working with an API that requires either a <code>TextReader</code> or <code>TextWriter</code> (abstract text streams), but you want to work entirely in memory.<br />
Whereas <code>MemoryStream</code> presents a Stream API on top of a <code>byte[]</code> array, <code>StringReader</code> wraps a string as a <code>TextReader</code>, while <code>StringWriter</code> presents a <code>TextWriter</code> API on top of a <code>StringBuilder</code>.</p>
<h2 id="files-directories">Files &amp; Directories</h2>
<h3 id="filestream-class-binary-files"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream">FileStream</a> Class (Binary Files)</h3>
<p>The <code>FileStream</code> class derives from <code>Stream</code> and represents a file from the filesystem.</p>
<p>It' common to use the constructors in which the <code>FileStream</code> uses OS APIs to create the file handle. It's possible to provide varying levels of detail on how this si to be done.<br />
At a minimum the file's path and a value from the <code>FileMode</code> enumeration must be provided.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-101-1">1</a></span>
<span class="normal"><a href="#__codelineno-101-2">2</a></span>
<span class="normal"><a href="#__codelineno-101-3">3</a></span>
<span class="normal"><a href="#__codelineno-101-4">4</a></span>
<span class="normal"><a href="#__codelineno-101-5">5</a></span>
<span class="normal"><a href="#__codelineno-101-6">6</a></span>
<span class="normal"><a href="#__codelineno-101-7">7</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-101-1" name="__codelineno-101-1"></a><span class="c1">// overloaded FileStream Constructors</span>
<a id="__codelineno-101-2" name="__codelineno-101-2"></a><span class="k">public</span><span class="w"> </span><span class="nf">FileStream</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">);</span>
<a id="__codelineno-101-3" name="__codelineno-101-3"></a><span class="k">public</span><span class="w"> </span><span class="nf">FileStream</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">);</span>
<a id="__codelineno-101-4" name="__codelineno-101-4"></a><span class="k">public</span><span class="w"> </span><span class="nf">FileStream</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">,</span><span class="w"> </span><span class="n">FileShare</span><span class="w"> </span><span class="n">share</span><span class="p">);</span>
<a id="__codelineno-101-5" name="__codelineno-101-5"></a><span class="k">public</span><span class="w"> </span><span class="nf">FileStream</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">,</span><span class="w"> </span><span class="n">FileShare</span><span class="w"> </span><span class="n">share</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">bufferSize</span><span class="p">);</span>
<a id="__codelineno-101-6" name="__codelineno-101-6"></a><span class="k">public</span><span class="w"> </span><span class="nf">FileStream</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">,</span><span class="w"> </span><span class="n">FileShare</span><span class="w"> </span><span class="n">share</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">bufferSize</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">useAsync</span><span class="p">);</span>
<a id="__codelineno-101-7" name="__codelineno-101-7"></a><span class="k">public</span><span class="w"> </span><span class="nf">FileStream</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">,</span><span class="w"> </span><span class="n">FileShare</span><span class="w"> </span><span class="n">share</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">bufferSize</span><span class="p">,</span><span class="w"> </span><span class="n">FileOptions</span><span class="w"> </span><span class="n">options</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<table>
<thead>
<tr>
<th><code>FileMode</code></th>
<th>Behavior if file exists</th>
<th>Behavior if file does not exist</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CreateNew</code></td>
<td>Throws <code>IOException</code></td>
<td>Creates new file</td>
</tr>
<tr>
<td><code>Create</code></td>
<td>Replaces existing file</td>
<td>Creates new file</td>
</tr>
<tr>
<td><code>Open</code></td>
<td>Opens existing file</td>
<td>Throws <code>FileNotFoundException</code></td>
</tr>
<tr>
<td><code>OpenOrCreate</code></td>
<td>Opens existing file</td>
<td>Creates new file</td>
</tr>
<tr>
<td><code>Truncate</code></td>
<td>Replaces existing file</td>
<td>Throws <code>FileNotFoundException</code></td>
</tr>
<tr>
<td><code>Append</code></td>
<td>Opens existing file, setting Position to end of file</td>
<td>Creates new file</td>
</tr>
</tbody>
</table>
<p><strong><code>FileAccess</code> Enumeration</strong>:</p>
<ul>
<li><code>Read</code>: Read access to the file. Data can be read from the file. Combine with Write for read/write access.</li>
<li><code>Write</code>: Write access to the file. Data can be written to the file. Combine with Read for read/write access.</li>
<li><code>ReadWrite</code>: Read and write access to the file. Data can be written to and read from the file.</li>
</ul>
<p><strong><code>FileShare</code> Enumeration</strong>:</p>
<ul>
<li><code>Delete</code>: Allows subsequent deleting of a file.</li>
<li><code>None</code>: Declines sharing of the current file. Any request to open the file (by this process or another process) will fail until the file is closed.</li>
<li><code>Read</code>: Allows subsequent opening of the file for reading. If this flag is not specified, any request to open the file for reading (by this process or another process) will fail until the file is closed. However, even if this flag is specified, additional permissions might still be needed to access the file.</li>
<li><code>ReadWrite</code>: Allows subsequent opening of the file for reading or writing. If this flag is not specified, any request to open the file for reading or writing (by this process or another process) will fail until the file is closed. However, even if this flag is specified, additional permissions might still be needed to access the file.</li>
<li><code>Write</code>: Allows subsequent opening of the file for writing. If this flag is not specified, any request to open the file for writing (by this process or another process) will fail until the file is closed. However, even if this flag is specified, additional permissions might still be needed to access the file.</li>
</ul>
<p><strong><code>FileOptions</code> Enumeration</strong>:</p>
<ul>
<li><code>WriteThrough</code>: Disables OS write buffering so data goes straight to disk when you flush the stream.</li>
<li><code>AsynchronousSpecifies</code>: the use of asynchronous I/O.</li>
<li><code>RandomAccessHints</code>: to filesystem cache that you will be seeking, not reading or writing data in order.</li>
<li><code>SequentialScanHints</code>: to filesystem cache that you will be reading or writing data in order.</li>
<li><code>DeleteOnCloseTells</code>: <code>FileStream</code> to delete the file when you call <code>Dispose</code>.</li>
<li><code>EncryptedEncrypts</code>: the file so that its contents cannot be read by other users.</li>
</ul>
<blockquote>
<p><strong>Note</strong>: The <code>WriteThrough</code> flag will ensure that when the stream is disposed or flushed, all the data written will have been delivered to the drive, but the drive will not necessarily have written that data persistently (drives can defer writing for performance), so data loss id still possible if the power fails.</p>
</blockquote>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-102-1">1</a></span>
<span class="normal"><a href="#__codelineno-102-2">2</a></span>
<span class="normal"><a href="#__codelineno-102-3">3</a></span>
<span class="normal"><a href="#__codelineno-102-4">4</a></span>
<span class="normal"><a href="#__codelineno-102-5">5</a></span>
<span class="normal"><a href="#__codelineno-102-6">6</a></span>
<span class="normal"><a href="#__codelineno-102-7">7</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-102-1" name="__codelineno-102-1"></a><span class="c1">// object to read or write to a file (file can be binary)</span>
<a id="__codelineno-102-2" name="__codelineno-102-2"></a><span class="p">{</span>
<a id="__codelineno-102-3" name="__codelineno-102-3"></a><span class="w"> </span><span class="n">using</span><span class="p">(</span><span class="n">FileStream</span><span class="w"> </span><span class="n">fstream</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">FileStream</span><span class="p">(</span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">FileMode</span><span class="p">.</span><span class="n">OpenOrCreate</span><span class="p">,</span><span class="w"> </span><span class="n">FileAccess</span><span class="p">.</span><span class="n">ReadWrite</span><span class="p">))</span>
<a id="__codelineno-102-4" name="__codelineno-102-4"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-102-5" name="__codelineno-102-5"></a><span class="w"> </span><span class="c1">// operations on file stream</span>
<a id="__codelineno-102-6" name="__codelineno-102-6"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-102-7" name="__codelineno-102-7"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="file-class"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.file">File</a> Class</h3>
<p>The static <code>File</code> class provides methods for performing various operations on files.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-103-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-103-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-103-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-103-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-103-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-103-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-103-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-103-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-103-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-103-10">10</a></span>
<span class="normal"><a href="#__codelineno-103-11">11</a></span>
<span class="normal"><a href="#__codelineno-103-12">12</a></span>
<span class="normal"><a href="#__codelineno-103-13">13</a></span>
<span class="normal"><a href="#__codelineno-103-14">14</a></span>
<span class="normal"><a href="#__codelineno-103-15">15</a></span>
<span class="normal"><a href="#__codelineno-103-16">16</a></span>
<span class="normal"><a href="#__codelineno-103-17">17</a></span>
<span class="normal"><a href="#__codelineno-103-18">18</a></span>
<span class="normal"><a href="#__codelineno-103-19">19</a></span>
<span class="normal"><a href="#__codelineno-103-20">20</a></span>
<span class="normal"><a href="#__codelineno-103-21">21</a></span>
<span class="normal"><a href="#__codelineno-103-22">22</a></span>
<span class="normal"><a href="#__codelineno-103-23">23</a></span>
<span class="normal"><a href="#__codelineno-103-24">24</a></span>
<span class="normal"><a href="#__codelineno-103-25">25</a></span>
<span class="normal"><a href="#__codelineno-103-26">26</a></span>
<span class="normal"><a href="#__codelineno-103-27">27</a></span>
<span class="normal"><a href="#__codelineno-103-28">28</a></span>
<span class="normal"><a href="#__codelineno-103-29">29</a></span>
<span class="normal"><a href="#__codelineno-103-30">30</a></span>
<span class="normal"><a href="#__codelineno-103-31">31</a></span>
<span class="normal"><a href="#__codelineno-103-32">32</a></span>
<span class="normal"><a href="#__codelineno-103-33">33</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-103-1" name="__codelineno-103-1"></a><span class="n">File</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Return Read/Write FileStream to file</span>
<a id="__codelineno-103-2" name="__codelineno-103-2"></a><span class="n">File</span><span class="p">.</span><span class="n">Open</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">);</span><span class="w"> </span><span class="c1">// Open a FileStream on the specified path with read/write access with no sharing.</span>
<a id="__codelineno-103-3" name="__codelineno-103-3"></a><span class="n">File</span><span class="p">.</span><span class="n">Open</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">);</span><span class="w"> </span><span class="c1">// Opens a FileStream on the specified path, with the specified mode and access with no sharing.</span>
<a id="__codelineno-103-4" name="__codelineno-103-4"></a><span class="n">File</span><span class="p">.</span><span class="n">Open</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">FileMode</span><span class="w"> </span><span class="n">mode</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">FileAccess</span><span class="w"> </span><span class="n">access</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">FileShare</span><span class="w"> </span><span class="n">share</span><span class="p">);</span>
<a id="__codelineno-103-5" name="__codelineno-103-5"></a><span class="n">File</span><span class="p">.</span><span class="n">OpenRead</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Open an existing file for reading, returns a FileStream</span>
<a id="__codelineno-103-6" name="__codelineno-103-6"></a><span class="n">File</span><span class="p">.</span><span class="n">OpenText</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Open an existing UTF-8 encoded text file for reading, returns a StreamReader</span>
<a id="__codelineno-103-7" name="__codelineno-103-7"></a><span class="n">File</span><span class="p">.</span><span class="n">OpenWrite</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Open an existing file for writing, returns a FileStream</span>
<a id="__codelineno-103-8" name="__codelineno-103-8"></a>
<a id="__codelineno-103-9" name="__codelineno-103-9"></a><span class="n">File</span><span class="p">.</span><span class="n">Delete</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Delete the specified file</span>
<a id="__codelineno-103-10" name="__codelineno-103-10"></a><span class="n">File</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">sourceFileName</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">destFileName</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">overwrite</span><span class="p">);</span><span class="w"> </span><span class="c1">// Move specified file to a new location (can specify a new filename and to overwrite the destination file if it already exists)</span>
<a id="__codelineno-103-11" name="__codelineno-103-11"></a><span class="n">File</span><span class="p">.</span><span class="n">Exists</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Whether the specified file exists.</span>
<a id="__codelineno-103-12" name="__codelineno-103-12"></a>
<a id="__codelineno-103-13" name="__codelineno-103-13"></a><span class="n">File</span><span class="p">.</span><span class="n">GetCreationTime</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Return DateTime set to the creation date and time for the specified file</span>
<a id="__codelineno-103-14" name="__codelineno-103-14"></a><span class="n">File</span><span class="p">.</span><span class="n">GetLastAccessTime</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Return DateTime set to the date and time that the specified file was last accessed</span>
<a id="__codelineno-103-15" name="__codelineno-103-15"></a><span class="n">File</span><span class="p">.</span><span class="n">GetLastWriteTime</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Return DateTime set to the date and time that the specified file was last written to</span>
<a id="__codelineno-103-16" name="__codelineno-103-16"></a><span class="n">File</span><span class="p">.</span><span class="n">GetAttributes</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Return FileAttributes of the file</span>
<a id="__codelineno-103-17" name="__codelineno-103-17"></a>
<a id="__codelineno-103-18" name="__codelineno-103-18"></a><span class="n">File</span><span class="p">.</span><span class="n">Encrypt</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Encrypt a file so that only the account used to encrypt the file can decrypt it.</span>
<a id="__codelineno-103-19" name="__codelineno-103-19"></a><span class="n">File</span><span class="p">.</span><span class="n">Decrypt</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Decrypt a file that was encrypted by the current account using the Encrypt() method.</span>
<a id="__codelineno-103-20" name="__codelineno-103-20"></a>
<a id="__codelineno-103-21" name="__codelineno-103-21"></a><span class="n">File</span><span class="p">.</span><span class="n">ReadAllText</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Return a string containing all the text in the file</span>
<a id="__codelineno-103-22" name="__codelineno-103-22"></a><span class="n">File</span><span class="p">.</span><span class="n">ReadAllLines</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Returns a string[] containing all lines of the file</span>
<a id="__codelineno-103-23" name="__codelineno-103-23"></a><span class="n">File</span><span class="p">.</span><span class="n">ReadLines</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Returns IEnumerable&lt;string&gt; containing all the text in the file</span>
<a id="__codelineno-103-24" name="__codelineno-103-24"></a><span class="n">File</span><span class="p">.</span><span class="n">ReadAllBytes</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Returns a byte[] containing the contents of the file.</span>
<a id="__codelineno-103-25" name="__codelineno-103-25"></a>
<a id="__codelineno-103-26" name="__codelineno-103-26"></a><span class="n">File</span><span class="p">.</span><span class="n">WriteAllLines</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">IEnumerable</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">contents</span><span class="p">);</span><span class="w"> </span><span class="c1">// writes a collection of strings to the file</span>
<a id="__codelineno-103-27" name="__codelineno-103-27"></a><span class="n">File</span><span class="p">.</span><span class="n">WriteAllLines</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="p">[]</span><span class="w"> </span><span class="n">contents</span><span class="p">);</span><span class="w"> </span><span class="c1">// writes a collection of strings to the file</span>
<a id="__codelineno-103-28" name="__codelineno-103-28"></a>
<a id="__codelineno-103-29" name="__codelineno-103-29"></a><span class="n">File</span><span class="p">.</span><span class="n">AppendAllText</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">contents</span><span class="p">);</span><span class="w"> </span><span class="c1">// appends the specified string to the file</span>
<a id="__codelineno-103-30" name="__codelineno-103-30"></a><span class="n">File</span><span class="p">.</span><span class="n">AppendAllLines</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">IEnumerable</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">contents</span><span class="p">);</span><span class="w"> </span><span class="c1">// appends a collection of strings to the file</span>
<a id="__codelineno-103-31" name="__codelineno-103-31"></a>
<a id="__codelineno-103-32" name="__codelineno-103-32"></a><span class="c1">// Replace the contents of a specified file with the contents of another file, deleting the original file, and creating a backup of the replaced file.</span>
<a id="__codelineno-103-33" name="__codelineno-103-33"></a><span class="n">File</span><span class="p">.</span><span class="n">Replace</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">sourceFileName</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">destinationFileName</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">destinationBackupFileName</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="directory-class"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.directory">Directory</a> Class</h3>
<p>Exposes static methods for creating, moving, and enumerating through directories and subdirectories.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-104-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-104-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-104-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-104-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-104-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-104-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-104-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-104-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-104-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-104-10">10</a></span>
<span class="normal"><a href="#__codelineno-104-11">11</a></span>
<span class="normal"><a href="#__codelineno-104-12">12</a></span>
<span class="normal"><a href="#__codelineno-104-13">13</a></span>
<span class="normal"><a href="#__codelineno-104-14">14</a></span>
<span class="normal"><a href="#__codelineno-104-15">15</a></span>
<span class="normal"><a href="#__codelineno-104-16">16</a></span>
<span class="normal"><a href="#__codelineno-104-17">17</a></span>
<span class="normal"><a href="#__codelineno-104-18">18</a></span>
<span class="normal"><a href="#__codelineno-104-19">19</a></span>
<span class="normal"><a href="#__codelineno-104-20">20</a></span>
<span class="normal"><a href="#__codelineno-104-21">21</a></span>
<span class="normal"><a href="#__codelineno-104-22">22</a></span>
<span class="normal"><a href="#__codelineno-104-23">23</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-104-1" name="__codelineno-104-1"></a><span class="n">Directory</span><span class="p">.</span><span class="n">CreateDirectory</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Create directory as specified</span>
<a id="__codelineno-104-2" name="__codelineno-104-2"></a><span class="n">Directory</span><span class="p">.</span><span class="n">Delete</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Delete an empty directory from a specified path (dir must be writable)</span>
<a id="__codelineno-104-3" name="__codelineno-104-3"></a><span class="n">Directory</span><span class="p">.</span><span class="n">Delete</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">recursive</span><span class="p">);</span><span class="w"> </span><span class="c1">// Delete the specified directory and, if indicated, any subdirectories and files in the directory</span>
<a id="__codelineno-104-4" name="__codelineno-104-4"></a><span class="n">Directory</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">sourceDirName</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">destDirName</span><span class="p">);</span><span class="w"> </span><span class="c1">// Move a file or a directory and its contents to a new location</span>
<a id="__codelineno-104-5" name="__codelineno-104-5"></a><span class="n">Directory</span><span class="p">.</span><span class="n">Exists</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Whether the given path refers to an existing directory on disk</span>
<a id="__codelineno-104-6" name="__codelineno-104-6"></a>
<a id="__codelineno-104-7" name="__codelineno-104-7"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetLogicalDrives</span><span class="p">();</span><span class="w"> </span><span class="c1">// string[] of names of the logical drives on the computer in the form &quot;&lt;drive letter&gt;:\&quot;</span>
<a id="__codelineno-104-8" name="__codelineno-104-8"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetParent</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// DirectoryInfo of parent directory of the specified path, including both absolute and relative paths</span>
<a id="__codelineno-104-9" name="__codelineno-104-9"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetCurrentDirectory</span><span class="p">();</span><span class="w"> </span><span class="c1">// string of current working directory of the application</span>
<a id="__codelineno-104-10" name="__codelineno-104-10"></a><span class="n">Directory</span><span class="p">.</span><span class="n">SetCurrentDirectory</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Set the application&#39;s current working directory to the specified directory</span>
<a id="__codelineno-104-11" name="__codelineno-104-11"></a>
<a id="__codelineno-104-12" name="__codelineno-104-12"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetCreationTime</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// DateTime set to the creation date and time for the specified directory</span>
<a id="__codelineno-104-13" name="__codelineno-104-13"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetLastAccessTime</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// DateTime set to the date and time the specified file or directory was last accessed</span>
<a id="__codelineno-104-14" name="__codelineno-104-14"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetLastWriteTime</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// DateTime set to the date and time the specified file or directory was last written to</span>
<a id="__codelineno-104-15" name="__codelineno-104-15"></a>
<a id="__codelineno-104-16" name="__codelineno-104-16"></a><span class="n">Directory</span><span class="p">.</span><span class="n">EnumerateDirectories</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">searchPattern</span><span class="p">,</span><span class="w"> </span><span class="n">SearchOption</span><span class="w"> </span><span class="n">searchOption</span><span class="p">);</span><span class="w"> </span><span class="c1">// IEnumerable&lt;string&gt; of directory full names that match a search pattern in a specified path</span>
<a id="__codelineno-104-17" name="__codelineno-104-17"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetDirectories</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">searchPattern</span><span class="p">,</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="n">IO</span><span class="p">.</span><span class="n">SearchOption</span><span class="w"> </span><span class="n">searchOption</span><span class="p">);</span><span class="w"> </span><span class="c1">// string[] of directory full names that match a search pattern in a specified path</span>
<a id="__codelineno-104-18" name="__codelineno-104-18"></a>
<a id="__codelineno-104-19" name="__codelineno-104-19"></a><span class="n">Directory</span><span class="p">.</span><span class="n">EnumerateFiles</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">searchPattern</span><span class="p">,</span><span class="w"> </span><span class="n">SearchOption</span><span class="w"> </span><span class="n">searchOption</span><span class="p">);</span><span class="w"> </span><span class="c1">// IEnumerable&lt;string&gt; of full file names that match a search pattern in a specified path</span>
<a id="__codelineno-104-20" name="__codelineno-104-20"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetFiles</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">searchPattern</span><span class="p">,</span><span class="w"> </span><span class="n">SearchOption</span><span class="w"> </span><span class="n">searchOption</span><span class="p">);</span><span class="w"> </span><span class="c1">// string[] of full file names that match a search pattern in a specified path</span>
<a id="__codelineno-104-21" name="__codelineno-104-21"></a>
<a id="__codelineno-104-22" name="__codelineno-104-22"></a><span class="n">Directory</span><span class="p">.</span><span class="n">EnumerateFileSystemEntries</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">searchPattern</span><span class="p">,</span><span class="w"> </span><span class="n">SearchOption</span><span class="w"> </span><span class="n">searchOption</span><span class="p">);</span><span class="w"> </span><span class="c1">// IEnumerable&lt;string&gt; array of file names and directory names that match a search pattern in a specified path</span>
<a id="__codelineno-104-23" name="__codelineno-104-23"></a><span class="n">Directory</span><span class="p">.</span><span class="n">GetFileSystemEntries</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">searchPattern</span><span class="p">,</span><span class="w"> </span><span class="n">SearchOption</span><span class="w"> </span><span class="n">searchOption</span><span class="p">);</span><span class="w"> </span><span class="c1">// string[] array of file names and directory names that match a search pattern in a specified path</span>
</code></pre></div></td></tr></table></div>
<h3 id="path-class"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.path">Path</a> Class</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-105-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-105-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-105-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-105-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-105-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-105-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-105-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-105-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-105-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-105-10">10</a></span>
<span class="normal"><a href="#__codelineno-105-11">11</a></span>
<span class="normal"><a href="#__codelineno-105-12">12</a></span>
<span class="normal"><a href="#__codelineno-105-13">13</a></span>
<span class="normal"><a href="#__codelineno-105-14">14</a></span>
<span class="normal"><a href="#__codelineno-105-15">15</a></span>
<span class="normal"><a href="#__codelineno-105-16">16</a></span>
<span class="normal"><a href="#__codelineno-105-17">17</a></span>
<span class="normal"><a href="#__codelineno-105-18">18</a></span>
<span class="normal"><a href="#__codelineno-105-19">19</a></span>
<span class="normal"><a href="#__codelineno-105-20">20</a></span>
<span class="normal"><a href="#__codelineno-105-21">21</a></span>
<span class="normal"><a href="#__codelineno-105-22">22</a></span>
<span class="normal"><a href="#__codelineno-105-23">23</a></span>
<span class="normal"><a href="#__codelineno-105-24">24</a></span>
<span class="normal"><a href="#__codelineno-105-25">25</a></span>
<span class="normal"><a href="#__codelineno-105-26">26</a></span>
<span class="normal"><a href="#__codelineno-105-27">27</a></span>
<span class="normal"><a href="#__codelineno-105-28">28</a></span>
<span class="normal"><a href="#__codelineno-105-29">29</a></span>
<span class="normal"><a href="#__codelineno-105-30">30</a></span>
<span class="normal"><a href="#__codelineno-105-31">31</a></span>
<span class="normal"><a href="#__codelineno-105-32">32</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-105-1" name="__codelineno-105-1"></a><span class="n">Combine</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path1</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">path2</span><span class="p">);</span><span class="w"> </span><span class="c1">// Combine two strings into a path</span>
<a id="__codelineno-105-2" name="__codelineno-105-2"></a><span class="n">Combine</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span><span class="w"> </span><span class="n">paths</span><span class="p">);</span><span class="w"> </span><span class="c1">// Combine strings into a path</span>
<a id="__codelineno-105-3" name="__codelineno-105-3"></a>
<a id="__codelineno-105-4" name="__codelineno-105-4"></a><span class="n">GetFullPath</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// absolute path for the specified path string</span>
<a id="__codelineno-105-5" name="__codelineno-105-5"></a><span class="n">GetFullPath</span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">basePath</span><span class="p">);</span><span class="w"> </span><span class="c1">// absolute path from a relative path and a fully qualified base path</span>
<a id="__codelineno-105-6" name="__codelineno-105-6"></a><span class="n">GetRelativePath</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">relativeTo</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// relative path from one path to another</span>
<a id="__codelineno-105-7" name="__codelineno-105-7"></a><span class="n">GetPathRoot</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Get the root directory information from the path contained in the specified string</span>
<a id="__codelineno-105-8" name="__codelineno-105-8"></a><span class="n">GetDirectoryName</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// directory information for the specified path string</span>
<a id="__codelineno-105-9" name="__codelineno-105-9"></a>
<a id="__codelineno-105-10" name="__codelineno-105-10"></a><span class="n">GetExtension</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// extension (including the period &quot;.&quot;) of the specified path string</span>
<a id="__codelineno-105-11" name="__codelineno-105-11"></a><span class="n">GetFileName</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// file name and extension of the specified path string</span>
<a id="__codelineno-105-12" name="__codelineno-105-12"></a><span class="n">GetFileNameWithoutExtension</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// file name of the specified path string without the extension</span>
<a id="__codelineno-105-13" name="__codelineno-105-13"></a>
<a id="__codelineno-105-14" name="__codelineno-105-14"></a><span class="n">HasExtension</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// whether a path includes a file name extension</span>
<a id="__codelineno-105-15" name="__codelineno-105-15"></a><span class="n">IsPathFullyQualified</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// whether the specified file path is fixed to a specific drive or UNC path</span>
<a id="__codelineno-105-16" name="__codelineno-105-16"></a><span class="n">IsPathRooted</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// whether the specified path string contains a root</span>
<a id="__codelineno-105-17" name="__codelineno-105-17"></a>
<a id="__codelineno-105-18" name="__codelineno-105-18"></a><span class="n">EndsInDirectorySeparator</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// true if the path ends in a directory separator; otherwise, false</span>
<a id="__codelineno-105-19" name="__codelineno-105-19"></a><span class="n">TrimEndingDirectorySeparator</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="p">);</span><span class="w"> </span><span class="c1">// Trim one trailing directory separator beyond the root of the specified path</span>
<a id="__codelineno-105-20" name="__codelineno-105-20"></a>
<a id="__codelineno-105-21" name="__codelineno-105-21"></a><span class="n">GetInvalidFileNameChar</span><span class="p">();</span><span class="w"> </span><span class="c1">// char[] containing the characters that are not allowed in file names</span>
<a id="__codelineno-105-22" name="__codelineno-105-22"></a><span class="n">GetInvalidPathChars</span><span class="p">();</span><span class="w"> </span><span class="c1">// char[] containing the characters that are not allowed in path names</span>
<a id="__codelineno-105-23" name="__codelineno-105-23"></a>
<a id="__codelineno-105-24" name="__codelineno-105-24"></a><span class="n">GetTempPath</span><span class="p">();</span><span class="w"> </span><span class="c1">// path of the current user&#39;s temporary folder</span>
<a id="__codelineno-105-25" name="__codelineno-105-25"></a><span class="n">GetTempFileName</span><span class="p">();</span><span class="w"> </span><span class="c1">// Create a uniquely named, zero-byte temporary file on disk and returns the full path of that file</span>
<a id="__codelineno-105-26" name="__codelineno-105-26"></a><span class="n">GetRandomFileName</span><span class="p">();</span><span class="w"> </span><span class="c1">// random folder name or file name</span>
<a id="__codelineno-105-27" name="__codelineno-105-27"></a>
<a id="__codelineno-105-28" name="__codelineno-105-28"></a><span class="c1">// get full path from relative</span>
<a id="__codelineno-105-29" name="__codelineno-105-29"></a><span class="kt">string</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Path</span><span class="p">.</span><span class="n">Combine</span><span class="p">(</span><span class="n">Path</span><span class="p">.</span><span class="n">GetDirectoryName</span><span class="p">(</span><span class="n">Assembly</span><span class="p">.</span><span class="n">GetExecutingAssembly</span><span class="p">().</span><span class="n">Location</span><span class="p">),</span><span class="w"> </span><span class="s">@&quot;relative_path.ext&quot;</span><span class="p">);</span><span class="w"> </span><span class="c1">// path to a file in the project directory</span>
<a id="__codelineno-105-30" name="__codelineno-105-30"></a>
<a id="__codelineno-105-31" name="__codelineno-105-31"></a><span class="c1">// get special folder location</span>
<a id="__codelineno-105-32" name="__codelineno-105-32"></a><span class="kt">string</span><span class="w"> </span><span class="n">appDataPath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Environment</span><span class="p">.</span><span class="n">GetFolderPath</span><span class="p">(</span><span class="n">Environment</span><span class="p">.</span><span class="n">SpecialFolder</span><span class="p">.</span><span class="n">ApplicationData</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h3 id="fileinfo-directoryinfo-filesysteminfo"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo">FileInfo</a>, <a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.directoryinfo">DirectoryInfo</a> &amp; <a href="https://docs.microsoft.com/en-us/dotnet/api/system.io.filesysteminfo">FileSystemInfo</a></h3>
<p>Classes to hold multiple info about a file or directory. If some property changes using the method <code>Refresh()</code> will update the data.</p>
<h3 id="clr-serialization">CLR Serialization</h3>
<p>Types are required to opt into CLR serialization. .NET defines a <code>[Serializable]</code> attribute that must be present before the CLR will serialize the type (class).</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-106-1">1</a></span>
<span class="normal"><a href="#__codelineno-106-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-106-1" name="__codelineno-106-1"></a><span class="na">[Serializable]</span>
<a id="__codelineno-106-2" name="__codelineno-106-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">Class</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<p>Serialization works directly with an object's fields. It uses reflection, which enables it to access all members, whether public or private.</p>
<blockquote>
<p><strong>Note</strong>: CLR Serialization produces binary streams in a .NET specific format</p>
</blockquote>
<hr />
<h2 id="datetime-timespan">DateTime &amp; TimeSpan</h2>
<h3 id="timespan-struct"><a href="https://docs.microsoft.com/en-us/dotnet/api/system.timespan">TimeSpan Struct</a></h3>
<p>Object that represents the difference between two dates</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-107-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-107-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-107-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-107-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-107-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-107-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-107-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-107-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-107-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-107-10">10</a></span>
<span class="normal"><a href="#__codelineno-107-11">11</a></span>
<span class="normal"><a href="#__codelineno-107-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-107-1" name="__codelineno-107-1"></a><span class="n">TimeSpan</span><span class="w"> </span><span class="n">Interval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">DateTime</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">DateTime</span><span class="p">()</span><span class="w"> </span><span class="c1">// difference between dates</span>
<a id="__codelineno-107-2" name="__codelineno-107-2"></a>
<a id="__codelineno-107-3" name="__codelineno-107-3"></a><span class="c1">// constructors</span>
<a id="__codelineno-107-4" name="__codelineno-107-4"></a><span class="n">TimeSpan</span><span class="p">(</span><span class="n">hours</span><span class="p">,</span><span class="w"> </span><span class="n">minutes</span><span class="p">,</span><span class="w"> </span><span class="n">seconds</span><span class="p">);</span><span class="w"> </span><span class="c1">// all parameters are integers</span>
<a id="__codelineno-107-5" name="__codelineno-107-5"></a><span class="n">TimeSpan</span><span class="p">(</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">hours</span><span class="p">,</span><span class="w"> </span><span class="n">minutes</span><span class="p">,</span><span class="w"> </span><span class="n">seconds</span><span class="p">);</span><span class="w"> </span><span class="c1">// all parameters are integers</span>
<a id="__codelineno-107-6" name="__codelineno-107-6"></a><span class="n">TimeSpan</span><span class="p">(</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">hours</span><span class="p">,</span><span class="w"> </span><span class="n">minutes</span><span class="p">,</span><span class="w"> </span><span class="n">seconds</span><span class="p">,</span><span class="w"> </span><span class="n">milliseconds</span><span class="p">);</span><span class="w"> </span><span class="c1">// all parameters are integers</span>
<a id="__codelineno-107-7" name="__codelineno-107-7"></a>
<a id="__codelineno-107-8" name="__codelineno-107-8"></a><span class="c1">// from primitive types</span>
<a id="__codelineno-107-9" name="__codelineno-107-9"></a><span class="n">TimeSpan</span><span class="w"> </span><span class="n">interval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TimeSpan</span><span class="p">.</span><span class="n">FromSeconds</span><span class="p">(</span><span class="n">seconds</span><span class="p">);</span>
<a id="__codelineno-107-10" name="__codelineno-107-10"></a><span class="n">TimeSpan</span><span class="w"> </span><span class="n">interval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TimeSpan</span><span class="p">.</span><span class="n">FromMinutes</span><span class="p">(</span><span class="n">minutes</span><span class="p">);</span>
<a id="__codelineno-107-11" name="__codelineno-107-11"></a><span class="n">TimeSpan</span><span class="w"> </span><span class="n">interval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TimeSpan</span><span class="p">.</span><span class="n">FromHours</span><span class="p">(</span><span class="n">hours</span><span class="p">);</span>
<a id="__codelineno-107-12" name="__codelineno-107-12"></a><span class="n">TimeSpan</span><span class="w"> </span><span class="n">interval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TimeSpan</span><span class="p">.</span><span class="n">FromDays</span><span class="p">(</span><span class="n">days</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="memory-efficiency">Memory Efficiency</h2>
<p>The CLR is able to perform automatic memory management thanks to its garbage collector (GC). This comes at a price: when a CPU spends time on garbage collection, that stops it from getting on with more productive work.<br />
In many cases, this time will be small enough not to cause visible problems. However, when certain kinds of programs experience heavy load, GC costs can come to dominate the overall execution time.</p>
<p>C# 7.2 introduced various features that can enable dramatic reductions in the number of allocations. Fewer allocations means fewer blocks of memory for the GC to recover, so this translates directly to lower GC overhead. There is a price to pay, of course: these GC-efficient techniques add significant complication to the code.</p>
<h3 id="spant"><code>Span&lt;T&gt;</code></h3>
<p>The <code>System.Span&lt;T&gt;</code> (a <code>ref struct</code>) value type represents a sequence of elements of type <code>T</code> stored contiguously in memory. Those elements can live inside an array, a string, a managed block of memory allocated in a stack frame, or unmanaged memory.</p>
<p>A <code>Span&lt;T&gt;</code> encapsulates three things: a pointer or reference to the containing memory (e.g., the string or array), the position of the data within that memory, and its
length. </p>
<p>Access to a span contents is done like an and since a <code>Span&lt;T&gt;</code> knows its own length, its indexer checks that the index is in range, just as the built-in array type does.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-108-1">1</a></span>
<span class="normal"><a href="#__codelineno-108-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-108-1" name="__codelineno-108-1"></a><span class="n">Span</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="w"> </span><span class="n">numbers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">stackalloc</span><span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-108-2" name="__codelineno-108-2"></a><span class="kt">var</span><span class="w"> </span><span class="n">first</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">numbers</span><span class="p">[</span><span class="m">0</span><span class="p">];</span>
</code></pre></div></td></tr></table></div>
<blockquote>
<p><strong>Note</strong>: Normally, C# wont allow to use <code>stackalloc</code> outside of code marked as unsafe, since it allocates memory on the stack producing a pointer. However, the compiler makes an exception to this rule when assigning the pointer produced by a <code>stackalloc</code> expression directly into a span.</p>
</blockquote>
<p>The fact that <code>Span&lt;T&gt;</code> and <code>ReadOnlySpan&lt;T&gt;</code> are both <code>ref struct</code> types ensures that a span cannot outlive its containing stack frame, guaranteeing that the stack frame on which the stack-allocated memory lives will not vanish while there are still outstanding references to it.</p>
<p>In addition to the array-like indexer and <code>Length</code> properties, <code>Span&lt;T&gt;</code> offers a few useful methods.<br />
The <code>Clear</code> and <code>Fill</code> methods provide convenient ways to initialize all the elements in a span either to the default value or a specific value.<br />
Obviously, these are not available on <code>ReadOnlySpan&lt;T&gt;</code>.</p>
<p>The <code>Span&lt;T&gt;</code> and <code>ReadOnlySpan&lt;T&gt;</code> types are both declared as <code>ref struct</code>. This means that not only are they value types, they are value types that can live only on the
stack. So it's not possible to have fields with span types in a class, or any struct that is not also a <code>ref struct</code>.</p>
<p>This also imposes some potentially more surprising restrictions:</p>
<ul>
<li>it's not possible to use a span in a variable in an async method.</li>
<li>there are restrictions on using spans in anonymous functions and in iterator methods</li>
</ul>
<p>This restriction is necessary for .NET to be able to offer the combination of array-like performance, type safety, and the flexibility to work with multiple different containers.</p>
<blockquote>
<p><strong>Note</strong>: it's possible to use spans in local methods, and even declare a ref struct variable in the outer method and use it from the nested one, but with one restriction: it's not possible a delegate that refers to that local method, because this would cause the compiler to move shared variables into an object that lives on the heap.</p>
</blockquote>
<h2 id="memoryt"><code>Memory&lt;T&gt;</code></h2>
<p>The <code>Memory&lt;T&gt;</code> type and its counterpart, <code>ReadOnlyMemory&lt;T&gt;</code>, represent the same basic concept as <code>Span&lt;T&gt;</code> and <code>ReadOnlySpan&lt;T&gt;</code>: these types provide a uniform view
over a contiguous sequence of elements of type <code>T</code> that could reside in an array, unmanaged memory, or, if the element type is char, a string.<br />
But unlike spans, these are not <code>ref struct</code> types, so they can be used anywhere. The downside is that this means they cannot offer the same high performance as spans.</p>
<p>It's possible to convert a <code>Memory&lt;T&gt;</code> to a <code>Span&lt;T&gt;</code>, and likewise a <code>ReadOnlyMemory&lt;T&gt;</code> to a <code>ReadOnlySpan&lt;T&gt;</code>.<br />
This makes these memory types useful when you want something span-like, but in a context where spans are not allowed.</p>
<hr />
<h2 id="regular-expressions">Regular Expressions</h2>
<p><a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference">regex reference</a></p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-109-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-109-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-109-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-109-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-109-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-109-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-109-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-109-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-109-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-109-10">10</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-109-1" name="__codelineno-109-1"></a><span class="n">Match</span><span class="w"> </span><span class="n">match</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Regex</span><span class="p">.</span><span class="n">Match</span><span class="p">(</span><span class="kt">string</span><span class="p">,</span><span class="w"> </span><span class="n">pattern</span><span class="p">,</span><span class="w"> </span><span class="n">regexOptions</span><span class="p">);</span>
<a id="__codelineno-109-2" name="__codelineno-109-2"></a>
<a id="__codelineno-109-3" name="__codelineno-109-3"></a><span class="n">match</span><span class="p">.</span><span class="n">Success</span><span class="p">;</span><span class="w"> </span><span class="c1">// whether there was a match or not</span>
<a id="__codelineno-109-4" name="__codelineno-109-4"></a>
<a id="__codelineno-109-5" name="__codelineno-109-5"></a><span class="n">match</span><span class="p">.</span><span class="n">Groups</span><span class="p">[</span><span class="n">index</span><span class="p">];</span><span class="w"> </span><span class="c1">// numbered capture group (first group is always whole match)</span>
<a id="__codelineno-109-6" name="__codelineno-109-6"></a><span class="n">match</span><span class="p">.</span><span class="n">Groups</span><span class="p">[</span><span class="n">name</span><span class="p">];</span><span class="w"> </span><span class="c1">// named capture group</span>
<a id="__codelineno-109-7" name="__codelineno-109-7"></a>
<a id="__codelineno-109-8" name="__codelineno-109-8"></a><span class="n">match</span><span class="p">.</span><span class="n">Groups</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">Value</span><span class="p">;</span><span class="w"> </span><span class="c1">// whole captured string</span>
<a id="__codelineno-109-9" name="__codelineno-109-9"></a><span class="n">match</span><span class="p">.</span><span class="n">Groups</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">Captures</span><span class="p">;</span><span class="w"> </span><span class="c1">// list of strings in the matched group</span>
<a id="__codelineno-109-10" name="__codelineno-109-10"></a><span class="n">match</span><span class="p">.</span><span class="n">Groups</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">Index</span><span class="p">;</span><span class="w"> </span><span class="c1">// position in the input string of the matched group</span>
</code></pre></div></td></tr></table></div>
<hr />
<h2 id="unsafe-code-pointers">Unsafe Code &amp; Pointers</h2>
<p>The <code>unsafe</code> keyword denotes an <em>unsafe context</em>, which is required for any operation involving pointers.</p>
<p>In an unsafe context, several constructs are available for operating on pointers:</p>
<ul>
<li>The <code>*</code> operator may be used to perform pointer indirection (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#pointer-indirection">Pointer indirection</a>).</li>
<li>The <code>-&gt;</code> operator may be used to access a member of a struct through a pointer (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#pointer-member-access">Pointer member access</a>).</li>
<li>The <code>[]</code> operator may be used to index a pointer (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#pointer-element-access">Pointer element access</a>).</li>
<li>The <code>&amp;</code> operator may be used to obtain the address of a variable (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#the-address-of-operator">The address-of operator</a>).</li>
<li>The <code>++</code> and <code>--</code> operators may be used to increment and decrement pointers (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#pointer-increment-and-decrement">Pointer increment and decrement</a>).</li>
<li>The <code>+</code> and <code>-</code> operators may be used to perform pointer arithmetic (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#pointer-arithmetic">Pointer arithmetic</a>).</li>
<li>The <code>==</code>, <code>!=</code>, <code>&lt;</code>, <code>&gt;</code>, <code>&lt;=</code>, and <code>&gt;=</code> operators may be used to compare pointers (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#pointer-comparison">Pointer comparison</a>).</li>
<li>The <code>stackalloc</code> operator may be used to allocate memory from the call stack (<a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code#stack-allocation">Stack allocation</a>).</li>
</ul>
<p>The <code>fixed</code> statement prevents the garbage collector from relocating a movable variable. It's only permitted in an unsafe context.<br />
It's also possible to use the fixed keyword to create fixed size buffers.</p>
<p>The <code>fixed</code> statement sets a pointer to a managed variable and "pins" that variable during the execution of the statement.<br />
Pointers to movable managed variables are useful only in a fixed context. Without a fixed context, garbage collection could relocate the variables unpredictably.<br />
The C# compiler only allows to assign a pointer to a managed variable in a fixed statement.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-110-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-110-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-110-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-110-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-110-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-110-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-110-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-110-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-110-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-110-10">10</a></span>
<span class="normal"><a href="#__codelineno-110-11">11</a></span>
<span class="normal"><a href="#__codelineno-110-12">12</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-110-1" name="__codelineno-110-1"></a><span class="k">unsafe</span><span class="w"> </span><span class="n">Type</span><span class="w"> </span><span class="nf">UnsafeMethod</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* unsafe context */</span><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-110-2" name="__codelineno-110-2"></a><span class="c1">// or</span>
<a id="__codelineno-110-3" name="__codelineno-110-3"></a><span class="k">unsafe</span>
<a id="__codelineno-110-4" name="__codelineno-110-4"></a><span class="p">{</span>
<a id="__codelineno-110-5" name="__codelineno-110-5"></a><span class="w"> </span><span class="c1">// Using fixed allows the address of pt members to be taken,</span>
<a id="__codelineno-110-6" name="__codelineno-110-6"></a><span class="w"> </span><span class="c1">// and &quot;pins&quot; pt so that it is not relocated.</span>
<a id="__codelineno-110-7" name="__codelineno-110-7"></a><span class="w"> </span><span class="n">Point</span><span class="w"> </span><span class="n">pt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Point</span><span class="p">();</span>
<a id="__codelineno-110-8" name="__codelineno-110-8"></a><span class="w"> </span><span class="k">fixed</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">pt</span><span class="p">.</span><span class="n">x</span><span class="p">)</span>
<a id="__codelineno-110-9" name="__codelineno-110-9"></a><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-110-10" name="__codelineno-110-10"></a><span class="w"> </span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">;</span>
<a id="__codelineno-110-11" name="__codelineno-110-11"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-110-12" name="__codelineno-110-12"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="native-memory">Native Memory</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-111-1">1</a></span>
<span class="normal"><a href="#__codelineno-111-2">2</a></span>
<span class="normal"><a href="#__codelineno-111-3">3</a></span>
<span class="normal"><a href="#__codelineno-111-4">4</a></span>
<span class="normal"><a href="#__codelineno-111-5">5</a></span>
<span class="normal"><a href="#__codelineno-111-6">6</a></span>
<span class="normal"><a href="#__codelineno-111-7">7</a></span>
<span class="normal"><a href="#__codelineno-111-8">8</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-111-1" name="__codelineno-111-1"></a><span class="k">using</span><span class="w"> </span><span class="nn">System.Runtime.InteropServices</span><span class="p">;</span>
<a id="__codelineno-111-2" name="__codelineno-111-2"></a>
<a id="__codelineno-111-3" name="__codelineno-111-3"></a><span class="k">unsafe</span>
<a id="__codelineno-111-4" name="__codelineno-111-4"></a><span class="p">{</span>
<a id="__codelineno-111-5" name="__codelineno-111-5"></a><span class="w"> </span><span class="kt">byte</span><span class="o">*</span><span class="w"> </span><span class="n">buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">byte</span><span class="o">*</span><span class="p">)</span><span class="n">NativeMemory</span><span class="p">.</span><span class="n">Alloc</span><span class="p">(</span><span class="m">100</span><span class="p">);</span>
<a id="__codelineno-111-6" name="__codelineno-111-6"></a>
<a id="__codelineno-111-7" name="__codelineno-111-7"></a><span class="w"> </span><span class="n">NativeMemory</span><span class="p">.</span><span class="n">Free</span><span class="p">(</span><span class="n">buffer</span><span class="p">);</span>
<a id="__codelineno-111-8" name="__codelineno-111-8"></a><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="external-code">External Code</h3>
<p>The <code>extern</code> modifier is used to declare a method that is implemented externally.<br />
A common use of the extern modifier is with the <code>DllImport</code> attribute when using Interop services to call into <em>unmanaged</em> code.<br />
In this case, the method must also be declared as <code>static</code>.</p>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-112-1">1</a></span>
<span class="normal"><a href="#__codelineno-112-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-112-1" name="__codelineno-112-1"></a><span class="na">[DllImport(&quot;avifil32.dll&quot;)]</span>
<a id="__codelineno-112-2" name="__codelineno-112-2"></a><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">extern</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">AVIFileInit</span><span class="p">();</span>
</code></pre></div></td></tr></table></div>
<h2 id="magic-methods">Magic Methods</h2>
<p>Methods needed to implement a behaviour which do not need an interface to work. The methods <strong>must</strong> be named <em>appropriately</em> and have the correct <em>return type</em>.</p>
<h3 id="enumerable">Enumerable</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-113-1">1</a></span>
<span class="normal"><a href="#__codelineno-113-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-113-1" name="__codelineno-113-1"></a><span class="k">public</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">MoveNext</span><span class="p">(</span><span class="cm">/* ... */</span><span class="p">);</span>
<a id="__codelineno-113-2" name="__codelineno-113-2"></a><span class="k">public</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="n">Current</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">get</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
</code></pre></div></td></tr></table></div>
<h3 id="awaitable">Awaitable</h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">C#</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-114-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-114-1" name="__codelineno-114-1"></a><span class="k">public</span><span class="w"> </span><span class="n">TaskAwaiter</span><span class="w"> </span><span class="nf">GetAwaiter</span><span class="p">(</span><span class="cm">/* ... */</span><span class="p">);</span>
</code></pre></div></td></tr></table></div>
<h2 id="code-quality">Code Quality</h2>
<h3 id="code-analysis"><a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview">Code Analysis</a></h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">XML</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-115-1">1</a></span>
<span class="normal"><a href="#__codelineno-115-2">2</a></span>
<span class="normal"><a href="#__codelineno-115-3">3</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-115-1" name="__codelineno-115-1"></a><span class="nt">&lt;PropertyGroup&gt;</span>
<a id="__codelineno-115-2" name="__codelineno-115-2"></a><span class="w"> </span><span class="nt">&lt;AnalisysMode&gt;</span>All<span class="nt">&lt;/NugetAuditMode&gt;</span>
<a id="__codelineno-115-3" name="__codelineno-115-3"></a><span class="nt">&lt;/PropertyGroup&gt;</span>
</code></pre></div></td></tr></table></div>
<table>
<thead>
<tr>
<th style="text-align: center;">Level</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><code>None</code></td>
<td>All rules are disabled. Can selectively <a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-options" title="Coda Analysis Configuration Options">opt in</a> to individual rules to enable them.</td>
</tr>
<tr>
<td style="text-align: center;"><code>Default</code></td>
<td>Default mode, where certain rules are enabled as build warnings, certain rules are enabled as options IDE suggestions, and the remainder are disabled.</td>
</tr>
<tr>
<td style="text-align: center;"><code>Minimum</code></td>
<td>More aggressive mode than <code>Default</code> mode. Certain suggestions that are highly recommended for build enforcement are enabled as build warnings.</td>
</tr>
<tr>
<td style="text-align: center;"><code>Recommended</code></td>
<td>More aggressive mode than <code>Minimum</code> mode, where more rules are enabled as build warnings.</td>
</tr>
<tr>
<td style="text-align: center;"><code>All</code></td>
<td>All rules are enabled as build warnings<em>. </em>Can selectively <a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-options" title="Coda Analysis Configuration Options">opt out</a> of individual rules to disable them.</td>
</tr>
</tbody>
</table>
<h3 id="dependency-auditing"><a href="https://learn.microsoft.com/en-us/nuget/concepts/auditing-packages">Dependency Auditing</a></h3>
<div class="highlight"><table class="highlighttable"><tr><th colspan="2" class="filename"><span class="filename">XML</span></th></tr><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-116-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-116-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-116-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-116-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-116-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-116-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-116-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-116-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-116-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-116-10">10</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-116-1" name="__codelineno-116-1"></a><span class="nt">&lt;PropertyGroup&gt;</span>
<a id="__codelineno-116-2" name="__codelineno-116-2"></a><span class="w"> </span><span class="cm">&lt;!-- required --&gt;</span>
<a id="__codelineno-116-3" name="__codelineno-116-3"></a><span class="w"> </span><span class="nt">&lt;NugetAuditMode&gt;</span>all|direct<span class="nt">&lt;/NugetAuditMode&gt;</span>
<a id="__codelineno-116-4" name="__codelineno-116-4"></a>
<a id="__codelineno-116-5" name="__codelineno-116-5"></a><span class="w"> </span><span class="cm">&lt;!-- suggested --&gt;</span>
<a id="__codelineno-116-6" name="__codelineno-116-6"></a><span class="w"> </span><span class="nt">&lt;NugetAuditLevel&gt;</span>low|moderate|high|critical<span class="nt">&lt;/NugetAuditLevel&gt;</span>
<a id="__codelineno-116-7" name="__codelineno-116-7"></a>
<a id="__codelineno-116-8" name="__codelineno-116-8"></a><span class="w"> </span><span class="cm">&lt;!-- optional --&gt;</span>
<a id="__codelineno-116-9" name="__codelineno-116-9"></a><span class="w"> </span><span class="nt">&lt;WarningsAsErrors&gt;</span>NU1901;NU1902;NU1903;NU1904<span class="nt">&lt;/WarningAsErrors&gt;</span>
<a id="__codelineno-116-10" name="__codelineno-116-10"></a><span class="nt">&lt;/PropertyGroup&gt;</span>
</code></pre></div></td></tr></table></div>
<p>The auditing of dependencies is done during the <code>dotnet restore</code> step.
A description of the dependencies is checked against a report of known vulnerabilities on the <a href="https://github.com/advisories?query=type%3Areviewed+ecosystem%3Anuget" title="Github Advisory Database">GitHub Advisory Database</a>.</p>
<p>Audit Mode:</p>
<ul>
<li><strong>all</strong>: audit direct <em>and</em> transitive dependencies for vulnerabilities.</li>
<li><strong>direct</strong>: audit <em>only</em> direct dependencies for vulnerabilities.</li>
</ul>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../../python/libs/beautiful-soup.html" class="md-footer__link md-footer__link--prev" aria-label="Previous: Beatiful Soup">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Beatiful Soup
</div>
</div>
</a>
<a href="linq.html" class="md-footer__link md-footer__link--next" aria-label="Next: Linq">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Linq
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
MIT
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://hachyderm.io/@m_lamonaca" target="_blank" rel="noopener me" title="hachyderm.io" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.5 102.5 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5m-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg>
</a>
<a href="https://github.com/m-lamonaca" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.instant", "navigation.indexes", "navigation.tracking", "navigation.pruning", "navigation.sections", "navigation.top", "navigation.tabs", "navigation.tabs.sticky", "navigation.footer", "toc.follow", "content.code.copy"], "search": "../../../assets/javascripts/workers/search.07f07601.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.56dfad97.min.js"></script>
</body>
</html>