C#语言笔记(一)

语言特点

  • 面向对象,面向组件
  • 类型安全
  • .NET 生态系统
  • 垃圾回收
  • 可以为 null 的类型
  • 异常处理
  • 语言集成查询 (LINQ)
  • 异步操作
  • 统一类型系统

.NET体系结构

C# 程序在 .NET 上运行,而 .NET 是名为公共语言运行时 (CLR) 的虚执行系统和一组类库。 CLR 是 Microsoft 对公共语言基础结构 (CLI) 国际标准的实现。 CLI 是创建执行和开发环境的基础,语言和库可以在其中无缝地协同工作。

用 C# 编写的源代码被编译成符合 CLI 规范的中间语言 (IL)。 IL 代码和资源(如位图和字符串)存储在扩展名通常为 .dll 的程序集中。 程序集包含一个介绍程序集的类型、版本和区域性的清单。

执行 C# 程序时,程序集将加载到 CLR。 CLR 会直接执行实时 (JIT) 编译,将 IL 代码转换成本机指令。 CLR 可提供其他与自动垃圾回收异常处理资源管理相关的服务。 CLR 执行的代码有时称为“托管代码”(而不是“非托管代码”),被编译成面向特定平台的本机语言。

语言互操作性是 .NET 的一项重要功能。 C# 编译器生成的 IL 代码符合公共类型规范 (CTS)。 通过 C# 生成的 IL 代码可以与通过 .NET 版本的 F#、Visual Basic、C++ 或其他 20 多种与 CTS 兼容的任何语言所生成的代码进行交互。 一个程序集可能包含多个用不同 .NET 语言编写的模块,且类型可以相互引用,就像是用同一种语言编写的一样。

除了运行时服务之外,.NET 还包含大量库。 这些库支持多种不同的工作负载。 它们已整理到命名空间中,这些命名空间提供各种实用功能,包括文件输入输出、字符串控制、XML 分析、Web 应用程序框架和 Windows 窗体控件。 典型的 C# 应用程序广泛使用 .NET 类库来处理常见的“管道”零碎工作。

Hello World

using System;

class Hello
{
    static void Main()
    {
        Console.WriteLine("Hello, World");
    }
}

“Hello, World”程序始于引用 System 命名空间的 using 指令。 命名空间提供了一种用于组织 C# 程序和库的分层方法。 命名空间包含类型和其他命名空间。例如,System 命名空间包含许多类型(如程序中引用的 Console 类)和其他许多命名空间(如 IO 和 Collections)。 借助引用给定命名空间的 using 指令,可以非限定的方式使用作为相应命名空间成员的类型。 由于使用 using 指令,因此程序可以使用 Console.WriteLine 作为 System.Console.WriteLine 的简写。

类型和变量

C# 有两种类型:值类型 和 引用类型。 值类型的变量直接包含它们的数据。 引用类型的变量存储对数据(称为“对象”)的引用。

