.Net Framework 的版本信息
.NET Standard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 2.0 |
.NET Core | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 2.0 |
.NET Framework 1 | 4.5 | 4.5 | 4.5.1 | 4.6 | 4.6.1 | 4.6.1 | 4.6.1 | 4.6.1 |
Mono | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 5.4 |
Xamarin.iOS | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.14 |
Xamarin.Mac | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.8 |
Xamarin.Android | 7.0 | 7.0 | 7.0 | 7.0 | 7.0 | 7.0 | 7.0 | 8.0 |
Universal Windows Platform | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0.16299 | 10.0.16299 | 10.0.16299 |
Windows | 8.0 | 8.0 | 8.1 | |||||
Windows Phone | 8.1 | 8.1 | 8.1 | |||||
Windows Phone Silverlight | 8.0 |
VERSION 2.0
Geenerics 泛型
可以在类、方法中对使用的类型进行参数化
// Declare the generic class.
public class GenericList<T>
{
public void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declare a list of type int.
GenericList<int> list1 = new GenericList<int>();
list1.Add(1);
// Declare a list of type string.
GenericList<string> list2 = new GenericList<string>();
list2.Add("");
// Declare a list of type ExampleClass.
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
list3.Add(new ExampleClass());
}
}
泛型约束
可以给泛型的类型参数上加约束,可以要求这些类型参数满足一定的条件
约束 | 说明
—|—
where T: struct |类型参数需是值类型
where T : class |类型参数需是引用类型
where T : new() |类型参数要有一个public的无参构造函数
where T :
Partial types 部分类
public partial class Employee
{
public void DoWork()
{
}
}
public partial class Employee
{
public void GoToLunch()
{
}
}
Anonymous methods 匿名方法
delegate void Del(int x);
Del d = delegate(int k) { /* ... */ };
System.Threading.Thread t1 = new System.Threading.Thread (delegate() { System.Console.Write("Hello, "); } );
Nullable types 可控类型
System.Nullable
Iterators 迭代器
static void Main()
{
DaysOfTheWeek days = new DaysOfTheWeek();
foreach (string day in days)
{
Console.Write(day + " ");
}
// Output: Sun Mon Tue Wed Thu Fri Sat
Console.ReadKey();
}
public class DaysOfTheWeek : IEnumerable
{
private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
public IEnumerator GetEnumerator()
{
for (int index = 0; index < days.Length; index++)
{
// Yield each day of the week.
yield return days[index];
}
}
}
Covariance and Contravariance 委托的协变和逆变
// Assignment compatibility.
string str = "test";
// An object of a more derived type is assigned to an object of a less derived type.
object obj = str;
// Covariance.
IEnumerable<string> strings = new List<string>();
// An object that is instantiated with a more derived type argument
// is assigned to an object instantiated with a less derived type argument.
// Assignment compatibility is preserved.
IEnumerable<object> objects = strings;
// Contravariance.
// Assume that the following method is in the class:
// static void SetObject(object o) { }
Action<object> actObject = SetObject;
// An object that is instantiated with a less derived type argument
// is assigned to an object instantiated with a more derived type argument.
// Assignment compatibility is reversed.
Action<string> actString = actObject;
Default 默认类型
以使用在类型参数上:default(T); 对于值类型,返回0,引用类型,返回null,对于结构类型,会返回一个成员值全部为0的结构实例
Global 上层空间
解决类名重复问题,从最外面逐渐向内部寻找System类
global::System.Console.WriteLine(number);
Fiexd 固定类型
public fixed char pathName[128];
VERSION 3.0
Lamada表达式(=>)
委托 Delegate
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型 如:
public delegate int MethodDelegate(int x, int y);
private static MethodDelegate method;
static void Main(string[] args)
{
method = new MethodDelegate(Add);
Console.WriteLine(method(10,20));
Console.ReadKey();
}
private static int Add(int x, int y)
{
return x + y;
}
Action 无返回值的委托
一个无返回值、泛型的委托,有16重载,分别是0个参数~15个参数
delegate void Action();
delegate void Action
this.button1.Click += new Action<object, EventArgs>((sender, e) => {
MessageBox.Show("hellow");
});
如:
Thread t = new Thread(new ThreadStart(new Action(() => {
//线程代码
})));
t.Start();
Func 有返回值委托
带有返回值的委托。也是有15个重载 delegate TR Func(out TR); delegate TR Func<in T,out TR>(T obj); delegate TR Func<in T,in T1,out TR>(T obj,T1 obj1); delegate TR Func<in T,in T1,in T2,out TR>(T obj,T1 obj1,T2 obj2);
MessageBox.Show(new Func<string>(() => {
System.Net.WebClient wc = new System.Net.WebClient();
return wc.DownloadString("http://www.baidu.com");
})());
Expression 表达式树
Expression<Func<type,returnType» = (param) => lamdaexpresion;
Expression<Func<int, int, int>> expr = (x, y) => x+y;
Expression<Func<int, int, int>> expr = (x, y) => { return x + y; }; //会出现错误,需用API创建复杂的表达式树
类型推断 (Var)
var i = 5;
var s = "Hello";
扩展方法
public static class JeffClass
{
public static int StrToInt32(this string s)
{
return Int32.Parse(s);
}
}
自动属性(get、set)
会自动生成一个后台的私有变量
public Class Point
{
public int X { get; set; }
public int Y { get; set; }
}
查询表达式
from g in
from c in customers
group c by c.Country
select new { Country = g.Key, CustCount = g.Count() }
VERSION 4.0
斜变和逆变
支持针对泛型接口的协变和逆变
IList<string> strings = new List<string>();
IList<object> objects = strings;
可选参数和命名参数
private void CreateNewStudent(string name, int studentid = 0, int year = 1)
CreateNewStudent(year:2, name:"Hima", studentid: 4);
VERSION 5.0
异步编程
如:
static async void DownloadStringAsync2(Uri uri)
{
var webClient = new WebClient();
var result = await webClient.DownloadStringTaskAsync(uri);
Console.WriteLine(result);
}
之前的方法:
static void DownloadStringAsync(Uri uri)
{
var webClient = new WebClient();
webClient.DownloadStringCompleted += (s, e) =>
{
Console.WriteLine(e.Result);
};
webClient.DownloadStringAsync(uri);
}
调用用法信息
public void DoProcessing()
{
TraceMessage("Something happened.");
}
VERSION 6.0
自动属性初始化(Auto-property initializers)
public class Account
{
public string Name { get; set; } = "summit";
public int Age { get; set; } = 22;
public IList<int> AgeList
{
get;
set;
} = new List<int> { 10,20,30,40,50 };
}
字符串嵌入值(String interpolation)
Console.WriteLine($"年龄:{account.Age} 生日:{account.BirthDay.ToString("yyyy-MM-dd")}");
Console.WriteLine($"年龄:{account.Age}");
导入静态类(Using Static)
using static System.Math;//导入类
Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
Console.WriteLine($"导入后可直接使用方法: {Pow(4,2)}");
空值运算符(Null-conditional operators)
var age = account.AgeList?[0].ToString();
Console.WriteLine("{0}", (person.list?.Count ?? 0));
异常过滤器(Exception filters)
static void TestExceptionFilter()
{
try
{
Int32.Parse("s");
}
catch (Exception e) when (Log(e))
{
Console.WriteLine("catch");
return;
}
}
nameof表达式 (nameof expressions)
private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException("account");
}
catch和finally语句块里使用await(Await in catch and finally blocks)
Resource res = null;
try
{
res = await Resource.OpenAsync(…); // You could do this.
…
}
catch(ResourceException e)
{
await Resource.LogAsync(res, e); // Now you can do this …
}
finally
{
if (res != null) await res.CloseAsync(); // … and this.
}
属性使用Lambda表达式(Expression bodies on property-like function members)
public string Name =>string.Format("姓名: {0}", "summit");
public void Print() => Console.WriteLine(Name);
方法成员上使用Lambda表达式
static int LambdaFunc(int x, int y) => x*y;
public void Print() => Console.WriteLine(First + " " + Last);
VERSION 7.0
元祖 Tuple
( string, string, string, string) getEmpInfo()
{
//read EmpInfo from database or any other source and just return them
string strFirstName = "abc";
string strAddress = "Address";
string strCity= "City";
string strState= "State";
return (strFirstName, strAddress, strCity, strState); // tuple literal
return (strFName: strFirstName, strAdd: strAddress, strCity: strC, strState: strSt);
}
var empInfo= getEmpInfo();
析构函数
( string strFName, string strAdd, string strC, string strSt) = getEmpInfo();
Console.WriteLine($"Address: { strAdd }, Country: { strC }");
OUT输出变量
void AssignVal(out string strName)
{
strName = "I am from OUT";
}
AssignVal(out string szArgu);
不允许为空类型
int objNullVal; //non-nullable value type
int? objNotNullVal; //nullable value type
string! objNotNullRef; //non-nullable reference type
string objNullRef; //nullable reference type
本地方法和函数
private static void Main(string[] args)
{
int local_var = 100;
int LocalFunction(int arg1)
{
return local_var * arg1;
}
Console.WriteLine(LocalFunction(100));
}
模式匹配
class Calculate();
class Add(int a, int b, int c) : Calculate;
class Substract(int a, int b) : Calculate;
class Multiply(int a, int b, int c) : Calculate;
Calculate objCal = new Multiply(2, 3, 4);
switch (objCal)
{
case Add(int a, int b, int c):
//code goes here
break;
case Substract(int a, int b):
//code goes here
break;
case Multiply(int a, int b, int c):
//code goes here
break;
default:
//default case
break;
}
通过Ref返回
ref string getFromList(string strVal, string[] Values)
{
foreach (string val1 in Values)
{
if (strVal == val1)
return ref val1; //return location as ref not actual value
}
}
string[] values = { "a", "b", "c", "d" };
ref string strSubstitute = ref getFromList("b", values);
strSubstitute = "K"; // replaces 7 with 9 in the array
System.Write(values[1]); // it prints "K"
表达式错误
Throw Exception from Expression
public string getEmpInfo( string EmpName)
{
string[] empArr = EmpName.Split(",");
return (empArr.Length > 0) ? empArr[0] : throw new Exception("Emp Info Not exist");
}