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