1. 隐含类型局部变量
var username = "John";
var userlist = new[] { "aa", "bb", "cc" };
foreach (var u in userlist)
Console.Write(u.ToString());
关键字var:让编译器推断变量的类型。
注意:
l 需要编译器自己去辨别的变量类型,必须在声明的时候赋值,不能是null值。
l 只能用于局部变量,用于字段是不可以的。
2. 匿名类型
var data = new { username = "John",age=26};
Console.WriteLine("username:{0};age:{1}",data.username,data.age);
匿名类型允许开发人员定义行内类型,无须显式的定义类型。
常与var一起使用,var用于声明匿名类型。
3. 扩展方法
public static class Helper
{
public static string MD5Hash(this string s)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");
}
public static bool In(this object o, IEnumerable b)
{
foreach (object obj in b)
{
if (obj == o)
return true;
}
return false;
}
}
//调用扩展方法
Console.WriteLine("123456".MD5Hash());
Console.WriteLine("1".In(new[]{"1","2","3"}));
很多时候我们需要对CLR类型进行一些操作,但无法扩展的CLR类型的方法,而扩展方法使得这些需求得以实现。
注意:
定义扩展方法时,只能在静态类中定义并且是静态方法,如果扩展方法名和原油方法名发生冲突,那么扩展方法将失效。
4. 自动属性
public class Person
{
public string username { get; protected set; }
public int age { get; set; }
public Person()
{
username = "John";
}
}
Person p = new Person();
Console.WriteLine(p.username);
个人认为这样的意义不是很大。
编译器自动生成get,set操作以及字段,并且开发者不能使用字段也不能自定义get,set操作。
开发者可以分别定义get,set的访问级别。
5. 对象初始化器
public class Person
{
public string username { get; set; }
public int age { get; set; }
public override string ToString()
{
return string.Format("username:{0};age:{1}",username,age);
//return base.ToString();
}
}
Person p = new Person() { username = "John", age = 26 };
Console.WriteLine(p.ToString());
C# 3.0的编译器自动做了setter的操作,简化了属性赋值操作;
注意:
l 允许只给一部分属性赋值,包括internal访问级别;
l 可以结合构造函数一起使用,并且构造函数初始化先于对象初始化执行。
6. 集合初始化器
public class Person
{
public string username { get; set; }
public int age { get; set; }
public override string ToString()
{
return string.Format("username:{0};age:{1}",username,age);
//return base.ToString();
}
}
var persons = new[] {
new Person{username="aa",age=1},
new Person{username="bb",age=2},
new Person{username="cc",age=3}
};
foreach (var p in persons)
Console.WriteLine(p);
7. Lambda表达式
//1个参数的案例
var list = new[] { "aa","bb","cc"};
var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));
foreach (var v in result)
Console.WriteLine(v);
Lambda表达式用于产生内联函数,其语法为:
(参数列表) => 表达式或语句块
注意:
参数列表:可以包含0~n个参数;
表达式或语句块:函数的实现部分(函数体)
8. 查询句法
static void Main(string[] args)
{
var persons = new[] {
new Person{username="aa",age=10},
new Person{username="bb",age=20},
new Person{username="cc",age=30}
};
var sql = from p in persons
where p.age >= 20
select p.username.ToUpper();
foreach (var p in sql)
Console.WriteLine(p);
}
浙公网安备 33010602011771号