C# 语言介绍
C#概念
C#(读作”SeeSharp“,不是 C井)。
C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core( 完全开源,跨平台 )之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。
C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似,它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。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:
using System;class Hello{static void Main(){Console.WriteLine("Hello, World");}}
从上面的例子可以看到,C#程序始于 System 命名空间的 using 指令。命名空间是用来组织与连接 C# 程序和库的分层方法。命名空间包含:类型和其他命名空间。例如,System 命名空间就包含了控制台输出类型 Console 和其他许多命名空间(如 IO 和 Collections )。
借助 using 指令,我们可以在程序中引用各种命名空间。可以让我们的程序调用其它命名控件的类型以及函数等。例如:System 命名控件就给我们提供了Console.WriteLine()的方法用来输出内容,如果不引用命名控件也可以写成:System.Console.WriteLine。
然后继续往下看,class 关键字表示C#中的类对象 Hello 是类名。类对象是C#程序中的重要组成部分。类又包含变量、函数等,Main 就是Hello类中的函数,Main 函数调用了 System 命名空间中的 Console.WriteLine()用来输出 Hello,World。通常,在C#程序中Main函数都做为程序的入口。
类型和变量
C# 有两种类型:值类型 和 引用类型。
值类型变量直接存储数据本身,引用类型的变量存储对数据(称为"对象")的引用。对于引用类型,两个变量可以引用同一个对象,对其中一个变量做出修改可能会影响另一个变量引用的对象。而值类型,每个变量都有自己的数据副本。因此,对一个变量做出的修改不会影响到另一个变量( ref 和 out 参数变量除外)。
在C#中变量由三部分组成:类型、变量名和变量值。
int i = 0;string name = "C#";
using System;namespace ConsoleApp1{class Program{static void Main(string[] args){int i = 0;int j = 2;j = 5;Console.WriteLine(i);Console.WriteLine(j);}}}
输出结果:
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类型(接口类型)将协定定义为一组已命名的公共成员。 实现interface的class或struct必须提供接口成员的实现代码。interface可以继承自多个基接口,class和struct可以实现多个接口。delegate类型(委托类型)表示引用包含特定参数列表和返回类型的方法。通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。委托类同于函数式语言提供的函数类型。 它们还类似于其他一些语言中存在的”函数指针“概念。与函数指针不同的是,委托是面向对象且类型安全的。
程序结构
C#程序组织结构包括:命名空间、类型、成员和程序集。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型包括:类、结构和接口。 成员:包括字段、方法、属性和事件。编译完的 C# 程序实际上会打包到程序集中。程序集的文件扩展名通常为 .exe 或 .dll,具体视其分别实现的是应用程序还是库来决定。下面来看一段简单的例子:
using System;namespace Acme.Collections{public class Stack<T>{Entry _top;public void Push(T data){_top = new Entry(_top, data);}public T Pop(){if (_top == null){throw new InvalidOperationException();}T result = _top.Data;_top = _top.Next;return result;}class Entry{public Entry Next { get; set; }public T Data { get; set; }public Entry(Entry next, T data){Next = next;Data = data;}}}}
上面的示例中,类的完全限定名为 Acme.Collections.Stack。此类包含多个成员:一个 top 字段、两个方法( Push 和Pop )和一个 Entry 嵌套类。 Entry 类还包含三个成员:一个 next 字段、一个 data 字段和一个构造函数。Stack 是泛型类。 它具有一个类型参数 T ,在使用时可以替换为具体类型(后续会详细讲解泛型)。
程序集是包含中间语言 (IL) 指令形式的可执行代码和元数据形式的符号信息。 执行前,.NET 公共语言运行时的实时 (JIT) 编译器会将程序集中的 IL 代码转换为特定的处理器代码。
由于程序集是包含代码和元数据的自描述功能单元,因此无需在 C# 中使用 #include 指令和头文件。只需在编译程序时引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共``类型和成员。
例如,下面的示例中使用acme.dll 程序集中的 Acme.Collections.Stack 类:
using System;using Acme.Collections;class Example{public static void Main(){var s = new Stack<int>();s.Push(1); // stack contains 1s.Push(10); // stack contains 1, 10s.Push(100); // stack contains 1, 10, 100Console.WriteLine(s.Pop()); // stack contains 1, 10Console.WriteLine(s.Pop()); // stack contains 1Console.WriteLine(s.Pop()); // stack is empty}}
C# 程序可以存储在 多个 源文件中。在编译 C# 程序时,将同时处理所有源文件,并且源文件可以自由地相互引用。从概念上讲,就好像所有源文件在被处理之前都连接到一个大文件。在 C# 中永远都不需要使用前向声明,因为声明顺序无关紧要(极少数例外情况除外)。C#并不限制源文件只能声明一种公共类型,也不要求源文件的文件名必须与其中声明的类型相匹配。