本文梳理下C#从1.0到7.0版本的一些常用特性,对于不常用的或者我没有用到过的一些特性,会列出来,但不会做详细描述。...可空类型就是允许值类型的值为null。...在C#1中通常使用”魔值“来处理这种情况,比如DateTiem.MinValue、Int32.MinValue。在ADO.NET中所有类型的空值可以用DBNull.Value来表示。...C#2中可空类型主要是使用System.Nullable的泛型类型,类型参数T有值类型约束。...GetUserName()); 注:虽然这个语法糖非常简单,也很好用,但在使用时也需要多想一步,当对象为空时,调用其方法返回的值也是空,这样的值对后续的操作会不会有影响,如果有,还是需要做判断,并做相关的处理
C# 11已与.NET 7一起发布,本文按照.NET的发布顺序,根据微软官方文档整理C#中一些有趣的语法特性。 注:基于不同.NET平台创建的项目,默认支持的C#版本是不一样的。...C# 3推出了杀手锏功能,查询表达式,即语言集成查询(LINQ)。...Invoke(this, EventArgs.Empty); } 内插字符串 从C# 6开始,可以使用在字符串中插入表达式,使代码可读性更高也降低了字符串拼接出错的概率。...如下列举了一些弃元的使用场景: // 场景一:丢弃元组值 (_, _, area) = city.GetCityInformation(cityName); // 场景二:从C# 9开始,可以丢弃Lambda...switch表达式相较于switch语句的改进之处在于: 变量在switch关键字之前; 使用=>替换case :结构; 使用弃元_替换default运算符; 使用表达式替换语句。
在本文中,我们将讨论可空类型和空合并操作符以及如何在基于c#的代码中使用它们。 这是c#编程中的一个基本概念。在这里,我将解释可空类型,c#中的空合并操作符,以及如何在LINQ中使用该操作符。...c#中的数据类型分为两大类:值类型和引用类型。 值类型变量不能为空,但是我们可以在引用类型变量中指定一个空值。 让我们检查当我们给值类型赋空时将会发生什么。 ?...x = null; 上面展示了在c#中将非空值类型转换为空值类型的两种方法。由此,我们可以得出这样的结论:如果一个类型可以被赋值,或者可以赋值为null,那么这个类型就是可空的。...默认情况下,所有引用类型,例如字符串,都是可空的,但是所有的值类型,如Int32,都不是。 可空类型有两个成员。 1、 HasValue:HasValue是布尔值类型。...是c#中的一个重要运算符。根据MSDN的定义:?操作符称为null-coalescing操作符,用于为可空值类型或引用类型定义一个默认值。它返回左操作数,如果操作数不为空;否则,它返回正确的操作数。
Enumerable.ReverseQueryable.Reverse 查询表达式语法示例 主要排序示例 主要升序排序 下面的示例演示如何在 LINQ 查询中使用 orderby 子句按字符串长度对数组中的字符串进行升序排序...该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。...(LINQ) (C#) 09 生成运算 生成是指创建新的值序列。...方法 方法名 说明 C# 查询表达式语法 详细信息 DefaultIfEmpty 用默认值单一实例集合替换空集合。 不适用。...LINQ 查询中的转换运算可用于各种应用程序。 以下是一些示例: Enumerable.AsEnumerable 方法可用于隐藏类型的标准查询运算符自定义实现。
当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。...在面对这些要求时,我们有时候会写一些静态类包含一些静态方法。但是过多的静态方法会造成额外的不必要的开销。...(3).C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。 (4).C#编译要求“导入”扩展方法。...(6).用一个扩展方法扩展一个类型时,同时也扩展了派生类型。 ...四.扩展方法实例: 由于扩展方法实际是对一个静态方法的调用,所以CLR不会生成代码对调用方法的表达式的值进行null值检查 1.异常处理代码: ///
C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。 有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。...这个是大家熟悉的LINQ语句,如果没学过没关系,这里用的只是很简单的几个方法,相信大家都能看懂。 首先定义一个Citys集合,初始化有一些数据。...然后调用LINQ的first方法,查询出来长度大于7的第一个结果,看到了吧,这里用的就是Lambda表达式, 如果我们自己写,还要写循环遍历集合,然后判断字符串长度是否大于7,起码要写四五行代码,而这里只要一行就够了...,而且LINQ也要写很长。...2013替换成为2014,当然还可以是将其他字符串替换城任何内容,或者是截取,连接等等,完全由我们传入的Lambda表达式决定,到了这里感觉到Lambda表达式的强大了吧。
再在后面用C#的两种LINQ语法分别实现。...基础语法Ⅰ 在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,作为后面查询和输出的数据源,参见这篇文章C#进阶之LINQ表达式总结完成准备工作。...C#版本2是LINQ的一种扩展写法,是更加常用的写法。...u.age u.age).Average(); 35 /* 输出结果 */ ④ Max/Min/Sum/ 最大/小值/...总和 这里仅需参考LINQ求平均值的例子,求最大/小值或者总和时,只需要把C#语句末尾的.Average()方法替换成.Max()/.Min()/.Sum()即可。
再在后面用C#的两种LINQ语法分别实现。...一、LINQ表达式学前准备在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,作为后面查询和输出的数据源。...C#版本2是LINQ的一种扩展写法,是更加常用的写法。...总和这里仅需参考LINQ求平均值的例子,求最大/小值或者总和时,只需要把C#语句末尾的.Average()方法替换成.Max()/.Min()/.Sum()即可。...,才会返回True,只要有一条不满足就返回False;All()函数的语法和Any()函数的语法相同,上面的例子把Any()直接替换成All()即可。
在各种开发语言字符串的处理都大同小异,下面我们看一下在 C# 语言中提供了对字符串类型数据操作的方法,例如截取字符串中的内容、查找字符串中的内容等。...,这样会让你写很多冗余的代码,C#有单独的函数来处理字符串首字母和结尾字符是否包含某个字符。...现在用linq可能大家很少用拼接字符串传值,之前写传统的sql语句的时候,在C#里写好一个sql语句,里面的传值,我们会用这个方式把变量的值拼接到字符串里 Console.WriteLine("对比两个字符串是否相同...,有些人用来判断这个字符串是否包含这个字符,相当于IndexOf的值大于-1肯定就是存在,不过我一般用包含那个函数 //字符在当前字符串中第一次出现的索引,索引从 0 开始 Console.WriteLine...判空 这个没有什么可说的,几乎我们每个功能都会需要这个函数,判断这个字符串是否为空,如果为空就不添加这个条件,这种操作很常见。
FirstName; 如果person为空,返回的值就是null,是string的默认值,如果FirstName是int类型,那返回的就是int的默认值0。...6$ 字符串内插 新的字符串内插功能可以在字符串中嵌入表达式。...将 case 和 : 元素替换为 =>。 它更简洁,更直观。 将 default 事例替换为 _ 弃元。 正文是表达式,不是语句。...5元组模式 一些算法依赖于多个输入。 使用元组模式,可根据表示为元组的多个值进行切换。...", (_, _) => "tie" }; 如果person为空,返回的值就是null,是string的默认值,如果FirstName是int类型,那返回的就是int的默认值0。
如果你使用的是 C# 6.0 及其以上版本的话我建议你使用新增的 内插字符串 这个功能。这个功能可以更好的帮助开发人员设置字符串格式。...开发人员必须对生成的字符串进行测试和验证,才能发现其中出现的问题; 替换操作是根据格式字符串中序号来完成的,但是编译器并不会验证格式字符串待替换序号数量和参数的个数是否相等,因此在程序运行时就会报错,提示参数个数与待替换序号数量不匹配...; 参数顺序需要和待替换序号的顺序一致,但是开发人员不太容易看出参数顺序是否和待替换序号的顺序是否一致; 上述三种问题在出现后虽然可以修复,但是会花费一定的时间来解决,因此在 C# 6.0 及其以上版本中我们可以使用内插字符串来替代...成年人":"未成年人")}"); 我们在开发过程中也会经常用到 null 合并运算符与 null 条件运算符来处理可能存在的缺失值,这两种运算符在内插字符串中同样适用: Console.WriteLine...名字丢失"}"); 内插字符串的强大之处还在于我们可以在其中使用 LINQ 查询来创建内容,并且 LINQ 查询操作本身也可以利用内插字符串来调整查询结果的格式: var message = $@
本篇文章我们将演示LINQ扩展包的基础语法,以Any、All、Single、Skip、Take、Top等函数为例,目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种...LINQ语法分别实现。...LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。...基础语法Ⅱ 在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,作为后面查询和输出的数据源,参见这篇文章C#进阶之LINQ表达式总结完成准备工作。...,才会返回True,只要有一条不满足就返回False;All()函数的语法和Any()函数的语法相同,上面的例子把Any()直接替换成All()即可。
参考链接: Python字符串插值 字符串插值 QueryProvider的细节 (Specifics of QueryProvider) QueryProvider can’t deal with...can’t deal with any sentence using an interpolated string, but it’ll easily deal with this: 它无法使用插值字符串处理任何句子...Now let’s replace interpolation with concatenation, and for that we’ll need this method: 现在让我们用级联替换插值...让我们写一个扩展方法,我们可以调用它来替换插值。 ...replacing the original Expression Tree with ours: 我们可以获取一个Expression ,将其交给Visitor ,然后调用CreateQuery方法,用我们的方法替换原始的
我这里指的是,尽管有理由期望 C# 会一直不断添加新功能,但遗憾的是,同时也存在着一些问题。 请注意,我所指的问题不是 bug,而是根本问题。...无法运行静态流分析,进而也就无法检查所有路径是否有空值(若为空,取消引用它)。例如,检查是否有非托管代码调用、多线程或基于运行时条件的空分配/替换。...目前的实际情况是,字符串 text; 会生成 text 引用类型,它不仅允许文本为空,还要求文本应为空,实际上文本在许多情况下(如在字段或数组中)都默认为空。...请注意,必须有相应的框架版本,才能使用此功能(自 C# 2.0 和通用支持发布起就没有此要求)。 扩展渗透到方方面面:LINQ 引入了扩展方法。...Hejlsberg 先生告诉我,团队仅在考虑对 LINQ 实现必需的扩展。
今天说一说c# access数据库[连接数据库代码],希望能够帮助大家进步!!!...做一个用VS2012的C#连接Access数据库的备忘, SQL数据库固然强大,有大微软的强力技术支持,LINQ的方便操作,但是如果写一个小程序对数据库方面没有什么大的要求的话,将来在数据库方面就可以选择使用...原来是出在HasRows的使用上,只要SqlDataReader存在数据流(数据流不为空)则返回的bool值为真,这样的话,这个循环总执行(难怪使用try ..catch 假死)。...数据为空时,read[0]读取数据时,则会出现错误! 那么如何避免出现该错误呢,仍然是用HasRows属性? 可以想到只需利用if语句取消循环状态!! 那么要用while怎么办呢?...则只需将reader.Read()替换reader.HasRows执行循环,为什么行呢? SqlDataReader的默认位置在[第一条记录前面]。因此,必须调用 Read 来开始访问任何数据。
你在 LINQ 查询中会经常看到这种情况。 可以通过导入 Enumerable 或 Queryable 来导入 LINQ 模式。...06 字符串内插 使用 C# 6,新的字符串内插功能可以在字符串中嵌入表达式。...,请参阅 字符串内插 一文和 C# 中字符串内插、 符合格式设置 教程。...在早期版本的 C# 中,可以将集合初始值设定项用于序列样式集合,包括在键值对周围添加括号而得到 Dictionary: private Dictionary<int, string...12 改进了重载解析 在以前的一些构造中,以前版本的 C# 编译器可能会发现涉及 lambda 表达式的一些方法不明确。
以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型。...通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。...如果出现这种情况,你可以按以下示例中所示方式显式指定类型: C#复制 (int x, string s) => s.Length > x 使用空括号指定零个输入参数: C#复制 () => SomeMethod...以下介绍了部分功能: 静态导入 异常筛选器 属性初始值设定项 Expression bodied 成员 Null 传播器 字符串内插 nameof 运算符 字典初始值设定项 这些功能每一个都很有趣。...C# 编译器现在是用 C# 编写的,你可以使用编译器作为编程工作的一部分。 C# 7.0 版 C# 7.0 版是最新的主版本。 虽然该版本继承和发展了 C# 6.0,但不包含编译器即服务。
因此,我们在保存一些类的公共信息时,就会使用静态变量。...运行结果: A:,a: 占位符从零开始计数,且占位符中的数字不能大于第二个参数的个数减一(要求占位符必须有可替换的值...int类型, * 但是该方式比int.Parse(string s) 好一些, * 它不会出现异常,最后一个参数result是输出值,...比如: * * 如此可见,我们在进行数据转换前选择转换方法要谨慎,如果是数字类型可以考虑直接用(int)强制转换, * 如果是整型字符串类型的...,考虑用 int.Parse() 进行转换,如果不是这两种类型, * 再考虑用 Convert.ToInt32() 进行转换。
对于Linq to object,当集合对象是 IEnumerable 时,对单个对象进行迭代的方式是:先把单个对象走完所有的Linq方法后,直到最后或者执行到返回值不是IEnumerable的Linq...如果Linq方法的返回值不是IEnumerable,单个对象的迭代会到该方法(含)为止,会立即进行下一个对象的迭代。...前2个框可以点开看看一些选择项,第3个框可以输入一些代码,代码里可以使用变量/方法,会有智能提示的。 注意:lambda表达式的参数没有提示,需要手动输入参数名和参数的属性/方法。...我们可以在输入框里输入一些字符串,字符串里可以使用变量/有返回值的方法,不过它们必须要放在 {} 里,会有智能提示的。 注意:lambda表达式的参数没有提示,需要手动输入参数名和参数的属性/方法。...使用OzCode VS插件OzCode很强大,每一个Linq语句的执行结果都能统计并展示出来,详情参考:如何在C#中调试LINQ查询 和 如何在C#中调试LINQ查询 使用LinqPad LinqPad
尽管参考了微软的官方文档,但所列特性难免基于我所接触使用到的狭隘范围,用中括号附上短评(如【我是短评】),用以提示,希望不至于画蛇添足吧。...看看这些金光闪闪的特性吧: 泛型 分部类型【partial 关键字】 匿名方法【利用 delegate 运算符】 可为空的值类型【Nullable 或 T?...尽管我习惯用 Lambda 表达式与链式调用来写 LINQ ,但是查询表达式写法的 LINQ 实在是太惊艳了。...2010 一起发布,引入了一些小改进。...[]】 字符串内插【$"{foo} {bar}"】 nameof 表达式【nameof(Foo)】 C# 7.0 发布日期:2017 年 3 月 C# 7.0 版已与 Visual Studio 2017
领取专属 10元无门槛券
手把手带您无忧上云