C# 语言介绍

C#概念

C#(读作”SeeSharp“,不是 C井)。

C#是微软公司发布的一种由CC++衍生出来的面向对象的编程语言、运行于.NET Framework.NET Core( 完全开源,跨平台 )之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。

C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似,它包括了诸如单一继承接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。

C#是由CC++衍生出来的一种安全的稳定的简单的优雅的面向对象编程语言。它在继承CC++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT.NET/Linux平台的应用程序,MICROSOFT.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。

C#使得C++程序员可以高效的开发程序,且因可调用由 C/C++ 编写的本机原生函数,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#

Hello,World

"Hello,World"历来都是各种语言的开篇第一课。下面的例子展示了 C#Hello,World

  1. using System;
  2. class Hello
  3. {
  4. static void Main()
  5. {
  6. Console.WriteLine("Hello, World");
  7. }
  8. }

从上面的例子可以看到,C#程序始于 System 命名空间的 using 指令。命名空间是用来组织与连接 C# 程序和库的分层方法。命名空间包含:类型和其他命名空间。例如,System 命名空间就包含了控制台输出类型 Console 和其他许多命名空间(如 IOCollections )。

借助 using 指令,我们可以在程序中引用各种命名空间。可以让我们的程序调用其它命名控件的类型以及函数等。例如:System 命名控件就给我们提供了Console.WriteLine()的方法用来输出内容,如果不引用命名控件也可以写成:System.Console.WriteLine

然后继续往下看,class 关键字表示C#中的类对象 Hello 是类名。类对象是C#程序中的重要组成部分。类又包含变量函数等,Main 就是Hello类中的函数,Main 函数调用了 System 命名空间中的 Console.WriteLine()用来输出 Hello,World。通常,在C#程序中Main函数都做为程序的入口。

类型和变量

C# 有两种类型:值类型引用类型

值类型变量直接存储数据本身,引用类型的变量存储对数据(称为"对象")的引用。对于引用类型,两个变量可以引用同一个对象,对其中一个变量做出修改可能会影响另一个变量引用的对象。而值类型,每个变量都有自己的数据副本。因此,对一个变量做出的修改不会影响到另一个变量( refout 参数变量除外)。

C#中变量由三部分组成:类型、变量名和变量值

  1. int i = 0;
  2. string name = "C#";
  1. using System;
  2. namespace ConsoleApp1
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. int i = 0;
  9. int j = 2;
  10. j = 5;
  11. Console.WriteLine(i);
  12. Console.WriteLine(j);
  13. }
  14. }
  15. }

输出结果:

  1. 0

C# 的类型区分

值类型

类型 说明
简单类型 • 有符号整数(sbyte、short、int、long)
• 无符号整数(byte、ushort、uint、ulong)
• Unicode字符( char ,表示 UTF-16 代码单元)
• IEEE二进制浮点(float、double)
• 高精度十进制浮点(decimal)
• 布尔值(true、false)
枚举类型 enum E {...}enum 类型是一种包含已命名常量的独特类型。
enum 类型都有一个基础类型(必须是八种整型类型之一)。
enum 类型的值集与基础类型的值集相同。
结构类型 格式为 struct S {...} 的用户定义类型
可空值类型 值为 null 的其他所有值类型的扩展
元组值类型 格式为 (T1, T2, ...) 的用户定义类型

引用类型

类型 说明
类类型 • 所有类型的最终基类:object
• Unicode 字符串: string ,表示 UTF-16 代码单元序列
• 格式为 class C {...} 的用户定义类型
接口类型 格式为 interface I {...} 的用户定义类型
数组类型 一组数据的集合。例如: int[]int[,]
委托类型 格式为 delegate int D(...)的用户定义类型

C# 程序使用 类型声明 来创建新类型。类型声明:指定新类型的名称成员。在C#程序中,用户可定义以下六种 类型:类类型结构类型接口类型枚举类型委托类型元组类型

  • class 类型(类类型)包含:数据成员(字段)和函数成员(方法、属性及其他)。类类型支持单一继承和多形性,即派生类可以扩展和专门针对基类的机制。

  • struct 类型包含:数据成员和函数成员,这一点与类类型相似。不过,与类类型不同的是,结构是值类型,通常不需要进行堆分配。结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 object

  • interface 类型(接口类型)将协定定义为一组已命名的公共成员。 实现 interfaceclassstruct 必须提供接口成员的实现代码。 interface 可以继承自多个基接口, classstruct 可以实现多个接口。

  • delegate 类型(委托类型)表示引用包含特定参数列表和返回类型的方法。通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。委托类同于函数式语言提供的函数类型。 它们还类似于其他一些语言中存在的”函数指针“概念。与函数指针不同的是,委托是面向对象且类型安全的。

程序结构

C#程序组织结构包括:命名空间类型成员程序集。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型包括:结构接口。 成员:包括字段方法属性事件。编译完的 C# 程序实际上会打包到程序集中。程序集的文件扩展名通常为 .exe.dll,具体视其分别实现的是应用程序还是库来决定。下面来看一段简单的例子:

  1. using System;
  2. namespace Acme.Collections
  3. {
  4. public class Stack<T>
  5. {
  6. Entry _top;
  7. public void Push(T data)
  8. {
  9. _top = new Entry(_top, data);
  10. }
  11. public T Pop()
  12. {
  13. if (_top == null)
  14. {
  15. throw new InvalidOperationException();
  16. }
  17. T result = _top.Data;
  18. _top = _top.Next;
  19. return result;
  20. }
  21. class Entry
  22. {
  23. public Entry Next { get; set; }
  24. public T Data { get; set; }
  25. public Entry(Entry next, T data)
  26. {
  27. Next = next;
  28. Data = data;
  29. }
  30. }
  31. }
  32. }

上面的示例中,类的完全限定名为 Acme.Collections.Stack。此类包含多个成员:一个 top 字段、两个方法( Push 和Pop )和一个 Entry 嵌套类。 Entry 类还包含三个成员:一个 next 字段、一个 data 字段和一个构造函数。Stack泛型类。 它具有一个类型参数 T ,在使用时可以替换为具体类型(后续会详细讲解泛型)。

程序集是包含中间语言 (IL) 指令形式的可执行代码元数据形式的符号信息。 执行前,.NET 公共语言运行时的实时 (JIT) 编译器会将程序集中的 IL 代码转换为特定的处理器代码。

由于程序集是包含代码和元数据的自描述功能单元,因此无需在 C# 中使用 #include 指令和头文件。只需在编译程序时引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共``类型和成员

例如,下面的示例中使用acme.dll 程序集中的 Acme.Collections.Stack 类:

  1. using System;
  2. using Acme.Collections;
  3. class Example
  4. {
  5. public static void Main()
  6. {
  7. var s = new Stack<int>();
  8. s.Push(1); // stack contains 1
  9. s.Push(10); // stack contains 1, 10
  10. s.Push(100); // stack contains 1, 10, 100
  11. Console.WriteLine(s.Pop()); // stack contains 1, 10
  12. Console.WriteLine(s.Pop()); // stack contains 1
  13. Console.WriteLine(s.Pop()); // stack is empty
  14. }
  15. }

C# 程序可以存储在 多个 源文件中。在编译 C# 程序时,将同时处理所有源文件,并且源文件可以自由地相互引用。从概念上讲,就好像所有源文件在被处理之前都连接到一个大文件。在 C# 中永远都不需要使用前向声明,因为声明顺序无关紧要(极少数例外情况除外)。C#并不限制源文件只能声明一种公共类型,也不要求源文件的文件名必须与其中声明的类型相匹配。