C Sharp 4.0C# 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. FeaturesThe following new features were added in C# 4.0.[2] Dynamic member lookupA new pseudo-type // 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 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, 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 Covariant and contravariant generic type parametersGeneric interfaces and delegates can have their type parameters marked as covariant or contravariant using keywords interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
Therefore, any class that implements 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 public interface IComparer<in T>
{
int Compare(T x, T y);
}
Therefore, any class that implements IComparer<object> objectComparer = GetComparer();
IComparer<string> stringComparer = objectComparer;
Optional ref keyword when using COMThe 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 argumentsC# 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 doc.SaveAs(fileName);
Indexed propertiesIndexed properties (and default properties) of COM objects are now recognized, but C# objects still do not support them. References
External links
|