以下大纲概述了 C# 的类型系统。

  • 值类型
    • 简单类型
      • 有符号整型:sbyte、short、int、long
      • 无符号整型:byte、ushort、uint、ulong
      • Unicode 字符:char,表示 UTF-16 代码单元
      • IEEE 二进制浮点:float、double
      • 高精度十进制浮点数:decimal
      • 布尔值:bool,表示布尔值(true 或 false)
    • 枚举类型
      • enum E {...} 格式的用户定义类型。 enum 类型是一种包含已命名常量的独特类型。 每个 enum 类型都有一个基础类型(必须是八种整型类型之一)。 enum 类型的值集与基础类型的值集相同。
    • 结构类型
      • 格式为 struct S {...} 的用户定义类型
    • 可以为 null 的值类型
      • 值为 null 的其他所有值类型的扩展
    • 元组值类型
      • 格式为 (T1, T2, ...) 的用户定义类型
  • 引用类型
    • 类类型(class与Java相似,单一继承和多形性)
      • 其他所有类型的最终基类:object
      • Unicode 字符串:string,表示 UTF-16 代码单元序列
      • 格式为 class C {...} 的用户定义类型
    • 接口类型
      • 格式为 interface I {...} 的用户定义类型
    • 数组类型
      • 一维、多维和交错。 例如:int[]、int[,] 和 int[][]
    • 委托类型
      • 格式为 delegate int D(...) 的用户定义类型
        Note:
  1. delegate 类型表示引用包含特定参数列表和返回类型的方法。 通过委托,可以将方法视为可分配给变量并可作为参数传递的实体。 委托类同于函数式语言提供的函数类型。 它们还类似于其他一些语言中存在的“函数指针”概念。 与函数指针不同,委托是面向对象且类型安全的。
  2. class、struct、interface 和 delegate 类型全部都支持泛型,因此可以使用其他类型对它们进行参数化。
  3. [Important]C# 支持任意类型的一维和多维数组。 与上述类型不同,数组类型无需先声明即可使用。 相反,数组类型是通过在类型名称后面添加方括号构造而成。 例如,int[] 是 int 类型的一维数组,int[,] 是 int 类型的二维数组,int[][] 是由 int 类型的一维数组或“交错”数组构成的一维数组。
  4. 可以为 null 的类型不需要单独定义。 对于所有不可以为 null 的类型 T,都有对应的可以为 null 的类型 T?,后者可以包含附加值 null。 例如,int? 是可保存任何 32 位整数或 null 值的类型,string? 是可以保存任何 string 或 null 值的类型。
  5. C# 采用统一的类型系统,因此任意类型的值都可视为 object。 每种 C# 类型都直接或间接地派生自 object 类类型,而 object 是所有类型的最终基类。 只需将值视为类型 object,即可将引用类型的值视为对象。 通过执行 装箱 和 取消装箱操作,可以将值类型的值视为对象。

程序结构

C# 中的关键组织结构概念包括程序、命名空间、类型、成员和程序集* 。 程序声明类型,而类型则包含成员,并被整理到命名空间中。 类型示例包括类、结构和接口。 成员示例包括字段、方法、属性和事件。 编译完的 C# 程序实际上会打包到程序集中。 程序集的文件扩展名通常为 .exe 或 .dll,具体视其分别实现的是应用程序还是库_***而定。

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

C#面向对象语言特点

  • C# 支持封装、继承和多态性
  • 直接继承一个父类,并且可以实现任意数量的接口
  • 若要用方法重写父类中的虚方法,必须使用 override 关键字,以免发生意外重定义
  • 在大部分的面向对象编程语言中,所有的函数都是方法。而 C# 并不是这样,函数也可以是属性和事件。
  • 属性是封装了一个对象状态的函数成员,它通常用来表示和操作一个对象的字段。
  • 事件是函数成员,它简化了对对象更新的操作。
  • 通过委托,C# 可以向操作变量一样操作函数。

C# 的类型安全

类型安全指的是数据实例只能够按照定义好的方式相互作用。它保证了数据内部信息的完整性。

C# 支持静态类型。这意味着这些数据的类型在编译阶段就被确定,并且不可更改。因此许多关于类型的错误能够在编译阶段被发现。

C# 也可以通过 dynamic 关键字来支持动态类型,这个类型依然会在编译阶段被确定。

C# 是一个强类型的语言,这就是说你不能将一个 int 类型的变量传给一个参数是 string 类型的函数。

C# 的内存管理

C# 提供自动的内存管理机制,编译器会将一个垃圾回收器( garbage collection )作为程序的一部分一起运行。

垃圾回收器会自动回收那些不再被需要的内存。一段内存被判定为不再被需要的标准时,这段内存没有被活跃的引用变量指向。

原文地址:https://www.cnblogs.com/francisforeverhappy/p/Csharp1.html