fbpx
Wikipedia

C Sharp 4.0

C# 4.0 is a version of the C# programming language that was released on April 11, 2010. Microsoft released the 4.0 runtime and development environment Visual Studio 2010.[1] The major focus of C# 4.0 is interoperability with partially or fully dynamically typed languages and frameworks, such as the Dynamic Language Runtime and COM.

Features edit

The following new features were added in C# 4.0.[2]

Dynamic member lookup edit

A new pseudo-type dynamic is introduced into the C# type system. It is treated as System.Object, but in addition, any member access (method call, field, property, or indexer access, or a delegate invocation) or application of an operator on a value of such type is permitted without any type checking, and its resolution is postponed until run-time. This is known as duck typing. For example:

 // Returns the value of Length property or field of any object  int GetLength(dynamic obj)  {  return obj.Length;  }    GetLength("Hello, world"); // a string has a Length property,  GetLength(new int[] { 1, 2, 3 }); // and so does an array,  GetLength(42); // but not an integer - an exception will be thrown in GetLength method at run-time 

Dynamic method calls are triggered by a value of type dynamic as any implicit or explicit parameter (and not just a receiver). For example:

 void Print(dynamic obj)  {  System.Console.WriteLine(obj); // which overload of WriteLine() to call is decided at run-time  }  Print(123); // ends up calling WriteLine(int)  Print("abc"); // ends up calling WriteLine(string) 

Dynamic lookup is performed using three distinct mechanisms: COM IDispatch for COM objects, IDynamicMetaObjectProvider DLR interface for objects implementing that interface, and reflection for all other objects. Any C# class can therefore intercept dynamic calls on its instances by implementing IDynamicMetaObjectProvider.

In case of dynamic method and indexer calls, overload resolution happens at run-time according to the actual types of the values passed as arguments, but otherwise according to the usual C# overloading resolution rules. Furthermore, in cases where the receiver in a dynamic call is not itself dynamic, run-time overload resolution will only consider the methods that are exposed on the declared compile-time type of the receiver. For example:

class Base {  void Foo(double x); } class Derived : Base {  void Foo(int x); } dynamic x = 123; Base b = new Derived(); b.Foo(x); // picks Base.Foo(double) because b is of type Base, and Derived.Foo(int) is not exposed dynamic b1 = b; b1.Foo(x); // picks Derived.Foo(int) 

Any value returned from a dynamic member access is itself of type dynamic. Values of type dynamic are implicitly convertible both from and to any other type. In the code sample above this permits GetLength function to treat the value returned by a call to Length as an integer without any explicit cast. At run time the actual value will be converted to the requested type.

Covariant and contravariant generic type parameters edit

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 IEnumerable<T> has been redefined as follows:

interface IEnumerable<out T> {  IEnumerator<T> GetEnumerator(); } 

Therefore, any class that implements IEnumerable<Derived> for some class Derived is also considered to be compatible with IEnumerable<Base> for all classes and interfaces Base that Derived extends, directly or indirectly. In practice, it makes it possible to write code such as:

void PrintAll(IEnumerable<object> objects) {  foreach (object o in objects)  {  System.Console.WriteLine(o);  } } IEnumerable<string> strings = new List<string>(); PrintAll(strings); // IEnumerable<string> is implicitly converted to IEnumerable<object> 

For contravariance, the existing interface IComparer<T> has been redefined as follows:

public interface IComparer<in T> {  int Compare(T x, T y); } 

Therefore, any class that implements IComparer<Base> for some class Base is also considered to be compatible with IComparer<Derived> for all classes and interfaces Derived that are extended from Base. It makes it possible to write code such as:

IComparer<object> objectComparer = GetComparer(); IComparer<string> stringComparer = objectComparer; 

Optional ref keyword when using COM edit

The ref keyword for callers of methods is now optional when calling into methods supplied by COM interfaces. Given a COM method with the signature

void Increment(ref int x); 

the invocation can now be written as either

Increment(0); // no need for "ref" or a place holder variable any more 

or

int x = 0; Increment(ref x); 

Optional parameters and named arguments edit

C# 4.0 introduces optional parameters with default values as seen in Visual Basic and C++. For example:

void Increment(ref int x, int dx = 1) {  x += dx; } int x = 0; Increment(ref x); // dx takes the default value of 1, after the method returns x == 1 Increment(ref x, 2); // dx takes the value 2, after the method returns x == 3 

In addition, to complement optional parameters, it is possible explicitly to specify parameter names in method calls, allowing the programmer selectively to pass any 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 to 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); 

With support for optional parameters, the code can be shortened as

doc.SaveAs(ref fileName); 

Which, due to the now optional ref keyword when using COM, can further be shortened as

doc.SaveAs(fileName); 

Indexed properties edit

Indexed properties (and default properties) of COM objects are now recognized, but C# objects still do not support them.

References edit

  1. ^ "Microsoft Visual Studio 2010 First Look". Microsoft.
  2. ^ Burrows, Chris (2010). "C# 4.0 - New C# Features in the .NET Framework 4". Microsoft. Retrieved 2023-07-14.

External links edit

  • Burrows, Chris (2010). "C# 4.0 - New C# Features in the .NET Framework 4". Microsoft. Retrieved 2023-07-14.
  • C# 4.0 Language Specification

