.NET Documentation Comments
   HOME

TheInfoList



OR:

This article describes the
syntax In linguistics, syntax ( ) is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure (constituenc ...
of the C#
programming language A programming language is a system of notation for writing computer programs. Programming languages are described in terms of their Syntax (programming languages), syntax (form) and semantics (computer science), semantics (meaning), usually def ...
. The features described are compatible with .NET Framework and
Mono Mono may refer to: Biology * Infectious mononucleosis, "the kissing disease" * Monocyte, a type of leukocyte (white blood cell) * Monodactylidae, members of which are referred to as monos Technology and computing * Mono (audio), single-c ...
.


Basics


Identifier

An
identifier An identifier is a name that identifies (that is, labels the identity of) either a unique object or a unique ''class'' of objects, where the "object" or class may be an idea, person, physical countable object (or class thereof), or physical mass ...
is the name of an element in the
code In communications and information processing, code is a system of rules to convert information—such as a letter, word, sound, image, or gesture—into another form, sometimes shortened or secret, for communication through a communicati ...
. It can contain letters, digits and
underscore An underscore or underline is a line drawn under a segment of text. In proofreading, underscoring is a convention that says "set this text in italic type", traditionally used on manuscript or typescript as an instruction to the printer. Its ...
s (_), and is
case sensitive Case or CASE may refer to: Instances * Instantiation (disambiguation), a realization of a concept, theme, or design * Special case, an instance that differs in a certain way from others of the type Containers * Case (goods), a package of related ...
(FOO is different from foo). The language imposes the following restrictions on identifier names: * They cannot start with a digit; * They cannot start with a symbol, unless it is a keyword; * They cannot contain more than 511 characters. Identifier names may be prefixed by an
at sign The at sign () is an accounting and invoice abbreviation meaning "at a rate of" (e.g. 7 Widget (economics), widgets @ £2 per widget = £14), now seen more widely in email addresses and social media platform User (computing), handles. It is norm ...
(@), but this is insignificant; @name is the same identifier as name. Microsoft has published
naming conventions A naming convention is a convention (norm), convention (generally agreed scheme) for naming things. Conventions differ in their intents, which may include to: * Allow useful information to be deduced from the names based on regularities. For ins ...
for identifiers in C#, which recommend the use of
PascalCase The writing format camel case (sometimes stylized autologically as camelCase or CamelCase, also known as camel caps or more formally as medial capitals) is the practice of writing phrases without spaces or punctuation and with capitalized wo ...
for the names of types and most type members, and
camelCase The writing format camel case (sometimes stylized autologically as camelCase or CamelCase, also known as camel caps or more formally as medial capitals) is the practice of writing phrases without spaces or punctuation and with capitalized wor ...
for variables and for private or internal fields. However, these naming conventions are not enforced in the language.


Keywords

Keywords are predefined reserved words with special syntactic meaning. The language has two types of keyword — contextual and reserved. The reserved keywords such as false or byte may only be used as keywords. The contextual keywords such as where or from are only treated as keywords in certain situations. If an identifier is needed which would be the same as a reserved keyword, it may be prefixed by an at sign to distinguish it. For example, @out is interpreted as an identifier, whereas out as a keyword. This syntax facilitates reuse of
.NET The .NET platform (pronounced as "''dot net"'') is a free and open-source, managed code, managed computer software framework for Microsoft Windows, Windows, Linux, and macOS operating systems. The project is mainly developed by Microsoft emplo ...
code written in other languages. The following C# keywords are reserved words: * abstract * as * base * bool * break * byte * case * catch * char * checked * class * const * continue * decimal * default * delegate * do * double * else * enum * event * explicit * extern * false * finally * fixed * float * for * foreach * goto * if * implicit * in * int * interface * internal * is * lock * long * namespace * new * null * object * operator * out * override * params * private * protected * public * readonly * ref * return * sbyte * sealed * short * sizeof * stackalloc * static * string * struct * switch * this * throw * true * try * typeof * uint * ulong * unchecked * unsafe * ushort * using * virtual * void * volatile * while A contextual keyword is used to provide a specific meaning in the code, but it is not a reserved word in C#. Some contextual keywords, such as partial and where, have special meanings in multiple contexts. The following C# keywords are contextual: * add * allows * alias * and * ascending * args * async * await * by * descending * dynamic * equals * from * get * global * group * init * into * join * let * managed * nameof * nint * not * notnull * nuint * on * or * orderby * partial * record * remove * required * select * set * unmanaged * value * var * when * where * with * yield


Preprocessor directives

Although C# does not have a separate
preprocessor In computer science, a preprocessor (or precompiler) is a Computer program, program that processes its input data to produce output that is used as input in another program. The output is said to be a preprocessed form of the input data, which i ...
, unlike C and C++ which use the
C preprocessor The C preprocessor (CPP) is a text file processor that is used with C, C++ and other programming tools. The preprocessor provides for file inclusion (often header files), macro expansion, conditional compilation, and line control. Although ...
, these directives are processed as if there were one. * #nullable * #if * #elif * #else * #endif * #define * #undef * #region * #endregion * #error * #warning * #line * #pragma


Literals


Digit separators

Starting in C# 7.0, the
underscore An underscore or underline is a line drawn under a segment of text. In proofreading, underscoring is a convention that says "set this text in italic type", traditionally used on manuscript or typescript as an instruction to the printer. Its ...
symbol can be used to separate digits in number values for readability purposes. The compiler ignores these underscores. int bin = 0b1101_0010_1011_0100; int hex = 0x2F_BB_4A_F1; int dec = 1_000_500_954; double real = 1_500.200_2e-1_000; Generally, it may be put only between digit characters. It cannot be put at the beginning () or the end of the value ( or ), next to the decimal in floating point values (), next to the exponent character (), or next to the type specifier ().


Variables

Variables Variable may refer to: Computer science * Variable (computer science), a symbolic name associated with a value and whose associated value may be changed Mathematics * Variable (mathematics), a symbol that represents a quantity in a mathemat ...
are identifiers associated with values. They are declared by writing the variable's type and name, and are optionally initialized in the same statement. Declare int myInt; // Declaring an uninitialized variable called 'myInt', of type 'int' Assigning int myInt; // Declaring an uninitialized variable myInt = 35; // Assigning the variable a value Initialize int myInt = 35; // Declaring and initializing the variable Multiple variables of the same type can be declared and initialized in one statement. int a, b; // Declaring multiple variables of the same type int a = 2, b = 3; // Declaring and initializing multiple variables of the same type


Local variable type inference

:''This is a feature of C# 3.0.'' C# 3.0 introduced
type inference Type inference, sometimes called type reconstruction, refers to the automatic detection of the type of an expression in a formal language. These include programming languages and mathematical type systems, but also natural languages in some bran ...
, allowing the type specifier of a variable declaration to be replaced by the keyword var, if its actual type can be statically determined from the initializer. This reduces repetition, especially for types with multiple generic type-parameters, and adheres more closely to the DRY principle. var myChars = new char[] ; // or char[] myChars = new char[] ; var myNums = new List(); // or List myNums = new List();


Constants

Constants are immutable values.


const

When declaring a
local variable In computer science, a local variable is a variable that is given ''local scope''. A local variable reference in the function or block in which it is declared overrides the same variable name in the larger scope. In programming languages with ...
or a field with the const keyword as a prefix the value must be given when it is declared. After that it is locked and cannot change. They can either be declared in the context as a field or a local variable. Constants are implicitly static. const double PI = 3.14; This shows both uses of the keyword. public class Foo


readonly

The readonly keyword does a similar thing to fields. Like fields marked as const they cannot change once initialized. The difference is that one can choose to initialize them in a constructor, or to a value that is not known until run-time. This only works on fields. readonly fields can either be members of an instance or static class members.


Code blocks

Curly braces are used to signify a code block and a new
scope Scope or scopes may refer to: People with the surname * Jamie Scope (born 1986), English footballer * John T. Scopes (1900–1970), central figure in the Scopes Trial regarding the teaching of evolution Arts, media, and entertainment * CinemaS ...
. Class members and the body of a method are examples of what can live inside these braces in various contexts. Inside of method bodies, braces can be used to create new scopes: void DoSomething()


Program structure

A C# application consists of classes and their members. Classes and other types exist in namespaces but can also be nested inside other classes.


Main method

Whether it is a console or a graphical interface application, the program must have an entry point of some sort. The entry point of a C# application is the Main method. There can only be one declaration of this method, and it is a static method in a class. It usually returns void and is passed command-line arguments as an array of strings. static void Main(string[] args) // string[] args can be omitted if the program doesn't have any command-line arguments. The main method is also allowed to return an integer value if specified. static int Main(string[] args)


Async Main

''This is a feature of C# 7.1.'' Asynchronous Tasks can be awaited in the Main method by declaring the method's return type as Task. static async Task Main(string[] args) All the combinations of Task, or Task, and with, or without, the string[] args parameter are supported.


Top-level statements

''This is a feature of C# 9.0.'' Similar to in
scripting languages In computing, a script is a relatively short and simple set of instructions that typically automation, automate an otherwise manual process. The act of writing a script is called scripting. A scripting language or script language is a programming ...
, top-level statements removes the ceremony of having to declare the Program class with a Main method. Instead, statements can be written directly in one specific file, and that file will be the entry point of the program. Code in other files will still have to be defined in classes. This was introduced to make C# less verbose, and thus more accessible for beginners to get started. using System; Console.WriteLine("Hello World!"); Types are declared after the statements, and will be automatically available from the statements above them.


Namespaces

Namespaces are a part of a type name and they are used to group and/or distinguish named entities from other ones. System.IO.DirectoryInfo // DirectoryInfo is in the System.IO-namespace A namespace is defined like this: namespace FooNamespace A namespace can be put inside a namespace like this: namespace FooNamespace It can also be done like this: namespace FooNamspace namespace FooNamspace.BarNamespace In C# 10 and later, namespaces can also be defined using ''file-scoped declarations'' by doing the following: namespace FooNamespace; // the brackets are omitted here in favor of a semicolon.


using directive

The using directive loads a specific namespace from a referenced assembly. It is usually placed in the top (or header) of a code file but it can be placed elsewhere if wanted, e.g. inside classes. using System; using System.Collections; The directive can also be used to define another name for an existing namespace or type. This is sometimes useful when names are too long and less readable. using Net = System.Net; using DirInfo = System.IO.DirectoryInfo;


directive

The directive loads the static members of a specified type into the current scope, making them accessible directly by the name of the member. using static System.Console; WriteLine("Hello, World!");


Operators


Operator overloading

Some of the existing operators can be overloaded by writing an overload method. public static Foo operator+(Foo foo, Bar bar) These are the overloadable operators: *''Assignment operators'' ( etc.) are combinations of a binary operator and the assignment operator () and will be evaluated using the ordinary operators, which can be overloaded. *''Cast operators'' () cannot be overloaded, but it is possible to define conversion operators. *''Array indexing'' () operator is not overloadable, but it is possible to define new indexers.


Conversion operators

The cast operator is not overloadable, but one can write a conversion operator method which lives in the target class. Conversion methods can define two varieties of operators, implicit and explicit conversion operators. The implicit operator will cast without specifying with the cast operator () and the explicit operator requires it to be used. Implicit conversion operator
class Foo // Implicit conversion Foo foo = 2; Explicit conversion operator class Foo // Explicit conversion Foo foo = (Foo)2;


as operator

The as operator will attempt to do a silent cast to a given type. It will return the object as the new type if possible, and otherwise will return null. Stream stream = File.Open(@"C:\Temp\data.dat"); FileStream fstream = stream as FileStream; // Will return an object. String str = stream as String; // Will return null.


Null coalesce operator

:''This is a feature of C# 2.0.'' The following: return ifNotNullValue ?? otherwiseValue; is shorthand for: return ifNotNullValue != null ? ifNotNullValue : otherwiseValue; Meaning that if the content of variable is not null, that content will be returned, otherwise the content of variable is returned. C# 8.0 introduces null-coalescing assignment, such that variable ??= otherwiseValue; is equivalent to if (variable is null) variable = otherwiseValue;


Control structures

C# inherits most of the control structures of C/C++ and also adds new ones like the foreach statement.


Conditional structures

These structures control the flow of the program through given conditions.


if statement

The if statement is entered when the given condition is true. Single-line case statements do not require block braces although it is mostly preferred by convention. Simple one-line statement: if (i

3) ... ;
Multi-line with else-block (without any braces): if (i

2) ... else ...
Recommended coding conventions for an if-statement. if (i

3) else if (i

2) else


switch statement

The switch construct serves as a filter for different values. Each value leads to a "case". It is not allowed to fall through case sections and therefore the keyword break is typically used to end a case. An unconditional return in a case section can also be used to end a case. See also how goto statement can be used to fall through from one case to the next. Many cases may lead to the same code though. The default case handles all the other cases not handled by the construct. switch (ch)


Iteration structures

Iteration statements are statements that are repeatedly executed when a given condition is evaluated as true.


while loop

while (i

true)


do ... while loop

do while (i

true);


for loop

The for loop consists of three parts: ''declaration'', ''condition'' and ''counter expression''. Any of them can be left out as they are optional. for (int i = 0; i < 10; i++) Is equivalent to this code represented with a while statement, except here the variable is not local to the loop. int i = 0; while (i < 10)


foreach loop

The foreach statement is derived from the for statement and makes use of a certain pattern described in C#'s language specification in order to obtain and use an enumerator of elements to iterate over. Each item in the given collection will be returned and reachable in the context of the code block. When the block has been executed the next item will be returned until there are no items remaining. foreach (int i in intList)


Jump statements

Jump statements are inherited from C/C++ and ultimately assembly languages through it. They simply represent the jump-instructions of an assembly language that controls the flow of a program.


Labels and goto statement

Labels are given points in code that can be jumped to by using the goto statement. start: ....... goto start; Note that the label need not be positioned after the goto statement; it may be before it in the source file. The goto statement can be used in switch statements to jump from one case to another or to fall through from one case to the next. switch (n)


break statement

The break statement breaks out of the closest loop or switch statement. Execution continues in the statement after the terminated statement, if any. int e = 10; for (int i = 0; i < e; i++)


continue statement

The continue statement discontinues the current iteration of the current control statement and begins the next iteration. int ch; while ((ch = Console.Read()) != -1) The while loop in the code above reads characters by calling , skipping the statements in the body of the loop if the characters are spaces.


Exception handling

Runtime exception handling method in C# is inherited from Java and C++. The base class library has a class called from which all other exception classes are derived. An -object contains all the information about a specific exception and also the inner exceptions that were caused. Programmers may define their own exceptions by deriving from the class. An exception can be thrown this way: throw new NotImplementedException();


statements

Exceptions are managed within blocks. try catch (Exception ex) finally The statements within the try block are executed, and if any of them throws an exception, execution of the block is discontinued and the exception is handled by the catch block. There may be multiple catch blocks, in which case the first block with an exception variable whose type matches the type of the thrown exception is executed. If no catch block matches the type of the thrown exception, the execution of the outer block (or method) containing the try ... catch statement is discontinued, and the exception is passed up and outside the containing block or method. The exception is propagated upwards through the
call stack In computer science, a call stack is a Stack (abstract data type), stack data structure that stores information about the active subroutines and block (programming), inline blocks of a computer program. This type of stack is also known as an exe ...
until a matching catch block is found within one of the currently active methods. If the exception propagates all the way up to the top-most method without a matching catch block being found, the entire program is terminated and a textual description of the exception is written to the standard output stream. The statements within the finally block are always executed after the try and catch blocks, whether or not an exception was thrown. Such blocks are useful for providing clean-up code. Either a catch block, a finally block, or both, must follow the try block.


Types

C# is a statically typed language like C and C++. That means that every variable and constant gets a fixed type when it is being declared. There are two kinds of types: ''value types'' and ''reference types''.


Value types

Instances of value types reside on the stack, i.e. they are bound to their variables. If one declares a variable for a value type the memory gets allocated directly. If the variable gets out of scope the object is destroyed with it.


Structures

Structures are more commonly known as ''structs''. Structs are user-defined value types that are declared using the struct keyword. They are very similar to classes but are more suitable for lightweight types. Some important syntactical differences between a class and a struct are presented later in this article. struct Foo The primitive data types are all structs.


=Pre-defined types

= These are the primitive datatypes. Note: () is not a struct and is not a primitive type.


Enumerations

Enumerated types (declared with enum) are named values representing integer values. enum Season Enum variables are initialized by default to zero. They can be assigned or initialized to the named values defined by the enumeration type. Season season; season = Season.Spring; Enum type variables are integer values. Addition and subtraction between variables of the same type is allowed without any specific cast but multiplication and division is somewhat more risky and requires an explicit cast. Casts are also required for converting enum variables to and from integer types. However, the cast will not throw an exception if the value is not specified by the type definition. season = (Season)2; // cast 2 to an enum-value of type Season. season = season + 1; // Adds 1 to the value. season = season + season2; // Adding the values of two enum variables. int value = (int)season; // Casting enum-value to integer value. season++; // Season.Spring (1) becomes Season.Summer (2). season--; // Season.Summer (2) becomes Season.Spring (1). Values can be combined using the bitwise-OR operator . Color myColors = Color.Green , Color.Yellow , Color.Blue;


Reference types

Variables created for reference types are typed managed references. When the constructor is called, an object is created on the heap and a reference is assigned to the variable. When a variable of an object goes out of scope the reference is broken and when there are no references left the object gets marked as garbage. The garbage collector will then soon collect and destroy it. A reference variable is null when it does not reference any object.


Arrays

An
array An array is a systematic arrangement of similar objects, usually in rows and columns. Things called an array include: {{TOC right Music * In twelve-tone and serial composition, the presentation of simultaneous twelve-tone sets such that the ...
type is a reference type that refers to a space containing one or more elements of a certain type. All array types derive from a common base class, . Each element is referenced by its index just like in C++ and Java. An array in C# is what would be called a
dynamic array In computer science, a dynamic array, growable array, resizable array, dynamic table, mutable array, or array list is a random access, variable-size list data structure that allows elements to be added or removed. It is supplied with standard l ...
in C++. int[] numbers = new int[2]; numbers[0] = 2; numbers[1] = 5; int x = numbers[0];


=Initializers

= Array initializers provide convenient syntax for initialization of arrays. // Long syntax int[] numbers = new int[5]; // Short syntax int[] numbers2 = ; // Inferred syntax var numbers3 = new[] ;


=Multi-dimensional arrays

= Arrays can have more than one dimension, for example 2 dimensions to represent a grid. int numbers = new int
, 3 The comma is a punctuation mark that appears in several variants in different languages. Some typefaces render it as a small line, slightly curved or straight, but inclined from the vertical; others give it the appearance of a miniature fille ...
numbers ,2= 2; int numbers2 = new int
, 3 The comma is a punctuation mark that appears in several variants in different languages. Some typefaces render it as a small line, slightly curved or straight, but inclined from the vertical; others give it the appearance of a miniature fille ...
;
See also *
Jagged array In computer science, a jagged array, also known as a ragged array or irregular array is an array data structure, array of arrays of which the member arrays can be of different lengths, producing rows of jagged edges when visualized as output. ...


Classes

Classes are self-describing user-defined reference types. Essentially all types in the .NET Framework are classes, including structs and enums, that are compiler generated classes. Class members are private by default, but can be declared as public to be visible outside of the class or protected to be visible by any descendants of the class.


=Strings

= The class, or simply , represents an immutable sequence of unicode characters (). Actions performed on a string will always return a new string. string text = "Hello World!"; string substr = text.Substring(0, 5); string[] parts = text.Split(new char[]); The class can be used when a mutable "string" is wanted. var sb = new StringBuilder(); sb.Append('H'); sb.Append("el"); sb.AppendLine("lo!");


Interface

Interfaces are data structures that contain member definitions with no actual implementation. A variable of an interface type is a reference to an instance of a class which implements this interface. See #Interfaces.


Delegates

C# provides type-safe object-oriented function pointers in the form of ''delegates''. class Program Initializing the delegate with an anonymous method. addition = delegate(int a, int b) ; Initializing the delegate with lambda expression. addition = (a, b) => a + b;


Events

''Events'' are
pointers Pointer may refer to: People with the name * Pointer (surname), a surname (including a list of people with the name) * Pointer Williams (born 1974), American former basketball player Arts, entertainment, and media * ''Pointer'' (journal), the ...
that can point to multiple methods. More exactly they bind method pointers to one identifier. This can therefore be seen as an extension to delegates. They are typically used as triggers in UI development. The form used in C# and the rest of the
Common Language Infrastructure The Common Language Infrastructure (CLI) is an open specification and technical standard originally developed by Microsoft and standardized by International Organization for Standardization, ISO/International Electrotechnical Commission, IEC (ISO/ ...
is based on that in the classic
Visual Basic Visual Basic is a name for a family of programming languages from Microsoft. It may refer to: * Visual Basic (.NET), the current version of Visual Basic launched in 2002 which runs on .NET * Visual Basic (classic), the original Visual Basic suppo ...
. delegate void MouseEventHandler(object sender, MouseEventArgs e); public class Button : System.Windows.Controls.Control An event requires an accompanied ''event handler'' that is made from a special delegate that in a platform specific library like in
Windows Presentation Foundation Windows Presentation Foundation (WPF) is a free and open-source user interface framework for Windows-based desktop applications. WPF applications are based in .NET, and are primarily developed using C# and XAML. Originally developed by Microso ...
and
Windows Forms Windows Forms, also known as WinForms, is a free, open-source graphical user interface (GUI) class library for building Windows desktop applications, included as a part of Microsoft .NET, .NET Framework or Mono, providing a platform to write c ...
usually takes two parameters: ''sender'' and the ''event arguments''. The type of the event argument-object derive from the EventArgs class that is a part of the CLI base library. Once declared in its class the only way of invoking the event is from inside of the owner. A listener method may be implemented outside to be triggered when the event is fired. public class MainWindow : System.Windows.Controls.Window Custom event implementation is also possible: private EventHandler _clickHandles = (s, e) => ; public event EventHandler Click See also *
Event-driven programming In computer programming, event-driven programming is a programming paradigm in which the Control flow, flow of the program is determined by external Event (computing), events. User interface, UI events from computer mouse, mice, computer keyboard, ...


Nullable types

:''This is a feature of C# 2.0.'' Nullable types were introduced in C# 2.0 firstly to enable value types to be null (useful when working with a database). int? n = 2; n = null; Console.WriteLine(n.HasValue); In reality this is the same as using the struct. Nullable n = 2; n = null; Console.WriteLine(n.HasValue);


Pointers

C# has and allows
pointers Pointer may refer to: People with the name * Pointer (surname), a surname (including a list of people with the name) * Pointer Williams (born 1974), American former basketball player Arts, entertainment, and media * ''Pointer'' (journal), the ...
to selected types (some primitives, enums, strings, pointers, and even arrays and structs if they contain only types that can be pointed) in unsafe context: methods and codeblock marked unsafe. These are syntactically the same as pointers in C and C++. However, runtime-checking is disabled inside unsafe blocks. static void Main(string[] args) Structs are required only to be pure structs with no members of a managed reference type, e.g. a string or any other class. public struct MyStruct public struct MyContainerStruct In use: MyContainerStruct x; MyContainerStruct* ptr = &x; byte value = ptr->Byte;


Dynamic

:''This is a feature of C# 4.0 and .NET Framework 4.0.'' Type dynamic is a feature that enables dynamic runtime lookup to C# in a static manner. Dynamic denotes a variable with an object with a type that is resolved at runtime, as opposed to compile-time, as normally is done. This feature takes advantage of the
Dynamic Language Runtime The Dynamic Language Runtime (DLR) from Microsoft runs on top of the Common Language Runtime (CLR) and provides computer language services for dynamic languages. These services include: * A dynamic type system, to be shared by all languages using ...
(DLR) and has been designed specifically with the goal of interoperation with
dynamically typed In computer programming, a type system is a logical system comprising a set of rules that assigns a property called a ''type'' (for example, integer, floating point, string) to every '' term'' (a word, phrase, or other set of symbols). Usua ...
languages Language is a structured system of communication that consists of grammar and vocabulary. It is the primary means by which humans convey meaning, both in spoken and signed forms, and may also be conveyed through writing. Human language is ch ...
like
IronPython IronPython is an implementation of the Python programming language targeting the .NET and Mono frameworks. The project is currently maintained by a group of volunteers at GitHub. It is free and open-source software, and can be implemented with P ...
and
IronRuby IronRuby is an implementation of the Ruby programming language targeting Microsoft .NET Framework. It is implemented on top of the Dynamic Language Runtime (DLR), a library running on top of the Common Language Infrastructure that provides dynam ...
(Implementations of
Python Python may refer to: Snakes * Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia ** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia * Python (mythology), a mythical serpent Computing * Python (prog ...
and
Ruby Ruby is a pinkish-red-to-blood-red-colored gemstone, a variety of the mineral corundum ( aluminium oxide). Ruby is one of the most popular traditional jewelry gems and is very durable. Other varieties of gem-quality corundum are called sapph ...
for .NET). Dynamic-support also eases interoperation with
COM Com or COM may refer to: Computing * COM (hardware interface), a serial port interface on IBM PC-compatible computers * COM file, or .com file, short for "command", a file extension for an executable file in MS-DOS * .com, an Internet top-level ...
objects. dynamic x = new Foo(); x.DoSomething(); // Will compile and resolved at runtime. An exception will be thrown if invalid.


Anonymous types

:''This is a feature of C# 3.0.'' Anonymous types are nameless classes that are generated by the compiler. They are only consumable and yet very useful in a scenario like where one has a LINQ query which returns an object on select and one just wants to return some specific values. Then, define an anonymous type containing auto-generated read-only fields for the values. When instantiating another anonymous type declaration with the same signature the type is automatically
inferred Inferences are steps in logical reasoning, moving from premises to logical consequences; etymologically, the word ''infer'' means to "carry forward". Inference is theoretically traditionally divided into deduction and induction, a distinction ...
by the compiler. var carl = new ; // Name of the type is only known by the compiler. var mary = new ; // Same type as the expression above


Boxing and unboxing

''
Boxing Boxing is a combat sport and martial art. Taking place in a boxing ring, it involves two people – usually wearing protective equipment, such as boxing glove, protective gloves, hand wraps, and mouthguards – throwing Punch (combat), punch ...
'' is the operation of converting a value of a value type into a value of a corresponding reference type.
Archer Archery is the sport, practice, or skill of using a bow to shoot arrows.Paterson ''Encyclopaedia of Archery'' p. 17 The word comes from the Latin ''arcus'', meaning bow. Historically, archery has been used for hunting and combat. In modern ...
, Part 2, Chapter 4:The Type System
Boxing in C# is implicit. ''Unboxing'' is the operation of converting a value of a reference type (previously boxed) into a value of a value type. Unboxing in C# requires an explicit type cast. Example: int foo = 42; // Value type. object bar = foo; // foo is boxed to bar. int foo2 = (int)bar; // Unboxed back to value type.


Object-oriented programming (OOP)

C# has direct support for
object-oriented programming Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impl ...
.


Objects

An object is created with the type as a template and is called an ''instance'' of that particular type. In C#, objects are either references or values. No further syntactical distinction is made between those in code.


Object class

All types, even value types in their boxed form, implicitly inherit from the class, the ultimate base class of all objects. This class contains the most common methods shared by all objects. Some of these are virtual and can be overridden. Classes inherit either directly or indirectly through another base class. Members
Some of the members of the Object class: * - Supports comparisons between objects. * - Performs cleanup operations before an object is automatically reclaimed. (Default destructor) * - Gets the number corresponding to the value of the object to support the use of a hash table. * - Gets the Type of the current instance. * - Creates a human-readable text string that describes an instance of the class. Usually it returns the name of the type.


Classes

Classes are fundamentals of an object-oriented language such as C#. They serve as a template for objects. They contain members that store and manipulate data in a real-life like way.


Differences between classes and structs

Although classes and
structures A structure is an arrangement and organization of interrelated elements in a material object or system, or the object or system so organized. Material structures include man-made objects such as buildings and machines and natural objects such as ...
are similar in both the way they are declared and how they are used, there are some significant differences. Classes are reference types and structs are value types. A structure is allocated on the stack when it is declared and the variable is bound to its address. It directly contains the value. Classes are different because the memory is allocated as objects on the heap. Variables are rather managed pointers on the stack which point to the objects. They are references. Structures differ from classes in several other ways. For example, while both offer an implicit
default constructor Default may refer to: Law * Default (law), the failure to do something required by law ** Default (finance) In finance, default is failure to meet the legal obligations (or conditions) of a loan, for example when a home buyer fails to make ...
which takes no arguments, one cannot redefine it for structs. Explicitly defining a differently-parametrized constructor will suppress the implicit default constructor in classes, but not in structs. All fields of a struct must be initialized in those kinds of constructors. Structs do not have finalizers and cannot inherit from another class like classes do. Implicitly, they are sealed and inherit from (which inherits from ). Structs are more suitable for smaller amounts of data. This is a short summary of the differences:


Declaration

A class is declared like this: class Foo


=Partial class

= :''This is a feature of C# 2.0.'' A partial class is a class declaration whose code is divided into separate files. The different parts of a partial class must be marked with keyword partial. // File1.cs partial class Foo // File2.cs partial class Foo The usual reason for using partial classes is to split some class into a programmer-maintained and a tool-maintained part, i.e. some code is automatically generated by a user-interface designing tool or something alike.


Initialization

Before one can use the members of the class, initialize the variable with a reference to an object. To create it, call the appropriate constructor using the new keyword. It has the same name as the class. var foo = new Foo(); For ''structs'' it is optional to explicitly call a constructor because the default one is called automatically. It is just needed to declare it and it gets initialized with standard values.


=Object initializers

= :''This is a feature of C# 3.0.'' Provides a more convenient way of initializing public fields and properties of an object. Constructor calls are optional when there is a default constructor. var person = new Person ; // Equal to var person = new Person(); person.Name = "John Doe"; person.Age = 39;


=Collection initializers

= :''This is a feature of C# 3.0.'' Collection initializers give an array-like syntax for initializing collections. The compiler will simply generate calls to the Add-method. This works for classes that implement the interface . var list = new List ; // Equal to var list = new List(); list.Add(2); list.Add(5); list.Add(6); list.Add(6);


Accessing members

Members of an instance and static members of a class are accessed using the operator. Accessing an instance member
Instance members can be accessed through the name of a variable. string foo = "Hello"; string fooUpper = foo.ToUpper(); Accessing a static class member
Static members are accessed by using the name of the class or other type. int r = string.Compare(foo, fooUpper); Accessing a member through a pointer
In ''unsafe code'', members of a value (struct type) referenced by a pointer are accessed with the operator just like in C and C++. POINT p; p.X = 2; p.Y = 6; POINT* ptr = &p; ptr->Y = 4;


Modifiers

Modifiers are keywords used to modify declarations of types and type members. Most notably there is a sub-group containing the access modifiers.


=Class modifiers

= *abstract - Specifies that a class only serves as a base class. It must be implemented in an inheriting class. A precondition for allowing the class to have abstract methods. *sealed - Specifies that a class cannot be inherited.


=Class member modifiers

= *abstract - Declares a method to be available in all derived non-abstract classes. *const - Specifies that a variable is a constant value that has to be initialized when it gets declared. *event - Declares an event. *extern - Specifies that a method signature without a body uses a DLL-import. *override - Specifies that a method or property declaration is an override of a virtual member or an implementation of a member of an abstract class. *readonly - Declares a field that can only be assigned values as part of the declaration or in a constructor in the same class. *unsafe - Specifies an unsafe context, which allows the use of pointers. *virtual - Specifies that a method or property declaration can be overridden by a derived class. *volatile - Specifies a field which may be modified by an external process and prevents an optimizing compiler from making guesses about the persistence of the current value of the field.


=static modifier

= The static modifier states that a member belongs to the class and not to a specific object. Classes marked static are only allowed to contain static members. Static members are sometimes referred to as ''class members'' since they apply to the class as a whole and not to its instances. public class Foo // Calling the class method. Foo.Something();


=Access modifiers

= The ''access modifiers'', or ''inheritance modifiers'', set the accessibility of classes, methods, and other members. Something marked can be reached from anywhere. members can only be accessed from inside of the class they are declared in and will be hidden when inherited. Members with the modifier will be , but accessible when inherited. classes and members will only be accessible from the inside of the declaring assembly. Classes and structs are implicitly and members are implicitly if they do not have an access modifier. public class Foo This table defines where the access modifiers can be used.


Constructors

A constructor is a special method that is called automatically when an object is created. Its purpose is to initialize the members of the object. Constructors have the same name as the class and do not return anything explicitly. Implicitly, they will return the newly created object when called via the new operator. They may take parameters like any other method. The parameter-less constructor is special because it can be specified as a necessary constraint for a generic type parameter. class Foo Constructors can be public, private, protected or internal.


Destructor

The destructor is called when the object is being collected by the garbage collector to perform some manual clean-up. There is a default destructor method called that can be overridden by declaring one. The syntax is similar to the one of constructors. The difference is that the name is preceded by a ~ and it cannot contain any parameters. There cannot be more than one destructor. class Foo Finalizers are always private.


Methods

Like in C and C++ there are functions that group reusable code. The main difference is that functions, just like in Java, have to reside inside of a class. A function is therefore called a ''method''. A method has a return value, a name and usually some parameters initialized when it is called with some arguments. It can either belong to an instance of a class or be a static member. class Foo A
method Method (, methodos, from μετά/meta "in pursuit or quest of" + ὁδός/hodos "a method, system; a way or manner" of doing, saying, etc.), literally means a pursuit of knowledge, investigation, mode of prosecuting such inquiry, or system. In re ...
is called using notation on a specific variable, or as in the case of static methods, the name of a type. Foo foo = new Foo(); int r = foo.Bar(7, 2); Console.WriteLine(r);


=ref and out parameters

= One can explicitly make arguments be passed by reference when calling a method with parameters preceded by keywords ref or out. These managed pointers come in handy when passing variables that one wants to be modified inside the method by reference. The main difference between the two is that an out parameter must have been assigned within the method by the time the method returns. ref may or may not assign a new value, but the parameter variable has to be initialized before calling the function. void PassRef(ref int x) int Z = 7; PassRef(ref Z); void PassOut(out int x) int Q; PassOut(out Q);


=Optional parameters

= :''This is a feature of C# 4.0.'' C# 4.0 introduces optional parameters with default values as seen in C++. For example: void Increment(ref int x, int dx = 1) int x = 0; Increment(ref x); // dx takes the default value of 1 Increment(ref x, 2); // dx takes the value 2 In addition, to complement optional parameters, it is possible to explicitly specify parameter names in method calls, allowing to selectively pass any given subset of optional parameters for a method. The only restriction is that named parameters must be placed after the unnamed parameters. Parameter names can be specified for both optional and required parameters, and can be used to improve readability or arbitrarily reorder arguments in a call. For example: Stream OpenFile(string name, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) OpenFile("file.txt"); // use default values for both "mode" and "access" OpenFile("file.txt", mode: FileMode.Create); // use default value for "access" OpenFile("file.txt", access: FileAccess.Read); // use default value for "mode" OpenFile(name: "file.txt", access: FileAccess.Read, mode: FileMode.Create); // name all parameters for extra readability, // and use order different from method declaration Optional parameters make interoperating with COM easier. Previously, C# had to pass in every parameter in the method of the COM component, even those that are optional. For example: object fileName = "Test.docx"; object missing = System.Reflection.Missing.Value; doc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); console.writeline("File saved successfully"); With support for optional parameters, the code can be shortened as doc.SaveAs(ref fileName);


=extern

= A feature of C# is the ability to call native code. A method signature is simply declared without a body and is marked as extern. The attribute also needs to be added to reference the desired DLL file. llImport("win32.dll")static extern double Pow(double a, double b);


Fields

Fields, or
instance variable In class-based, object-oriented programming, an instance variable is a variable defined in a class (i.e., a member variable), for which each instantiated object of the class has a separate copy, or instance. An instance variable has similari ...
s, can be declared inside the class body to store data. class Foo Fields can be initialized directly when declared (unless declared in struct). class Foo Modifiers for fields: *const - Makes the field a constant. *private - Makes the field private (default). *protected - Makes the field protected. *public - Makes the field public. *readonly - Allows the field to be initialized only once in a constructor. *static - Makes the field a static member, i.e. a
class variable In class-based, object-oriented programming, a class variable is a variable defined in a class of which a single copy exists, regardless of how many instances of the class exist. A class variable is not an instance variable. It is a special t ...
.


Properties

Properties Property is the ownership of land, resources, improvements or other tangible objects, or intellectual property. Property may also refer to: Philosophy and science * Property (philosophy), in philosophy and logic, an abstraction characterizing an ...
bring field-like syntax and combine them with the power of methods. A property can have two accessors: get and set. public class Person // Using a property var person = new Person(); person.Name = "Robert"; Modifiers for properties: *private - Makes the property private (default). *protected - Makes the property protected. *public - Makes the property public. *static - Makes the property a static member. Modifiers for property accessors: *private - Makes the accessor private. *protected - Makes the accessor protected. *public - Makes the accessor public. The default modifiers for the accessors are inherited from the property. Note that the accessor's modifiers can only be equal or more restrictive than the property's modifier.


=Automatic properties

= :''This is a feature of C# 3.0.'' A feature of C# 3.0 is auto-implemented properties. Define accessors without bodies and the compiler will generate a backing field and the necessary code for the accessors. public double Width


Indexers

Indexers add array-like indexing capabilities to objects. They are implemented in a way similar to properties. internal class IntList // Using an indexer var list = new IntList(); list = 2;


Inheritance

Classes in C# may only inherit from one class. A class may derive from any class that is not marked as sealed. class A class B : A


=virtual

= Methods marked virtual provide an implementation, but they can be overridden by the inheritors by using the override keyword. The implementation is chosen by the actual type of the object and not the type of the variable. class Operation class NewOperation : Operation


=new

= When overloading a non-virtual method with another signature, the keyword new may be used. The used method will be chosen by the type of the variable instead of the actual type of the object. class Operation class NewOperation : Operation This demonstrates the case: var operation = new NewOperation(); // Will call "double Do()" in NewOperation double d = operation.Do(); Operation operation_ = operation; // Will call "int Do()" in Operation int i = operation_.Do();


=abstract

= Abstract classes are classes that only serve as templates and one cannot initialize an object of that type. Otherwise, it is just like an ordinary class. There may be abstract members too. Abstract members are members of abstract classes that do not have any implementation. They must be overridden by any non-abstract class that inherits the member. abstract class Mammal class Human : Mammal


=sealed

= The sealed modifier can be combined with the others as an optional modifier for classes to make them uninheritable, or for methods to disallow overriding them in derived classes. internal sealed class Foo public class Bar public class Baz : Bar


Interfaces

Interfaces are data structures that contain member definitions and not actual implementation. They are useful when one wants to define a contract between members in different types that have different implementations. One can declare definitions for methods, properties, and indexers. Interface members are implicitly public. An interface can either be implicitly or explicitly implemented. interface IBinaryOperation


Implementing an interface

An interface is implemented by a class or extended by another interface in the same way a class is derived from another class using the notation. Implicit implementation When implicitly implementing an interface the members of the interface have to be public. public class Adder : IBinaryOperation public class Multiplier : IBinaryOperation In use: IBinaryOperation op = null; double result; // Adder implements the interface IBinaryOperation. op = new Adder(); op.A = 2; op.B = 3; result = op.GetResult(); // 5 // Multiplier also implements the interface. op = new Multiplier(); op.A = 5; op.B = 4; result = op.GetResult(); // 20 Explicit implementation One can also explicitly implement members. The members of the interface that are explicitly implemented by a class are accessible only when the object is handled as the interface type. public class Adder : IBinaryOperation In use: Adder add = new Adder(); // These members are not accessible: // add.A = 2; // add.B = 3; // double result = add.GetResult(); // Cast to the interface type to access them: IBinaryOperation add2 = add; add2.A = 2; add2.B = 3; double result = add2.GetResult(); Note: The properties in the class that extends are auto-implemented by the compiler and a backing field is automatically added (see #Automatic properties). Extending multiple interfaces Interfaces and classes are allowed to extend multiple interfaces. class MyClass : IInterfaceA, IInterfaceB Here is an interface that extends two interfaces. interface IInterfaceC : IInterfaceA, IInterfaceB


Interfaces vs. abstract classes

Interfaces and abstract classes are similar. The following describes some important differences: * An abstract class may have member variables as well as non-abstract methods or properties. An interface cannot. * A class or abstract class can only inherit from one class or abstract class. * A class or abstract class may implement one or more interfaces. * An interface can only extend other interfaces. * An abstract class may have non-public methods and properties (also abstract ones). An interface can only have public members. * An abstract class may have constants, static methods and static members. An interface cannot. * An abstract class may have constructors. An interface cannot.


Generics

:''This is a feature of C# 2.0 and .NET Framework 2.0.'' Generics (or parameterized types,
parametric polymorphism In programming languages and type theory, parametric polymorphism allows a single piece of code to be given a "generic" type, using variables in place of actual types, and then instantiated with particular types as needed. Parametrically polymorph ...
) use type parameters, which make it possible to design classes and methods that do not specify the type used until the class or method is instantiated. The main advantage is that one can use generic type parameters to create classes and methods that can be used without incurring the cost of runtime casts or boxing operations, as shown here: // Declare the generic class. public class GenericList class TestGenericList When compared with
C++ templates C, or c, is the third letter of the Latin alphabet, used in the modern English alphabet, the alphabets of other western European languages and others worldwide. Its name in English is ''cee'' (pronounced ), plural ''cees''. History "C ...
, C# generics can provide enhanced safety, but also have somewhat limited capabilities. For example, it is not possible to call arithmetic operators on a C# generic type. Unlike C++ templates, .NET parameterized types are instantiated at runtime rather than by the compiler; hence they can be cross-language whereas C++ templates cannot. They support some features not supported directly by C++ templates such as type constraints on generic parameters by use of interfaces. On the other hand, C# does not support non-type generic parameters. Unlike generics in Java, .NET generics use reification to make parameterized types first-class objects in the
Common Language Infrastructure The Common Language Infrastructure (CLI) is an open specification and technical standard originally developed by Microsoft and standardized by International Organization for Standardization, ISO/International Electrotechnical Commission, IEC (ISO/ ...
(CLI) Virtual Machine, which allows for optimizations and preservation of the type information.


Using generics


Generic classes

Classes and structs can be generic. public class List var list = new List(); list.Add(6); list.Add(2);


Generic interfaces

interface IEnumerable


Generic delegates

delegate R Func(T1 a1, T2 a2);


Generic methods

public static T[] CombineArrays(T[] a, T[] b) string[] a = new string[] ; string[] b = new string[] ; string[] c = CombineArrays(a, b); double[] da = new double[] ; double[] db = new double[] ; double[] dc = CombineArrays(da, db); // c is a string array containing // dc is a double array containing


Type-parameters

Type-parameters are names used in place of concrete types when defining a new generic. They may be associated with classes or methods by placing the type parameter in angle brackets . When instantiating (or calling) a generic, one can then substitute a concrete type for the type-parameter one gave in its declaration. Type parameters may be constrained by use of the where keyword and a constraint specification, any of the six comma separated constraints may be used:


Covariance and contravariance

:''This is a feature of C# 4.0 and .NET Framework 4.0.'' Generic interfaces and delegates can have their type parameters marked as covariant or contravariant, using keywords out and in, respectively. These declarations are then respected for type conversions, both implicit and explicit, and both compile-time and run-time. For example, the existing interface has been redefined as follows: interface IEnumerable Therefore, any class that implements for some class is also considered to be compatible with for all classes and interfaces that extends, directly, or indirectly. In practice, it makes it possible to write code such as: void PrintAll(IEnumerable objects) IEnumerable strings = new List(); PrintAll(strings); // IEnumerable is implicitly converted to IEnumerable For contravariance, the existing interface has been redefined as follows: public interface IComparer Therefore, any class that implements for some class is also considered to be compatible with for all classes and interfaces that are extended from . It makes it possible to write code such as: IComparer objectComparer = GetComparer(); IComparer stringComparer = objectComparer;


Enumerators

An ''enumerator'' is an iterator. Enumerators are typically obtained by calling the method of an object implementing the interface. Container classes typically implement this interface. However, the
foreach In computer programming, foreach loop (or for-each loop) is a control flow statement for traversing items in a collection. is usually used in place of a standard loop statement. Unlike other loop constructs, however, loops usually maintai ...
statement in C# can operate on any object providing such a method, even if it doesn't implement . This interface was expanded into generic version in .NET 2.0. The following shows a simple use of iterators in C# 2.0: // explicit version IEnumerator iter = list.GetEnumerator(); while (iter.MoveNext()) Console.WriteLine(iter.Current); // implicit version foreach (MyType value in list) Console.WriteLine(value);


Generator functionality

:''This is a feature of C# 2.0.'' The .NET 2.0 Framework allowed C# to introduce an
iterator In computer programming, an iterator is an object that progressively provides access to each item of a collection, in order. A collection may provide multiple iterators via its interface that provide items in different orders, such as forwards ...
that provides generator functionality, using a construct similar to yield in
Python Python may refer to: Snakes * Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia ** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia * Python (mythology), a mythical serpent Computing * Python (prog ...
. With a , the function automatically keeps its state during the iteration. // Method that takes an iterable input (possibly an array) // and returns all even numbers. public static IEnumerable GetEven(IEnumerable numbers) // using the method to output only even numbers from the array static void Main()


LINQ

:''This is a feature of C# 3.0 and .NET Framework 3.0.'' LINQ, short for Language Integrated Queries, is a .NET Framework feature which simplifies the handling of data. Mainly it adds support that allows the querying of arrays, collections, and databases. It also introduces binders, which makes it easier to access to databases and their data.


Query syntax

The LINQ query syntax was introduced in C# 3.0 and lets one write
SQL Structured Query Language (SQL) (pronounced ''S-Q-L''; or alternatively as "sequel") is a domain-specific language used to manage data, especially in a relational database management system (RDBMS). It is particularly useful in handling s ...
-like queries in C#. var list = new List; var result = from i in list where i > 1 select i; The statements are compiled into method calls, whereby almost only the names of the methods are specified. Which methods are ultimately used is determined by normal overload resolution. Thus, the result of the translation is affected by what symbols are in scope. What differs from SQL is that the from-statement comes first and not last as in SQL. This is because it seems more natural writing like this in C# and supports "Intellisense" (Code completion in the editor).


Anonymous methods

Anonymous method In computer programming, an anonymous function (function literal, expression or block) is a function definition that is not bound to an identifier. Anonymous functions are often arguments being passed to higher-order functions or used for constru ...
s, or in their present form more commonly referred to as "lambda expressions", is a feature which allows programmers to write inline closure-like functions in their code. There are various ways to create anonymous methods. Prior to C# 3.0 there was limited support by using delegates.


Anonymous delegates

:''This is a feature of C# 2.0.'' Anonymous delegates are functions pointers that hold anonymous methods. The purpose is to make it simpler to use delegates by simplifying the process of assigning the function. Instead of declaring a separate method in code the programmer can use the syntax to write the code inline and the compiler will then generate an anonymous function for it. Func f = delegate(int x) ;


Lambda expressions

:''This is a feature of C# 3.0.'' Lambda expressions provide a simple syntax for inline functions that are similar to closures. Functions with parameters infer the type of the parameters if other is not explicitly specified. // rguments=> ethod-body // With parameters n => n

2 (a, b) => a + b (a, b) => // With explicitly typed parameters (int a, int b) => a + b // No parameters () => return 0 // Assigning lambda to delegate Func f = (a, b) => a + b;
Multi-statement lambdas have bodies enclosed by braces and inside of them code can be written like in standard methods. (a, b) => Lambda expressions can be passed as arguments directly in method calls similar to anonymous delegates but with a more aesthetic syntax. var list = stringList.Where(n => n.Length > 2); Lambda expressions are essentially compiler-generated methods that are passed via delegates. These methods are reserved for the compiler only and can not be used in any other context.


Extension methods

:''This is a feature of C# 3.0.'' Extension methods are a form of syntactic sugar providing the illusion of adding new methods to the existing class outside its definition. In practice, an extension method is a static method that is callable as if it were an instance method; the receiver of the call is bound to the first parameter of the method, decorated with keyword this: public static class StringExtensions string s = "foo"; s.Left(3); // same as StringExtensions.Left(s, 3);


Local functions

:''This is a feature of C# 7.0.'' Local functions can be defined in the body of another method, constructor or property's getter and setter. Such functions have access to all variables in the enclosing scope, including parent method local variables. They are in scope for the entire method, regardless of whether they're invoked before or after their declaration. Access modifiers (public, private, protected) cannot be used with local functions. Also they do not support
function overloading In some programming languages, function overloading or method overloading is the ability to create multiple functions of the same name with different implementations. Calls to an overloaded function will run a specific implementation of that f ...
. It means there cannot be two local functions in the same method with the same name even if the signatures don't overlap. After a compilation, a local function is transformed into a private static method, but when defined it cannot be marked static. In code example below, the Sum method is a local function inside Main method. So it can be used only inside its parent method Main: static void Main(string[] args)


Miscellaneous


Closure blocks

C# implements Resource Acquisition Is Initialization#Closure blocks, closure blocks by means of th
using statement
The using statement accepts an expression which results in an object implementing , and the compiler generates code that guarantees the object's disposal when the scope of the using-statement is exited. The using statement is
syntactic sugar In computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express. It makes the language "sweeter" for human use: things can be expressed more clearly, more concisely, or in an ...
. It makes the code more readable than the equivalent block. public void Foo()


Thread synchronization

C# provides th
lock statement
which is yet another example of beneficial syntactic sugar. It works by marking a block of code as a
critical section In concurrent programming, concurrent accesses to shared resources can lead to unexpected or erroneous behavior. Thus, the parts of the program where the shared resource is accessed need to be protected in ways that avoid the concurrent access. One ...
by mutual exclusion of access to a provided object. Like the using statement, it works by the compiler generating a block in its place. private static StreamWriter _writer; public void ConcurrentMethod()


Attributes

Attributes are entities of data that are stored as metadata in the compiled assembly. An attribute can be added to types and members like properties and methods. Attribute
can be used for
better maintenance of preprocessor directives. ompilerGeneratedpublic class $AnonymousType$120 The .NET Framework comes with predefined attributes that can be used. Some of them serve an important role at runtime while some are just for syntactic decoration in code like . It does only mark that it is a compiler-generated element. Programmer-defined attributes can also be created. An attribute is essentially a class which inherits from the class. By convention, attribute classes end with "Attribute" in their name. This will not be required when using it. public class EdibleAttribute : Attribute Showing the attribute in use using the optional constructor parameters. dible(true)public class Peach : Fruit


Preprocessor

C# features "preprocessor directives" (though it does not have an actual preprocessor) based on the
C preprocessor The C preprocessor (CPP) is a text file processor that is used with C, C++ and other programming tools. The preprocessor provides for file inclusion (often header files), macro expansion, conditional compilation, and line control. Although ...
that allow programmers to define
symbol A symbol is a mark, Sign (semiotics), sign, or word that indicates, signifies, or is understood as representing an idea, physical object, object, or wikt:relationship, relationship. Symbols allow people to go beyond what is known or seen by cr ...
s, but not macros. Conditionals such as , , and are also provided. Directives such as give hints to editors for
code folding Code or text folding, or less commonly holophrasting, is a feature of some graphical user interfaces that allows the user to selectively hide ("fold") or display ("unfold") parts of a document. This allows the user to manage large amounts of text ...
. The block must be terminated with a directive. public class Foo


Code comments

C# utilizes a double
slash Slash may refer to: * Slash (punctuation), the "/" character Arts and entertainment Fictional characters * Slash (Marvel Comics) * Slash (''Teenage Mutant Ninja Turtles'') Music * Harry Slash & The Slashtones, an American rock band * Nash th ...
() to indicate the rest of the line is a comment. public class Foo Multi-line comments can be indicated by a starting slash/asterisk () and ending asterisk/forward slash (). public class Foo Comments do not nest. These are two single comments: // Can put /* */ */ */ /* /* /* Can put /* /* /* but it ends with */ Single-line comments beginning with three slashes are used for XML documentation. This, however, is a convention used by Visual Studio and is not part of the language definition: /// /// This class is very classy. ///


XML documentation comments

C#'s
documentation Documentation is any communicable material that is used to describe, explain or instruct regarding some attributes of an object, system or procedure, such as its parts, assembly, installation, maintenance, and use. As a form of knowledge managem ...
comments are similar to Java's
Javadoc Javadoc (also capitalized as JavaDoc or javadoc) is an API documentation generator for the Java programming language. Based on information in Java source code, Javadoc generates documentation formatted as HTML and other formats via extensions. ...
, but based on
XML Extensible Markup Language (XML) is a markup language and file format for storing, transmitting, and reconstructing data. It defines a set of rules for encoding electronic document, documents in a format that is both human-readable and Machine-r ...
. Two methods of documentation are currently supported by the C#
compiler In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
. Single-line documentation comments, such as those commonly found in
Visual Studio Visual Studio is an integrated development environment (IDE) developed by Microsoft. It is used to develop computer programs including web site, websites, web apps, web services and mobile apps. Visual Studio uses Microsoft software development ...
generated code, are indicated on a line beginning with . public class Foo Multi-line documentation comments, while defined in the version 1.0 language specification, were not supported until the
.NET The .NET platform (pronounced as "''dot net"'') is a free and open-source, managed code, managed computer software framework for Microsoft Windows, Windows, Linux, and macOS operating systems. The project is mainly developed by Microsoft emplo ...
1.1 release. These comments are designated by a starting forward slash/asterisk/asterisk () and ending asterisk/forward slash (). public class Foo There are some stringent criteria regarding white space and XML documentation when using the forward slash/asterisk/asterisk () technique. This code block: /** * * A summary of the method.*/ produces a different XML comment than this code block: /** * A summary of the method.*/ Syntax for documentation comments and their
XML Extensible Markup Language (XML) is a markup language and file format for storing, transmitting, and reconstructing data. It defines a set of rules for encoding electronic document, documents in a format that is both human-readable and Machine-r ...
markup is defined in a non-normative annex of the ECMA C# standard. The same standard also defines rules for processing of such comments, and their transformation to a plain
XML Extensible Markup Language (XML) is a markup language and file format for storing, transmitting, and reconstructing data. It defines a set of rules for encoding electronic document, documents in a format that is both human-readable and Machine-r ...
document with precise rules for mapping of
Common Language Infrastructure The Common Language Infrastructure (CLI) is an open specification and technical standard originally developed by Microsoft and standardized by International Organization for Standardization, ISO/International Electrotechnical Commission, IEC (ISO/ ...
(CLI) identifiers to their related documentation elements. This allows any C#
integrated development environment An integrated development environment (IDE) is a Application software, software application that provides comprehensive facilities for software development. An IDE normally consists of at least a source-code editor, build automation tools, an ...
(IDE) or other development tool to find documentation for any symbol in the code in a certain well-defined way.


Async-await syntax

:''This is a feature of C# 5.0 and .NET Framework 4.0.'' As of .NET Framework 4 there is a task library that makes it easier to write parallel and multi-threaded applications through tasks. C# 5.0 has native language support for asynchrony. Consider this code that takes advantage of the task library directly: public static class SomeAsyncCode var t = SomeAsyncCode.GetContentAsync().ContinueWith((task) => ); t.Start(); Here is the same logic written in the async-await syntax: public static class SomeAsyncCode var xmlDocument = await SomeAsyncCode.GetContentAsync(); // The Task will be started on call with await.


Dialects


Spec#

Spec# is a dialect of C# that is developed in parallel with the standard implementation from Microsoft. It extends C# with specification language features and is a possible future feature to the C# language. It also adds syntax for the code contracts API that was introduced in .NET Framework 4.0. Spec# is being developed by
Microsoft Research Microsoft Research (MSR) is the research subsidiary of Microsoft. It was created in 1991 by Richard Rashid, Bill Gates and Nathan Myhrvold with the intent to advance state-of-the-art computing and solve difficult world problems through technologi ...
. This sample shows two of the basic structures that are used when adding contracts to code. static void Main(string![] args) requires args.Length > 0 * is used to make a reference type non-nullable, e.g. it is not possible to set the value to null. This in contrast of nullable types which allow value types to be set as null. * indicates a condition that must be followed in the code. In this case the length of args is not allowed to be zero or less.


Non-nullable types

Spec# extends C# with non-nullable types that simply checks so the variables of nullable types that has been set as non-nullable are not null. If is null then an exception will be thrown. string! input In use: public Test(string! input)


Preconditions

Preconditions are checked before a method is executed. public Test(int i) requires i > 0;


Postconditions

Postconditions are conditions that are ensured to be correct when a method has been executed. public void Increment() ensures i > 0;


Checked exceptions

Spec# adds checked exceptions like those in
Java Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
. public void DoSomething() throws SomeException; // SomeException : ICheckedException Checked exceptions are problematic, because when a lower-level function adds a new exception type, the whole chain of methods using this method at some nested lower level must also change its contract. This violates the open/closed principle.


See also

* .NET Framework * C# (programming language) *
Java syntax The syntax of Java is the set of rules defining how a Java program is written and interpreted. The syntax is mostly derived from C and C++. Unlike C++, Java has no global functions or variables, but has data members which are also regarde ...
*
C++ syntax C, or c, is the third letter of the Latin alphabet, used in the modern English alphabet, the alphabets of other western European languages and others worldwide. Its name in English is ''cee'' (pronounced ), plural ''cees''. History "C ...
*
C syntax The syntax of the C programming language is the set of rules governing writing of software in C. It is designed to allow for programs that are extremely terse, have a close relationship with the resulting object code, and yet provide relatively ...
*
Mono (software) Mono is a free and open-source software framework that aims to run software made for the .NET Framework on Linux and other OSes. Originally by Ximian which was acquired by Novell, it was later developed by Xamarin which was acquired by Microsoft. ...
* Microsoft Visual C#


References

# #Bart de Smet on Spec#
{{Webarchive, url=https://web.archive.org/web/20101029151906/http://bartdesmet.net/blogs/bart/archive/2005/08/09/3438.aspx , date=October 29, 2010


External links


Microsoft .NET FrameworkMono project
C Sharp programming language family Programming language syntax