目录
本篇文章大概介绍了C#语言,以下内容均来自官方文档,感兴趣的小伙伴可以持续关注。
C#语言介绍
C# 是一种新式编程语言, 面向对象,面向组件,类型安全。
开发人员可以利用C#语言生产再 .NET生态系统上运行的安全可靠的应用程序。
C# 几项有助于创建可靠持久的应用程序的功能:
- 垃圾回收 : 自动回收不可访问的未用对象所占用的内存;
- 可以为null的类型 : 可防范不引用已分配对象的变量;
- 异常处理 :提供了一种结构化且可扩展的方法进行错误检测和恢复;
- lambda表达式 : 支持函数编程技术;
- 语言集成查询(LINQ)语言 : 创建一个公共模式,用于处理来自任何源的数据;
- 异步操作语言 : 支持提供用于构建分布式系统的语法;
- 拥有统一类型系统,所有 C# 类型均继承自一个根 object 类型(包括int 和 double 等基元类型)
共用通用运算,任何类型的值都可一致的进行存储,传输和处理; - 支持用户自定义的引用类型和值类型;
允许动态分配轻型结构和内嵌存储;
支持泛型方法和类型,增强了类型安全性和性能。
可提供迭代器,使集合类的实现者可以定义客户端代码的自定义行为。
C# 强调版本控制,确保程序和库以兼容方式随时间推移而变化
.NET体系结构
.NET 是名为公共语言运行时(CLR)的虚执行系统和一组库。
用C# 编写的源代码被编译成符合CLI 规范的中间语言(IL);存储在扩展名为 .dll的程序集中
.NET 语言操作性: 利用 C#生成的IL代码可以与通过 .NET体系的其他与CTS兼容的语言进行交互
.NET 包含大量的库. 这些库支持多种不同的工作负载.
均已整理至命名空间中;包括文件输入输出, 字符串控制, XML分析, Web应用程序框架和Windows窗体控件
Hello World
用 C#写的第一个程序
using System;
class Hello
{
static void Main()
{
Console.WriteLine("Hello World");
}
}
Hello World程序始于引用 System命名空间的 using指令;声明的 Hello类只有一个成员,即Main方法
可以使用 this引用特定的封闭对象实例,而静态方法则可以在不引用特定对象的情况下运行。
按照约定, Main静态方法是 C#程序的入口点。输出有 System的 Console类的WriteLine方法生成。
类型和变量
C#包含两种类型:值类型和引用类型。
值类型的变量直接包含它们的数据。引用类型的变量存储对数据的引用。
C#类型系统分类
值类型
1.简单类型
-有符号整型: sbyte, short, int, long;
-无符号整型: byte, unshort, uint, ulong;
-Unicode字符: char, 表示UTF-16代码单元
-IEEE二进制浮点: float, double;
-高精度十进制浮点: decimal;
-布尔值: bool;
2.枚举类型
enum E{...}格式
3.结构类型
struct S{...}格式
4.可以为null的类型
值为null类型的其他所有值类型的扩展
5.元组值类型
格式为(T1,T2,...)
引用类型
1.类类型
-其他所有类的最终基类: object ;
-Unicode字符串: string
-格式为 class C{...} 的用户定义类型
2.接口类型
-inteface I{...}
3.数组类型
-一维,多维和交错。int[], int[,], int[][];
4.委托类型
-格式为delegate int D{...}
C# 程序使用 类型声明 创建新类型。 类型声明指定新类型的名称和成员。
用户可定义以下六种 C# 类型:
类类型、结构类型、接口类型、枚举类型、委托类型和元组值类型。
-class 类型定义包含数据成员(字段)和函数成员(方法、属性及其他)的数据结构。
类类型支持单一继承和多形性,即派生类可以扩展和专门针对基类的机制。
-struct 类型定义包含数据成员和函数成员的结构。
与类不同的是,结构是值类型,通常不需要进行堆分配。
结构类型不支持用户指定的继承,并且所有结构类型均隐式继承自类型 object。
-interface 类型将协定定义为一组已命名的公共成员。 实现 interface 的 class
或 struct 必须提供接口成员的实现代码。
interface 可以继承自多个基接口, class 和 struct 可以实现多个接口。
-delegate 类型表示引用包含特定参数列表和返回类型的方法。
通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。
委托类同于函数式语言提供的函数类型。
它们还类似于其他一些语言中存在的“函数指针”概念。
与函数指针不同,委托是面向对象且类型安全的。
class、struct、interface 和 delegate 类型全部都支持泛型
C# 支持任意类型的一维和多维数组。
可以为 null 的类型不需要单独定义。
对于所有不可以为 null 的类型 T,都有对应的可以为 null 的类型 T?,
后者可以包含附加值 null。 例如,int? 是可保存任何 32 位整数或 null 值的类型,
string? 是可以保存任何 string 或 null 值的类型。
C# 采用统一的类型系统,因此任意类型的值都可视为 object。
每种 C# 类型都直接或间接地派生自 object 类类型,而 object 是所有类型的最终基类。
在以下示例中,int 值被转换成 object,然后又恢复成 int。
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
程序结构
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,在使用时替换为具体类型。
由于程序集是包含代码和元数据的自描述功能单元,因此无需在 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 : 1
s.Push(10); // stack : 1, 10
s.Push(100); // stack : 1, 10, 100
Console.WriteLine(s.Pop()); // stack : 1, 10
Console.WriteLine(s.Pop()); // stack : 1
Console.WriteLine(s.Pop()); // stack : null
}
}
若要编译此程序,需要引用包含前面示例中定义的堆栈类的程序集。
总结
- C# 程序可以存储在多个源文件中。 在编译 C# 程序时,将同时处理所有源文件,并且源文件可以自由地相互引用。
- 从概念上讲,就好像所有源文件在被处理之前都连接到一个大文件。
- 在 C# 中永远都不需要使用前向声明,因为声明顺序无关紧要(极少数例外情况除外)。
- C# 并不限制源文件只能声明一种公共类型,也不要求源文件的文件名必须与其中声明的类型相匹配。