Constraints on Type Parameters
public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(s == t);
}
static void Main()
{
string s1 = "target";
System.Text.StringBuilder sb =
new System.Text.StringBuilder("target");
string s2 = sb.ToString();
OpTest(s1, s2);
}
Anonymous Types
var v = new { Amount = 108, Message = "Hello" };
Console.WriteLine(v.Amount + v.Message);
Lambda Expressions
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
LINQ Query Expressions
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
yield
using System.Collections;
public class PowersOf2
{
static void Main()
{
// Display powers of 2 up to the exponent of 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
static IEnumerable Power(int number, int exponent)
{
int result = 1;
for (int i = 0; i < exponent; i++)
{
result = result * number;
yield return result;
}
}
// Output: 2 4 8 16 32 64 128 256
}
var
var i = 10; // implicitly typed
int i = 10; //explicitly typed
using statement
using ASimpleName = Dictionary<string, Dictionary<string, List>>;
using block
using (DbTransaction tran = new DbTransaction())
{
DoQuery("...");
DoQuery("...");
}
volatile
class IfYouThinkYouUnderstandVolatile
{
volatile int x, y;
void Test1() // Executed on one thread
{
x = 1; // Volatile write (release-fence)
int a = y; // Volatile read (acquire-fence)
...
}
void Test2() // Executed on another thread
{
y = 1; // Volatile write (release-fence)
int b = x; // Volatile read (acquire-fence)
...
}
}
?? operator
class NullCoalesce
{
static int? GetNullableInt()
{
return null;
}
static string GetStringValue()
{
return null;
}
static void Main()
{
// ?? operator example.
int? x = null;
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
// Assign i to return value of method, unless
// return value is null, in which case assign
// default value of int to i.
int i = GetNullableInt() ?? default(int);
string s = GetStringValue();
// ?? also works with reference types.
// Display contents of s, unless s is null,
// in which case display "Unspecified".
Console.WriteLine(s ?? "Unspecified");
}
}
Verbatim string literals
"c:\\program files\\oldway"
@"c:\program files\newway"
object initializers
Employee emp = new Employee();
emp.Name = "John Smith";
emp.StartDate = DateTime.Now();
=>
Employee emp = new Employee {
Name="John Smith", StartDate=DateTime.Now()
}
#if DEBUG
[Conditional("DEBUG")]
static constructors
public class Example
{
static Example()
{
// Code to execute during type initialization
}
public Example()
{
// Code to execute during object initialization
}
}
Conditional string Format
string s = string.Format("{0:positive;negative;zero}", i);
string format = "000;-#;(0)";
string pos = 1.ToString(format); // 001
string neg = (-1).ToString(format); // -1
string zer = 0.ToString(format); // (0)
checked and unchecked
short x = 32767; // 32767 is the max value for short
short y = 32767;
int z1 = checked((short)(x + y)); // OverflowException
int z2 = unchecked((short)(x + y)); // will return -2
int z3 = (short)(x + y); // will return -2