sharp, correct, title, this, article, substitution, technical, restrictions, version, programming, language, that, released, april, 2010, microsoft, released, runtime, development, environment, visual, studio, 2010, major, focus, interoperability, with, partia. The correct title of this article is C 4 0 The substitution of the is due to technical restrictions C 4 0 is a version of the C programming language that was released on April 11 2010 Microsoft released the 4 0 runtime and development environment Visual Studio 2010 1 The major focus of C 4 0 is interoperability with partially or fully dynamically typed languages and frameworks such as the Dynamic Language Runtime and COM Contents 1 Features 1 1 Dynamic member lookup 1 2 Covariant and contravariant generic type parameters 1 3 Optional ref keyword when using COM 1 4 Optional parameters and named arguments 1 5 Indexed properties 2 References 3 External linksFeatures editThe following new features were added in C 4 0 2 Dynamic member lookup edit A new pseudo type dynamic is introduced into the C type system It is treated as System Object but in addition any member access method call field property or indexer access or a delegate invocation or application of an operator on a value of such type is permitted without any type checking and its resolution is postponed until run time This is known as duck typing For example Returns the value of Length property or field of any object int GetLength dynamic obj return obj Length GetLength Hello world a string has a Length property GetLength new int 1 2 3 and so does an array GetLength 42 but not an integer an exception will be thrown in GetLength method at run time Dynamic method calls are triggered by a value of type dynamic as any implicit or explicit parameter and not just a receiver For example void Print dynamic obj System Console WriteLine obj which overload of WriteLine to call is decided at run time Print 123 ends up calling WriteLine int Print abc ends up calling WriteLine string Dynamic lookup is performed using three distinct mechanisms COM IDispatch for COM objects IDynamicMetaObjectProvider DLR interface for objects implementing that interface and reflection for all other objects Any C class can therefore intercept dynamic calls on its instances by implementing IDynamicMetaObjectProvider In case of dynamic method and indexer calls overload resolution happens at run time according to the actual types of the values passed as arguments but otherwise according to the usual C overloading resolution rules Furthermore in cases where the receiver in a dynamic call is not itself dynamic run time overload resolution will only consider the methods that are exposed on the declared compile time type of the receiver For example class Base void Foo double x class Derived Base void Foo int x dynamic x 123 Base b new Derived b Foo x picks Base Foo double because b is of type Base and Derived Foo int is not exposed dynamic b1 b b1 Foo x picks Derived Foo int Any value returned from a dynamic member access is itself of type dynamic Values of type dynamic are implicitly convertible both from and to any other type In the code sample above this permits GetLength function to treat the value returned by a call to Length as an integer without any explicit cast At run time the actual value will be converted to the requested type Covariant and contravariant generic type parameters edit 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 IEnumerable lt T gt has been redefined as follows interface IEnumerable lt out T gt IEnumerator lt T gt GetEnumerator Therefore any class that implements IEnumerable lt Derived gt for some class Derived is also considered to be compatible with IEnumerable lt Base gt for all classes and interfaces Base that Derived extends directly or indirectly In practice it makes it possible to write code such as void PrintAll IEnumerable lt object gt objects foreach object o in objects System Console WriteLine o IEnumerable lt string gt strings new List lt string gt PrintAll strings IEnumerable lt string gt is implicitly converted to IEnumerable lt object gt For contravariance the existing interface IComparer lt T gt has been redefined as follows public interface IComparer lt in T gt int Compare T x T y Therefore any class that implements IComparer lt Base gt for some class Base is also considered to be compatible with IComparer lt Derived gt for all classes and interfaces Derived that are extended from Base It makes it possible to write code such as IComparer lt object gt objectComparer GetComparer IComparer lt string gt stringComparer objectComparer Optional ref keyword when using COM edit The ref keyword for callers of methods is now optional when calling into methods supplied by COM interfaces Given a COM method with the signature void Increment ref int x the invocation can now be written as either Increment 0 no need for ref or a place holder variable any more or int x 0 Increment ref x Optional parameters and named arguments edit C 4 0 introduces optional parameters with default values as seen in Visual Basic and C For example void Increment ref int x int dx 1 x dx int x 0 Increment ref x dx takes the default value of 1 after the method returns x 1 Increment ref x 2 dx takes the value 2 after the method returns x 3 In addition to complement optional parameters it is possible explicitly to specify parameter names in method calls allowing the programmer selectively to pass any 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 to 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 With support for optional parameters the code can be shortened as doc SaveAs ref fileName Which due to the now optional ref keyword when using COM can further be shortened as doc SaveAs fileName Indexed properties edit Indexed properties and default properties of COM objects are now recognized but C objects still do not support them References edit Microsoft Visual Studio 2010 First Look Microsoft Burrows Chris 2010 C 4 0 New C Features in the NET Framework 4 Microsoft Retrieved 2023 07 14 External links editBurrows Chris 2010 C 4 0 New C Features in the NET Framework 4 Microsoft Retrieved 2023 07 14 C 4 0 Language Specification Retrieved from https en wikipedia org w index php title C Sharp 4 0 amp oldid 1165279429, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.