族谱网 头条 人物百科

C#

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:636
转发:0
评论:0
命名C#(实为“C♯”)的发音类似语英文读音“seesharp”,“♯”读作“sharp”(国际音标:/ʃɑ:p/),命名启发于音乐上的音名“C♯”(C升半音)。其正确写法应和音名一样为“C♯”,但大多数情况下“♯”符号被井号“#”所混用;两者差别是:“♯”的笔画是上下偏斜的,而“#”的笔画是左右偏斜。C#看起来像是“C++”中两个加号重叠在一起,而且在音乐中“C♯”表示C升半音,为比C高一点的音节。微软借助这样的命名,表示C#在一些语言特性方面对C++的提升的意思。微软希望借助这种语言来取代Java。C#已经成为Ecma国际和国际标准组织的标准规范。设计目标ECMA标准列出的C#设计目标:C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(GarbageCol...

命名

C#(实为“C♯”)的发音类似语英文读音“see sharp”,“♯”读作“sharp”(国际音标:/ʃɑ:p/),命名启发于音乐上的音名“C♯”(C升半音)。其正确写法应和音名一样为“C♯”,但大多数情况下“♯”符号被井号“#”所混用;两者差别是:“♯”的笔画是上下偏斜的,而“#”的笔画是左右偏斜。C#看起来像是“C++”中两个加号重叠在一起,而且在音乐中“C♯”表示C升半音,为比C高一点的音节。微软借助这样的命名,表示C#在一些语言特性方面对C++的提升的意思。微软希望借助这种语言来取代Java。C#已经成为Ecma国际和国际标准组织的标准规范。

设计目标

ECMA标准列出的C#设计目标:

C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言

此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种内存自动释放技术)。软件必须做到强大、持久,并具有较强的编程生产力。

此种语言为在分布式环境中的开发提供适用的组件开发应用。

为使程序员容易迁移到这种语言,源代码的可移植性十分重要,尤其是对于那些已熟悉C和C++的程序员而言。

对国际化的支持非常重要。

C#适合为独立和嵌入式的系统编写程序,从使用复杂操作系统的大型系统到特定应用的小型系统均适用。

虽然C#程序在存储和操作能力需求方面具备经济性,但 此种语言在某些情况下并不能在性能和程序大小方面与C语言相抗衡。

历史

原Borland公司的首席研发设计师安德斯·海尔斯伯格(Anders Hejlsberg)在微软开发了Visual J++1.0,很快的Visual J++由1.1版本升级到6.0版。SUN公司认为Visual J++ 违反了Java开发平台的中立性,对微软提出了诉讼。2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,发表新的语言C#。C#语言取代了Visual J++,语言本身深受Visual Basic、Java、C和C++ 的影响。

版本

语言特性

相对于C和C++,这个语言在许多方面进行了限制和增强:

指针(Pointer)只能被用于不安全模式。大多数对象访问通过安全的引用实现,以避免无效的调用,并且有许多算法用于验证溢出,指针只能用于调用值类型,以及受垃圾收集控制的托管对象。

对象不能被显式释放,代替为当不存在被引用时通过垃圾回收器回收。

只允许单一继承(single inheritance),但是一个类可以实现多个接口(interfaces)。

C#比C++更加类型安全。默认的安全转换是隐含转换,例如由短整型转换为长整型和从派生类转换为基类。而接口布尔型同整型,及枚举型同整型不允许隐含转换,非空指针(通过引用相似对象)同用户定义类型的隐含转换字段被显式的确定,不同于C++的复制构造函数。

数组声明语法不同("int[] a = new int[5]"而不是"int a[5]")。

枚举位于其所在的名字空间中。

C#中没有模版(Template),但是在C# 2.0中引入了泛型(Generic programming),并且支持一些C++模版不支持的特性。比如泛型参数中的类型约束。另一方面,表达式不能像C++模版中被用于类型参数。

属性支持,使用类似访问成员的方式调用。

完整的反射支持。

C# 2.0的特性

