C#语法糖汇总
C# 语法糖汇总
定义
语法糖(Syntactic sugar),也译为糖⾐语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的⼀个术语,指计算机语⾔中添加的某种语法,这种语法对语⾔的功能并没有影响,但是更⽅便程序员使⽤。
它可以使程序员更加容易去使⽤这门语⾔:操作可以变得更加清晰、⽅便,或者更加符合程序员的编程习惯。
简⽽⾔之,语法糖就是⼀种便捷写法。
1. ⾃动属性
未简化:⼿写私有变量+公有属性
private string _name;
public string Name
{
get{return _name;}
set{ _name =value;}
}
简化:声明空属性,编译器⾃动⽣成对应私有成员字段。
public string Name {get;set;}
2. 参数默认值和命名参数
使⽤的指导原则:
1、可以为⽅法和有参属性指定默认值
2、有默认值的参数,必须定义在没有默认值的参数之后
3、默认参数必须是常量
4、ref和out参数不能指定默认值
public class User
{
public string Name {get;set;}
public int Age {get;set;}
// ⾃动属性默认初始化
public string Address {get;set;}="江苏";
// 设置参数默认值(age)
public User(string name,string address,int age =18)
{
this.Name = name;
this.Age = age;
this.Address = address;
}
}
// 命名参数(指定address参数)
User user =new User("⼩王",address:"苏州");
3. 类型实例化
// 使⽤对象初始化器:{},使⽤对象初始化器,必须提供⼀个⽆参的构造函数,可以只给部分属性初始化
User user =new User()
{
Name ="⼩王",
Age =18,
Address ="苏州",
};
4. 集合writeline输出数值变量
4.1 初始化List集合的值
// 简化之前
List<string> listString =new List<string>();
listString.Add("⼩王");
listString.Add("⼩贤");
// 简化后
List<string> listString =new List<string>(){
"⼩王",
"⼩贤",
};
4.2 取List中的值
// 简化之前
foreach(string str in listString)
{
Console.WriteLine(str);
}
// 简化之后
listString.ForEach(s => Console.WriteLine(s));
5. 隐式类型(var)
程序员在声明变量时可以不指定类型,由编译器根据值来指定类型
var定义变量有以下四个特点:
1、必须在定义时初始化
2、⼀旦初始化完成,就不能再给变量赋与初始值不同类型的值了
3、var要求是局部变量
4、使⽤var定义变量和object不同,它在效率上和使⽤强类型⽅式定义变量完全⼀样
// 1.隐式类型在定义时必须初始化
//var name; 报错
var name ="⼩王";
/
/ 2.可以⽤同类型的其他隐式类型变量来初始化新的隐式类型变量
var age =18;
var ageTwo = age;
// 3.也可以⽤同类型的字⾯量来初始化隐式类型变量
var name ="⼩王";
name ="⼩贤";
// 4.隐式类型局部变量还可以初始化数组⽽不指定类型
var array =new List<string>(){"⼩王","⼩贤",};
6. 扩展⽅法
扩展⽅法使你能够向现有类型“添加”⽅法,⽽⽆需创建新的派⽣类型、重新编译或以其他⽅式修改原始类型。 扩展⽅法是⼀种特殊的静态⽅法,但可以像扩展类型上的实例⽅法⼀样进⾏调⽤。
注意:定义扩展⽅法的类必须和使⽤地⽅的类命名空间相同(如果不同命名空间记得先引⼊命名空间)
// 为string 添加⼀个扩展⽅法(判断string是否为空||null)
public static bool IsEmpty(this string str)
{
return string.IsNullOrEmpty(str);
}
7. 匿名类型(Anonymous type)
匿名类型提供了⼀种⽅便的⽅法,可⽤来将⼀组只读属性封装到单个对象中,⽽⽆需⾸先显式定义⼀个类型。 类型名由编译器⽣成,并且不能在源代码级使⽤。 每个属性的类型由编译器推断。可通过使⽤ new 运算符和对象初始值创建匿名类型。
匿名类型的限制:
1、匿名类型不⽀持事件、⾃定义⽅法和⾃定义重写
2、匿名类型是隐式封闭的
3、匿名类型的实例创建只使⽤默认构造函数
4、匿名类型没有提供可供控制的类名称(使⽤var定义的)
var unUser =new{ Name ="⼩王", Age =18, Phone ="123456"};
8. 匿名⽅法(Anonymous methods)
普通⽅法定义⽅式,因为⽅法的存在是为了复⽤⼀段代码,所以⼀般会给⽅法取个名字,这个⽅法的引⽤就可以通过“⽅法名”调⽤
匿名⽅法:
但是有的⽅法,不需要复⽤,仅仅是使⽤⼀次就够了,所以不需要⽅法名,这种⽅法就叫做匿名⽅法。
匿名⽅法必须结合委托使⽤。(潜在的意思就是:尽管没有⽅法名了,但⽅法的指针还是存放了某个委托对象中)
注意:
1、在编译后,会为每个匿名⽅法创建⼀个私有的静态⽅法,然后将此静态⽅法传给委托对象使⽤
2、匿名⽅法编译后会⽣成委托对象,⽣成⽅法,然后把⽅法装⼊委托对象,最后赋值给声明的委托变量
3、匿名⽅法可以省略参数,编译的时候会⾃动为这个⽅法按照委托签名的参数添加参数
9. dynamic动态对象
4.0中引⼊了⼀个新类型 dynamic.该类型是⼀种静态类型,但类型为 dynamic 的对象会跳过静态类型检查.⼤多数情况下,该对象就像具有类型 object ⼀样.在编译时,将假定类型化为 dynamic 的元素⽀持任何操作
dynamic dy ="string";
Console.WriteLine(dy.GetType());
//输出:System.String
dy =100;
Console.WriteLine(dy.GetType());
//输出:System.Int32
10. 字符串嵌⼊值
c#6.0后新增的特性 $,⽤于代替string.Format("")
// 之前
var str=string.Format("时间:{0}", DateTime.Now);
// 改进
var str=$"时间:{DateTime.Now}";
11. 问号(?)表达式
11.1 可空类型修饰符(?)
引⽤类型可以使⽤空引⽤表⽰⼀个不存在的值,⽽值类型通常不能表⽰为空。
string str =null;// 正确
//int i = null; // 错误
为了使值类型也可为空,就可以使⽤可空类型,,可以使⽤ Nullable泛型结构来定义,但是微软为了语法更简洁,提供了?运算符来定义可空类型,⼆者效果是⼀样的,基本语法如
下:
值类型? 变量名=值;
// 这⼆种定义可空类型的⽅法都是对的,但是?更简洁
Nullable<int> intOne =5;
int? intTwo =5;
11.2 三元(运算符)表达式(?: )
int gender =1;
string str = gender ==1?"男":"⼥";
11.3 合并运算符(??)
合并运算符使⽤??表⽰,当进⾏转换时,如果可空类型的值为 null,则使⽤默认值。
int? intA =null;
int intB =100;
intB = intA ??0;//此处intA为null,则将0赋值给intB
int? intC =500;
intB = intC ??0;//此处intC不为null,则将500赋值给intB
11.4 NULL检查运算符(?.)
C# 6.0中,引⼊了 ?. 的运算符,可帮助编写更少的代码来处理 null 检查
如果对象为NULL,则不进⾏后⾯的获取成员的运算,直接返回NULL
string str ="abcd";
string s1 =null;
Console.WriteLine(str?.Length);// 输出 4
Console.WriteLine(s1?.Length);// 输出空
11.5 "?[]"运算符
这个我还没有⽤过,⽹上例⼦
int? first = customers?[0].Orders.Count();
12. 使⽤完毕后⾃动释放资源(Using || try finally)
为了节约资源,每次使⽤完毕后都要释放掉资源,其中可以使⽤Using和try finally来进⾏释放资源操作。需要注意的是使⽤Using释放资源的对象都必须继承IDisposable接⼝(MSDN)。
// try finally 写法
SqlConnection conn =null;
try
{
conn =new SqlConnection("数据库连接字符串");
conn.Open();
}
finally
{
conn.Close();
conn.Dispose();
}
// Using写法
using(SqlConnection conn=new SqlConnection("数据库连接字符串"))
{
conn.Open();
}
13. 委托
13.1 基本⽤法
在 1.1时我们不得不声明⽅法后才在委托中使⽤
在 2.0之后我们可以使⽤匿名委托,他不单可以简化写法,还可以在匿名委托中访问范围内的变量;
再后来Lambda表达式来了,写法就更简便了。
class MyClass
{
//定义委托
public delegate void TestDelegate(string str);
//定义委托⽅法
public void Method(string str)
{
Console.WriteLine(str);
}
public void UseDelegate(TestDelegate d,string str)
{
d(str);
}
}
/
/调⽤委托
MyClass mc =new MyClass();
//调⽤定义的委托⽅法
mc.UseDelegate(new MyClass.TestDelegate(mc.Method),"Hello!");
//使⽤匿名委托
mc.UseDelegate(delegate(string str)
{
Console.WriteLine(str);
},"Hello!");
//使⽤Lambda表达式
mc.UseDelegate(s =>
{
Console.WriteLine(s);
},"Hello!");
13.2 内置委托
CLR环境中给我们内置了⼏个常⽤委托Action、 Action、Func、Predicate,⼀般我们要⽤到委托的时候,尽量不要⾃⼰再定义⼀ 个委托了,就⽤系统内置的这⼏个已经能够满⾜⼤部分的需求,且让代码符合规范。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。