C# 语法糖(Syntactic sugar)
定义
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。
它可以使程序员更加容易去使用这门语言:操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯。
简而言之,语法糖就是一种便捷写法。
1.属性
早些时候我们这样声明Property
private string _myName; public string MyName {get { return _myName; }set { _myName = value; } }
千篇一律的这样声明,没有多大意义,于是C#的设计人员将这个千篇一律的工作交给了编译器帮我们做了,我们现在可以这样声明
public string MyName { get; set; }
当然他不会牺牲灵活性,我们可以单独给get或者set设定访问限制符,例如
public string MyName { get; protected internal 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. 集合
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" };
1
8. 匿名方法(Anonymous methods)
普通方法定义方式,因为方法的存在是为了复用一段代码,所以一般会给方法取个名字,这个方法的引用就可以通过“方法名”调用
匿名方法:
但是有的方法,不需要复用,仅仅是使用一次就够了,所以不需要方法名,这种方法就叫做匿名方法。
匿名方法必须结合委托使用。(潜在的意思就是:尽管没有方法名了,但方法的指针还是存放了某个委托对象中)
注意:
1、在编译后,会为每个匿名方法创建一个私有的静态方法,然后将此静态方法传给委托对象使用
2、匿名方法编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给声明的委托变量
3、匿名方法可以省略参数,编译的时候会自动为这个方法按照委托签名的参数添加参数
9. dynamic动态对象
.net4.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 ? "男" : "女";
1
2
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 检查,
“空值传播运算符”,《C# 本质论》中翻译为null条件操作符,
如果对象为NULL,则不进行后面的获取成员的运算,直接返回NULL
判空检查 Null空值传播运算符(?.)_Peter_Gao_的博客-CSDN博客
string str = "abcd";
string s1 = null;
Console.WriteLine(str?.Length);// 输出 4
Console.WriteLine(s1?.Length);// 输出空
11.5 "?[]"运算符
这个我还没有用过,网上例子
int? first = customers?[0].Orders.Count();
1
12. Using || try finally
使用完毕后自动释放资源(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 基本用法
在.net 1.1时我们不得不声明方法后才在委托中使用
在.net 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,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范。
查看该博客了解更多
C#委托Action、Action、Func、Predicate
14. Lambda表达式
Lambda表达式是比匿名方法更简洁的一种匿名方法语法
最基本的Lambda表达式语法:
{参数列表}=>{方法体}
例如:
(int x)=>{returm x+1}
说明:
1、参数列表中的参数类型可以是明确类型或推断类型
2、如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来
如果参数列表只包含一个推断类型参数时:
参数列表=>{方法体}
前提:x的数据类型可以根据上下文推断出来
x =>{returm x+1}
如果方法体只包含一条语句时:
{参数列表}=>表达式
{int x} => x+1;
Lambda表达式示例:
1、多参数,推断类型参数列表,表达式方法体
(x,y) => x*y
2、无参数,表达式方法体
() => Console.WriteLine()
3、多参数,推断类型参数列表,多语句方法体,需要使用{}
(x,y) => {Console.WriteLine(x);Console.WriteLine(y)}
Lambda表达式缩写推演
new Func<string,int>(delegate(string str){return str.Length;});//内置委托
delegate(string str){return str.Length;}//匿名方法
(string str)=>{return str.Length};//Lambda表达式
(str)=>str.Length;//让编译器推断类型
str=>str>Length;//去掉不必要的括弧
15. 标准查询运算符Linq
Linq:语言集成查询
Linq是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Server数据库等等。
Linq to Objects:主要负责对象的查询
Linq to XML:主要负责XML的查询
Linq to ADO.NET:主要负责数据库的查询
Linq to SQL
Linq to DataSet
Linq to Entities
Linq查询的两种方式:
1、查询方法方式:主要利用System.Linq.Enumerable类中定义的扩展方法和Lambda表达式进行查询
2、查询语句方式:一种更接近SQL语法的查询方式
查询语句VS查询方法
1、CLR本身并不理解查询语句,它只理解查询方法
2、编译器负责在编译时将查询语句翻译成查询方法
3、大部分查询方法都有对应的查询语句形式:Select()对应select、OrderBy()对应orderby
4、部分查询方法目前在C#中还没有对应的查询语句,如:Count()和Max()这时只能采用以下替代方案:
查询方法
查询语句+查询方法的混合方式
————————————————
C#语法糖(Csharp Syntactic sugar)_a572893208的博客-CSDN博客
C#十种语法糖 - .NET开发菜鸟 - 博客园
https://blog.csdn.net/boyyus/article/details/100638651
C# 语法糖(Syntactic sugar)相关推荐
- python语法糖是什么_Python语法糖Syntactic Sugar
语法糖(Syntactic sugar): 计算机语言中特殊的某种语法 这种语法对语言的功能并没有影响 对于程序员有更好的易用性 能够增加程序的可读性 简而言之,语法糖就是程序语言中提供[奇技淫巧]的 ...
- 语法糖 Syntactic sugar: 复杂代码的等价简洁替代
语法糖(Syntactic sugar) 在不改变代码所在位置.语法结构的前提下,实现了运行时的等价代码更简洁流畅,代码更语义自然,可读性高 写着爽,看着爽,就像吃了糖,效率高,错误少 例: 最基本的 ...
- Java 中的语法糖 (Syntactic Sugar)
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便 ...
- 语法糖(Syntax Sugar)Python
语法糖让程序更加简洁,有更高的可读性 连续比较 1 < x < 10 (x>1 and x<10) 三元表达式(结果一 if 判断条件 else 结果二) 推导表达式 推导表 ...
- syntactic sugar - 语法糖 - 糖衣语法
syntactic sugar - 语法糖 - 糖衣语法 语法糖 (syntactic sugar),亦称为糖衣语法,是英国计算机科学家彼得 - 约翰 - 兰达 (Peter J. Landin) 发 ...
- ef 在此上下文中只支持基本类型或枚举类型_Java 中的 6 颗语法糖
作者:Java 技术栈来源:SegmentFault 思否社区 原文作者:danchu原文链接:https://blog.csdn.net/danchu/article/details/5498644 ...
- java语法糖效率高吗_打包 Java将持续向“高糖”方向发展,你真的了解Java语法糖吗? _好机友...
Java语法糖概念 1. 语法糖Syntactic Sugar 糖衣语法,方便开发人员使用,JVM并不识别,会在编译阶段解语法糖,还原为基础语法. 2. com.sun.tools.javac.mai ...
- 很傻很天真的问题: 什么是语法糖!
一直不太理解语法糖的意思,闲来搜索了下原来如此 语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编 ...
- C#【汇总篇】语法糖汇总
文章目录 0.语法糖简介 1.自动属性 2.参数默认值和命名参数 3.类型实例化 4.集合 4.1 初始化List集合的值 4.2 取List中的值 5.隐式类型(var) 6.扩展方法[更换测试实例 ...
最新文章
- kd-tree理论以及在PCL 中的代码的实现
- leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!
- java 二分查找
- python自动化干什么-python已经自动化了,大家一般用什么测试框架?
- Visual Studio 2013 出现错误 error RC2108: expected numerical dialog constant
- 使用场景_天然气重卡使用痛点及应用场景研究
- curl命令使用介绍
- JeecgUniapp移动框架 2.0版本发布,一份代码多终端适配
- 【转】SVN中的Branches分支以及Tags标签详解与应用举例
- windows环境下neo4j下载安装配置
- pip安装第三方库 报错:You should consider upgrading
- ZDNET的一个技术博客评选结果
- 努比亚计科学计算机,最后6天倒计时 努比亚为您揭晓未来科技
- 易經大意(6) 三和 韓長庚 著
- 计算机工程ei是不是不检索了,EI检索的中文期刊_EI检索号查询_如何查询EI检索...
- 陶云机器人_小帅智能机器人app
- Miscellaneous Errors
- Vue - 路由传递参数
- mycafe目前服务器正在维护,【图片】咖啡厅全剧情记录(修正重发)【mycafe吧】_百度贴吧...
- 作为一名计算机学院普通的大学生如何提高兴趣敲代码?谈谈我的感受,欢迎交流
热门文章
- SQL UCASE() 函数、 LCASE() 函数
- git cherry-pick 的时候出现git cherry-pick xxx fatal: bad object xxx
- 气质由内而外 都市白领3个饮食排毒法则
- 期待台湾出现 OpenNMS Certified Partner
- 老男孩网络安全2021
- R语言 时间序列arima模型
- java为word添加水印,图片水印和文字水印
- 尼尔·斯蒂芬森 (Neal Stephenson) 谈他的新地球工程气候变化惊悚片并创造了“元宇宙”一词...
- 基于单片机多功能万年历系统毕业设计(完整资料)
- 不是你不懂黑盒攻击,而是你还不懂SurFree