针对于.NET SDK 2.0(相对应于ECMA-334标准第三版),C# 的新特性有:

分部类型

分部类型将类型的实现分在多个文件中。该概念于C# 中首次出现,除了能将一个类型的成员分开存放,还使ASP.NET中的代码后置得以实现。代码后置实现了HTML代码和后台交互代码的分离。

file1.cs:

publicpartialclassMyClass1{publicvoidMyMethod1(){// implementation}}

file2.cs:

publicpartialclassMyClass1{publicvoidMyMethod2(){// implementation}}

分部类型这个特性允许将一个类型的编写工作分配给多个人,一人写一个文件,便于版本控制。它又可以隔离自动生成的代码和人工书写的代码,例如设计窗体应用程序时。

泛型

泛型,或参数化类型,是被C#支持的.NET 2.0特性。不同于C++模版,.NET参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行。它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,.NET generics使用具化生成泛型参数,它允许优化和保存类型信息。

静态类型

静态类型它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。

迭代器

一种新形式的迭代器它提供了函数式编程中的generator,使用 yield return

类似于Python中使用的 yield

// Method that takes an iterable input (possibly an array)// and returns all even numbers.publicstaticIEnumerableGetEven(IEnumerablenumbers){foreach(intiinnumbers){if(i%2==0)yieldreturni;}}

匿名方法

匿名方法类似于函数式编程中的闭包。

publicvoidFoo(objectparameter){// ...ThreadPool.QueueUserWorkItem(delegate{// anonymous delegates have full access to local variables of the enclosing methodif(parameter==...){// ... }// ...});}

委托的协变和逆变

委托签名的协变和逆变,

属性访问器可以被单独设置访问级别

例子:

stringstatus=string.Empty;publicstringStatus{get{returnstatus;}// anyone can get value of this property,protectedset{status=value;}// but only derived classes can change it}

可空类型

可空类型(跟个问号,如 int? i = null; )允许设置 null 给任何类类型。

int?i=null;objecto=i;if(o==null)Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");elseConsole.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");

??运算符

( ?? )用于如果类型不为空值时回传它自身,如果为空值则返回之后的操作

objectnullObj=null;objectobj=newObject();returnnullObj??obj;// returns obj

主要用作将一个可空类型赋值给不可空类型的简便语法

int?i=null;intj=i??0;// Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.

C# 3.0的特性

C# 3.0发布于2007年10月17日,是.NET Framework 3.5的一部分,它的新特性灵感来自于函数式编程语言,如:Haskell和ML,并广泛地引入了Language Integrated Query(LINQ)模式到通用语言运行库中e.

Linq

语言集成查询( 英语: L anguage In tegrated Q uery ,缩写: LINQ ): 上下文相关关键字" from , where , select "可用于查询SQL、XML、集合等。这些标识符在LINQ上下文中被作为关键字,但是它们的增加不会破坏原有的名为 from 、 where 或 select 的变量。

类型初始化器

Customerc=newCustomer();c.Name="James";

可写作:

Customerc=newCustomer{Name="James"};

集合初始化器

MyListlist=newMyList();list.Add(1);list.Add(2);

可写作

MyListlist=newMyList{1,2};

假设 MyList 实现了 System.Collections.IEnumerable 且有一个 Add 方法method

匿名类型

varx=new{Name="James"};

局部变量类型推断

局部变量类型推断:

varx=newDictionary<string,List>();

等同于

Dictionary<string,List>x=newDictionary<string,List>();

它只是一个语法糖,这个特性被匿名类型声明时所需要

Lambda表达式

Lambda表达式(无函数名称的对象方法在编程语言中的表达语法):

listOfFoo.Where(delegate(Foox){returnx.Size>10;})

listOfFoo.Where(x=>x.Size>10);

编译器翻译Lambda表达式为强类型委托或强类型表达式树.

自动化属性

编译器将自动生成私有变量和适当的getter(get访问器)和setter(set访问器),如:

publicstringName{get;set;}

扩展方法

扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中:

publicstaticclassIntExtensions{publicstaticvoidPrintPlusOne(thisintx){Console.WriteLine(x+1);}}intfoo=0;foo.PrintPlusOne();

分部方法

允许代码生成器生成方法声明作为扩展点,如果有人在另一个部分类实现了它才会被包含于原代码编译。

分部方法(Partial methods)必须定义在分部类(partial classes)中

定义分部方法需要用partial做修饰符

分部方法不一定总是有执行内容的,也就是说定义的方法可以一句操作语句都没有

分部方法返回值必须是void

分部方法可以是静态(static)方法

分部方法可以包含参数,参数可以包含以下修饰词:this,ref,params

分部方法必须是私有(private)方法

例子:

partialclassC{staticpartialvoidM(inti);// defining declaration}partialclassC{staticpartialvoidM(inti){dosomething();}}

C# 4.0的特性

动态查阅

C# 4.0新增dynamic关键字,提供动态编程(dynamic programming),把既有的静态对象标记为动态对象,类似javascript,Python或Ruby。

dynamiccalc=GetCalculator();intsum=calc.Add(10,20);

具名参数与可选参数

publicStreamReaderOpenFile(stringpath,intbufferSize=1024){...}

调用OpenFile时,顺序可以完全颠倒:

OpenFile(bufferSize:4096,path:"foo.txt");

与COM组件交互

在C#中打开一个Word文件:

staticvoidMain(string[]args){Word.ApplicationwordApplication=newWord.Application(){Visible=true};wordApplication.Documents.Open(@"C:\plant.docx",ReadOnly:true);}

在C#中指定Excel的某一格文字:

excelObj.Cells[5,5].Value="This is sample text";

泛型的协变和逆变

C# 4.0支持协变和逆变,例如在泛型接口可以加上in、out关键字。

publicinterfaceIComparer{publicintCompare(Tleft,Tright);}publicinterfaceIEnumerable:IEnumerable{IEnumeratorGetEnumerator();}

C# 5.0的特性

C# Evolution Matrix

Async Feature

Caller Information

C# 6.0的特性

新增多种特性和改进lambda表达式

C# 7.0的特性

加入 out 变量;能够直接宣告一个变量在它要传入的地方,当成一个 out 的引数

程序的执行

C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称之为通用语言运行库——执行。

所有的.Net编程语言都被编译成这种被称为通用中间语言的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。如果计算机上没有安装.Net Framework,那么这些程序会弹出对话框,要求用户下载.net framework。

在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。

标准化

微软公司已经向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。现在有一些独立的实现正在进行,包括:

自由软件基金会的dotGNU Portable.NET

Mono

Baltie - C# IDE for children and youngBaltie

C# 的Hello World程序

下面是一个在命令行上输出Hello World的小程序,这种程序通常作为开始学习程序语言的第一个步骤:

usingSystem;publicclassHelloWorld{publicstaticvoidMain(string[]args){Console.WriteLine("Hello world!");}}

实现

C# 有5个著名的编译器(compilers):

最标准的C# 的实现当属微软自己推出、并被包含在.NET Framework内的C# 编译器。

微软的Rotor项目(Rotor Project,目前称为Shared Source Common Language Infrastructure),提供了通用语言运行庫( Common Language Runtime )的实现与c# 编译器。但是Shared Source Common Language Infrastructure停在2006年的2.0版就没了。

由Novell赞助的Mono项目提供了C# 编译器,同时也接近百分之百地实现了.NET Framework类库。而Mono后来衍伸出被微软背书的第三方包Xamarin。

Dot GNU项目也提供了另一个自由版本的C# 编译器,也提供了.NET Framework类库的实现。

Borland提供了项目级的C# 集成开发环境,内部所使用的编译器仍是微软.NET Framework所提供的C# 编译器(这也意味着你仍须安装微软的.NET Framework)。产品:C# Builder(商业版本),Turbo C# Explorer(免费版本)。


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· C.C.Catch
早期C.C.Catch生于荷兰,1970年代随家庭移居德国。在童年表现出音乐天分后,父母支持她发展为一名歌手而努力。她的父亲后来成为她的经纪人。少年时期参加了歌唱选拔,成为德国女子歌唱组合“Optimal”一员。职业生涯C.C.Catch,2002C.C.Catch,2006在德国汉堡的演出时,被ModernTalking的作曲及音乐制作人DieterBohlen赏识,不久后与Bohlen签约成为一名独唱女歌手。她与Bohlen决定艺名为C.C.Catch,两个字母"C"代表她本名的两个开头字母,"Catch"在她认为是个优秀创意并且看来与两个“C”很配。1985年夏天发布了歌曲"ICanLoseMyHeartTonight(英语:ICanLoseMyHeartTonight)"成为她独唱生涯的开山之作。单曲进入了欧洲多国Top-20排行榜,包括德国与瑞士。DieterBohlen与C.C...
· C
字母C的含意字元编码其他表示法另见以“C”开头的条目参看C的变体¢(一分货币)©(版权)其他字母中的相近字母Γγ(希腊字母Gamma)
· c
饮茶养生,饮茶养生的最佳时间是用餐1小时后。如果饭后马上饮热茶,是很不科学的。因为茶叶中的鞣酸可与食物中的铁结合成不溶性的铁盐,干扰人体对铁的吸收。牛奶养生,喝牛奶的最佳时间是晚上睡觉之前。因牛奶含有丰富的钙,睡前饮用对于中老年人可补偿夜间血钙的低落状态而保护骨骼。同时,牛奶有催眠作用。水果养生吃水果养生的最佳时间是饭前1小时。因水果属生食,吃生食后再进熟食,体内就不会产生白细胞增多等反应。饮酒养生饮酒养生的最佳时间是中午12时至晚8时。而上午饮酒危害最大。化妆养生,化妆养生的最佳时间是晚上临睡之前。因人入睡后,皮肤毛孔全部放开,化妆品所含的养分最易被皮肤吸收。晒太阳养生,晒太阳养生的最佳时间是上午8至10时和下午4至7时。此时日光以有益的紫外线A光束为主,可使人体内产生维生素D,从而增强人体免疫力,防止骨质疏松。锻炼养生,体育锻炼养生的最佳时间是傍晚。傍晚运动可使体内化解血栓的能力增加3...
· C语言
设计C语言设计目标是提供一种能以简易的方式编译、处理低级内存、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言也很适合搭配汇编语言来使用。尽管C语言提供许多低级处理的功能,但仍保持良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(微控制器或称MCU)以及超级电脑等作业平台。概述特性C语言是一个有结构化程序设计、具有变量作用域(variablescope)以及递归功能的过程式语言。C语言传递参数均是以值传递(passbyvalue),另外也可以传递指针(apointerpassedbyvalue)。不同的变量类型可以用结构体(struct)组合在一起。只有32个保留字(reservedkeywords),使变量、函数命名有更多弹性。部分的变量类型可以转换,例如整型和字符型变量。通过指针(pointer),C语言可以容易的...
· C++
发展历史比雅尼·斯特劳斯特鲁普,C++之父比雅尼·斯特劳斯特鲁普(Stroustrup)工作起于1979年的CwithClasses。这个构思起源于Stroustrup做博士论文时的一些程序撰写经验。他发现Simula具备很利于大型软件开发的特点,但Simula的运行速度太慢,无法对现实需求发挥功效;BCPL虽快得多,但它过于低级的特性,使其不适于大型软件的开发。当Stroustrup开始在贝尔实验室工作时,他有分析UNIX核心关于分布式计算的问题。回想起他的博士论文经验,Stroustrup开始为C语言增强一些类似Simula的特点。之所以选择C,是因为它适于各种用途、快速和可移植性。除了C和Simula之外,同时也从其它语言中获取灵感,如ALGOL68、Ada、CLU以及ML。刚开始时,类别、派生类、存储类型检查、内联和默认参数特性,都是通过Cfront引入C语言之中。1985年10月...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信