C#中的语言特性“.NET研究”都是从何而来?

简介:   前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.Net 4中的新特性。但是事后才发现这个新特性是C# 4.0的语言特性,与.Net 4无关。其实也不只这一次,我平时也经常把语言、框架、运行时,有时甚至还有开发工具混为一谈。

  前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.Net 4中的新特性。但是事后才发现这个新特性是C# 4.0的语言特性,与.Net 4无关。其实也不只这一次,我平时也经常把语言、框架、运行时,有时甚至还有开发工具混为一谈。于是今天就总结一下C#中我感兴趣的几个语言特性是从何而来的。

  1.可选参数

  可选参数是C# 4.0中的新特性,其作用在于在调用者不提供参数值时给参数一个默认值,用起来是这样的:

 
  
static void Main( string [] args)
{
TestMethod();
TestMethod(
10 );
Console.ReadLine();
}
public static void TestMethod( int parameter = 5 )
{
Console.WriteLine(parameter);
}
以上的代码在第一次调用TestMethod时输出5,第二次输出10,也就是在没有给TestMethod提供参数值时,会自动以5作为参数值。

  该特性的实现依赖于OptionalAttribute和DefaultParameterValueAttribute这两个attribute,也就是说TestMethod这个方法完全可以声明为这样:

 
 
public static void TestMethod([Optional, DefaultParameterValue( 5 )] int parameter)
{
Console.WriteLine(parameter);
}

  而跑起来的结果是一样的。

  OptionalAttribute和DefaultParameterValueAttribute这两个attribute分别是在.Net 1.1和.Net 2.0中引入的,也就是说N年前大家就可以写拥有“可选参数”的方法了,只是用起来没有现在这么爽。

  只要您安装了.Net Framework 4.0(也就是说有了其中附带的新版的C上海徐汇企业网站制作#编译器),您就可以编写如上的代码而同时把target framework指定为.Net Framework 2.0到.Net Framework 4之间的任何版本。

  小总结:我在这个问题上犯的错误就在于将语言和框架混为一谈了。C#语言的第四版和.Net Framework的第四版一起发布,于是我就理所当然的认为C# 4.0中的新特性和.Net Framework 4有关系了。其实,只要微软的人愿意,他们完全可以在.Net Framework 2.0发布之后和.Net Framework 4.0发布之前的任意时间发布一款CTP的编译器来实现这一语言性特性,正如他们前不久发布的Asyn CTP一样。

  2.var关键字

  var关键字是在C# 3.0中引入的,其作用在于在声明局部变量时无需指定具体类型,用起来是这样的:

 
 
var str = " hello " ;
Console.WriteLine(str);var str
= " hello " ;
Console.上海徐汇企业网站设计与制作WriteLine(str);

  其结果和把var替换为string完全一样。

  这个语言特性看似鸡肋,实际上它的好处在于接收LinQ语句的返回值,比如说Enumerable.GroupBy的某几个重载的返回值是IEnumerable<IGrouping<TKey, TElement>>,如果每次用到group by的时候都需要写这么长的一串代码的话,那玩儿LinQ的快感想必是要降低不少呀。

  这个语言特性的实现要比可选参数简单一些,无需框架的支持,完全是语言规范和编译器的“合谋”。编译器在编译时根据赋值语句推断出真实的类型,编译出的IL中完全没有var的身影。

  3.泛型

  泛型是C# 2.0中新增的特性,也是.Net 2.0中的新特性。没有错,这次终于可以说它是.Net的新特性了,但是也只是.Net而不是.Net Framework。

  在C#语言层面实现泛型需要CLR的支持,可以说它是.Net世界中的一等公民,IL甚至为它修改了语法。

  比如说如下的类型声明:

public class TestClass<T>

  在编译为IL之后是这样的:

 
 
. class public auto ansi beforefieldinit TestClass < T >
extends [mscorlib]System.Object

  可见IL中新增了尖括号的用法。

  以上三个语言特性都比较典型。var关键字纯粹是语言层面的小甜头,只要有了能够理解var的编译器,使用哪个版本的CLR或者.Net Framework完全无所谓。

  可选参数需要编译器能理解参数名后面的赋值语句,同时也需要.Net Framework中提供的attribute上海闵行企业网站设计与制作的支持。

  泛型同时需要CLR和编译器的支持。

  如果列一张表的话,就是下面这样的:

语言特性 实现该特性需要的支持
var关键字 CLR() 框架() 编译器(
可选参数 CLR() 框架() 编译器(
泛型 CLR() 框架() 编译器(

  上表中每一项的编译器都打上了钩儿。很显然,每一项语法层面的特性都需要编译器的支持,要不然语言规范就只是一纸空文了。在这里还是把它列出来,仅求全面。

  写完之后自己看一遍,觉得很是有考据癖的老学究味道。微软总是把开发工具、框架类库、运行时和编译器的新版本一起发布,所以我们总是被弄得很被动,总是搞不清这几者之间区别。其实有时候把这些东西区分开来去观察,更有利于解释一些困惑。

  当然,最后的表格中列出的东西还是太少了,希望各位补充啊。

目录
相关文章
|
8天前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
PACS源码,C#语言数字医学影像系统成品源码
|
10天前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
在C#中,`this`关键字用于扩展方法,允许向已有类型添加功能而不修改其源代码。扩展方法必须在静态类中定义,且第一个参数使用`this`修饰,如`public static XElement AcquireElement(this XContainer container, string name, bool addFirst = false)`。这种方式增强了代码的可读性和类型的安全性,尤其在处理第三方库时。
|
1月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
43 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
20天前
|
存储 缓存 C#
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
|
1月前
|
Java C# 数据安全/隐私保护
|
1月前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
38 10
|
20天前
|
人工智能 开发框架 调度
C#/.NET这些实用的技巧和知识点你都知道吗?
C#/.NET这些实用的技巧和知识点你都知道吗?
|
1月前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
419 3
|
1月前
|
XML 开发框架 .NET
【.NET Core】常见C#代码约定
【.NET Core】常见C#代码约定
25 5
|
1月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
77 0