C# 速查表

C# 速查表 提供所有基本概念的快速参考。C# 在后端编程中非常流行,并且广泛应用于 Web 应用程序、桌面应用程序、面向对象编程 (OOP) 以及与 .NET 的跨平台开发,提供了丰富的就业机会。学习这份速查表,可以帮助你有效地准备面试和考试。阅读这份速查表,学习C# 编程语言

目录

1. 基本结构概述

C# 的基本结构代表了编程语言的基础。该文件包含程序开始执行的主要方法。以下是 C# 的基本结构:

using System;

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

2. 注释类型

注释是程序中会被编译器忽略的一部分。在 C# 中,有三种声明注释的方式 -

  • 单行注释 (//):此注释为单行代码。
  • 多行注释 (/* ... */):此注释为多行代码。
  • XML 文档注释 (///):用于提供方法、类或属性的文档。

3.理解数据类型

数据类型定义了存储数据的类型。它们可以分为两大类:

I. 值类型

值类型存储实际数据。以下是表示变量的类型列表:

  • 整数类型 (int, long, short, byte, sbyte, uint, ulong, ushort)
  • 浮点类型 (float, double, decimal)
  • 布尔类型 (bool)
  • 字符类型 (char)
  • 结构体 (Struct)

II.引用类型

引用类型存储元素的内存地址。引用类型列表如下:

4.使用变量

在编程中,变量可以通过保存值来存储内存位置。存储在变量中的值可以改变程序的执行。因此,变量允许用户存储、修改和检索数据。

int num = 5; // 整数
string word = "Hello"; // 字符串

5. 使用常量

在 C# 中,常量是不可变的值,在编译时已知,在程序执行期间不会更改。

const int ConstNum = 21; // 常量的值始终保持不变。

请注意,C# 中的常量遵循 PascalCase 命名规范,这意味着它以大写字母开头。

6. 探索条件语句

C# 中的条件语句用于控制程序的流程。它根据特定条件执行不同的代码块。

// 检查第一个条件
if (condition) { /*...*/}

// 如果前一个条件不成立,则检查其他条件
else if (condition) { /*...*/}

// 如果上述条件均不成立,则执行 else 代码块
else { /*...*/}

// Switch 语句用于比较单个变量与多个值
switch (variable)
{
    
    case val_1:
        // val_1 的代码
        break; 
    default:
        // 如果没有匹配的案例,则执行默认块
        break; 
}

7. 循环和迭代

循环在特定条件下执行重复任务,其中迭代器用于指示给定元素列表中元素的位置。

for (int i = 0; i < 5; i++) { /*...*/}
foreach (var item in collection) { /*...*/}
while (condition) { /*...*/}
do { /*...*/} while (condition);

8.使用数组

一个数组由连续内存块中固定数量的相同类型的元素引用。

// 包含 5 个元素的数组
int[] n = new int[5];
	// 赋值数组值
   n[0] = 11; 
   n[1] = 12;
   n[2] = 13;

9. 列表简介

列表 是一个动态集合,用于存储可变数量的相同类型元素。

// 列表包
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 来自包的列表
        List<int> num = new List<int>();
        
        // 将元素 10 添加到列表中
        num.Add(10)
        
        // 删除索引 3 处的元素
        num.Remove(3)
        
        // 检查元素是否存在
        num.contain(6)
    }
}

10.理解字典

字典是以键值对形式存储的数据集合,其中每个键都是唯一的。

// 创建一个包含字符串键和整数值的字典
     Dictionary<string, int> ages = new Dictionary<string, int>();

     // 将键值对添加到字典中
     ages["Vivek"] = 25;
     ages["Salman"] = 20;
     ages["Arjun"] = 25;

11. 定义方法

方法是执行特定任务的代码块。这是封装的逻辑,用于代码复用。

public static int SubNum(int n1, int n2)
   {
       // 返回减法
       return n1 - n2; 
   }

12. 类和对象概述

是指对象的结构,包含属性和方法。对象是类的一个实例;可以使用 new 关键字创建。

类的定义

class ClassName
{
    // 字段(属性)
    public dataType fieldName;
    
    // 构造函数
    public ClassName(parameters)
    {
    // 初始化
    }
    
    // 方法
    public returnType MethodName()
    {
    // 方法代码
    }
}

创建对象

ClassName objectName = new ClassName(parameters);

13. 处理异常

异常处理允许用户处理运行时错误,而不是程序崩溃。C# 异常处理基于四个关键字:try、catch、finally 和 throw。

try
{
    // 代码可能引发异常
    int result = 40 / 0; // 除以零
}
catch (DivideByZeroException ex)
{
    // 此代码块用于处理异常
    Console.WriteLine("Error: " + ex.Message);
}
finally
{
    // 此代码块将始终执行
    Console.WriteLine("此代码块将始终运行。");
}

14. 委托、事件和 Lambda 表达式

委托事件Lambda 表达式 在 C# 中是事件驱动应用程序的一部分,可以简化代码维护。

using System;

// 委托定义
public delegate void MyDelegate();

// 事件声明
event MyDelegate MyEvent;

// 带有 Func 函数的 Lambda 表达式,用于两个整数相加
Func<int, int, int> add = (a, b) => a + b;

class Program
{
   static void Main(string[] args)
   {
        // 订阅事件
        MyEvent += () => Console.WriteLine("Event triggered!");
        
        // 触发事件
        MyEvent?.Invoke();
        
        // 使用 lambda 表达式 (Func) 将两个数字相加
       	int result = add(5, 3);
       	Console.WriteLine($"The result of adding 5 and 3 is: {result}");
    }
}

15. LINQ(语言集成查询)简介

LINQ 是 C# 中的一项功能,允许用户从多个来源生成查询和数据操作。其语法类似于 SQL。

using System.Linq;
class Program
{
   static void Main()
   {
    var data = new[]
   
   // LINQ query
    var query = from item in data where /* condition */ select element;
   }
}

16. 使用属性

属性在程序中提供了一些附加信息。这些信息可以在运行时使用。以下是可在 C# 程序中使用的属性列表 -

  • 定义属性:创建一个继承自 System.Attribute 的类。
  • 应用属性:我们可以使用方括号 [] 为类、方法或属性应用属性。
  • 预定义属性:C# 具有内置属性,例如 [Obsolete] 和 [Serializable]。
// 定义属性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute
{
... 
}
// 应用属性
[MyCustomAttribute("This is a custom attribute")]
public class MyClass
{
   [MyCustomAttribute("This is a method attribute")]
   public void MyMethod() { }
}
// 预定义属性
[Obsolete("Use NewMethod instead")]
public void OldMethod() { }

17. 使用 Async 和 Await

C# 中的 asyncawait 关键字可以轻松编写在后台运行的代码,从而在执行任务时保持程序的响应。这种方法会暂停任务直至其完成(例如等待文件加载),然后平稳地继续执行。

// 用于读取文件的异步方法
 public static async Task<string> ReadFileAsync(string filePath)
 {
    // 调用异步方法
    return await reader.ReadToEndAsync();
 }

18. 字符串操作和操控

字符串操控是指修改文本数据以实现所需结果的过程。C# 通过字符串类拥有丰富的内置方法。一些常见的字符串操作如下:-

  • string.Concat() - 用于连接两个字符串。
  • string.Substring() - 用于提取字符串的一部分。
  • string.Length() - 用于返回字符串中存在的字符数。
  • string.Replace() - 此方法替换子字符串而不是字符串。
  • string.ToUpper() - 用于将字符串转换为大写。
  • string.ToLower() - 用于将字符串转换为小写。
  • string.Trim() - 用于删除空格。
  • string.Indexof() - 用于查找第一次出现的字符串。
  • string.Contain() − 检查字符串是否存在。
  • string.StartsWith()/string.EndsWith() − 检查字符串是否以特定子字符串开头或结尾。
  • − 这是转义序列字符。 表示换行符,而 表示制表符。

19. 文件输入/输出操作

这是管理磁盘中文件的基本通信过程。输入和输出指的是读取和写入文件。

// 从文件中读取文本
file.ReadAllText("file_eg.txt");

// 将文本写入文件
file.WriteAllText("file_eg.txt", "This is Tutorialspoint!");

// 将文本添加到文件
file.AppendAllText("file_eg.txt", "Append the text");

// 检查文件是否存在
file.Exists()

20. 使用日期和时间

日期和时间在开发支持业务决策和流程的应用程序中发挥着重要作用。这里,我们简要介绍一下日期和时间代码的用法。

// 获取当前日期和时间
// 本地时间
DateTime currentDateTime = DateTime.Now;
// UTC 时间
DateTime utcDateTime = DateTime.UtcNow;

// 使用类获取日期和时间
DateTime now = DateTime.Now;  
DateTime today = DateTime.Today;  

21. 理解泛型

泛型 的定义带有类型参数,该参数允许用户创建一个带有数据类型占位符的类。

public class Box<T>
{
   public T Value { get; set; }

   public Box(T value)
   {
       Value = value;
   }
}

22. 可空类型及其用法

可空类型是值类型中直接声明值的部分。要声明可空类型,请在值类型后使用"?"符号。以下是示例:−>

// 可空整数
int? myNullableInt = null;

// 可空双精度数
double? myNullableDouble = 3.14;

// 可空布尔值
bool? myNullableBool = null;

23. 属性和反射

属性讨论程序元素的元数据,而反射允许用户在运行时检查并与元数据交互,以操作查询或类型,例如类型、方法和其他元素。

// 应用于类的自定义属性。
[CustomAttribute] 
public class MyEmp
{
   // do something
}

// 使用反射获取属性:
Attribute[] attrs = Attribute.GetCustomAttributes(typeof(MyEmp));

24. 创建扩展方法

创建扩展方法时,无需更改源代码即可向现有类型(例如类、结构体或接口)添加新方法。此方法定义在静态类下,必须声明"static"和"this"关键字来标识其第一个参数所使用的类型。此处,我们以字符串反转为例进行说明。

public static class StringExtensions
{
   // 扩展方法
   public static string ReverseString(this string str)
   {
       char[] charArray = str.ToCharArray();
       Array.Reverse(charArray);
       return new string(charArray);
   }
}

25. 实现依赖注入

依赖注入是遵循面向对象编程 (OOPS) 技术的软件开发应用程序的一种设计模式。在此模式中,类从外部源接收其依赖项,而不是在内部创建它们。

在此示例中,Client 依赖于 IService,即通过其构造函数注入。

public interface IService
{
   void Execute();
}

public class Service : IService
{
   public void Execute() => Console.WriteLine("Service Executed");
}

public class Client
{
   private readonly IService _service;

   public Client(IService service)
   {
       _service = service;
   }

   public void Run() => _service.Execute();
}

var service = new Service();
var client = new Client(service);
client.Run();

26. 使用部分类

在 C# 中,部分类 允许用户将类定义、结构体或接口拆分到多个文件中。当用户需要处理更大的类或文件时,此功能非常有用。

第一个文件 - student_one.cs

public partial class Stu
{
   public string Name { get; set; }
}

第二个文件 - student_two.cs

public partial class Stu
{
   public int Age { get; set; }

   public void DisplayInfo()
   {
       Console.WriteLine($"Name: {Name}, Age: {Age}");
   }
}

要点 −

  • 以上两个文件包含同一个类 Stu 的定义。
  • partial 关键字表示类定义分布在多个文件中。

27. 互操作性特性

C# 的互操作性特性允许用户在同一系统中设置多种编程语言。

28. C# 中的匿名类型

创建匿名类型时,使用关键字"new"指定对象初始化器的属性和值。

var student = new { Name = "Tapas", Age = 25 };
Console.WriteLine(person.Name); // 结果 - Tapas
Console.WriteLine(person.Age); // 结果 - 25

29. 使用元组

元组是一种数据结构,允许用户在单个对象中存储不同类型的多个值。

var tuple = (5, "Tutorialspoint", 32.9);

注意:C# 元组在 C# 7.0 及更高版本中引入。

30. C# 中的模式匹配

模式匹配允许用户根据特定的类型、值或结构检查对象。以下是 C# 中使用的模式列表:

  • 类型模式:匹配对象的类型。
  • 属性模式:匹配对象内属性或字段的值。
  • 常量模式:可以匹配特定的常量。
  • 关系模式:这种模式基于比较运算符。
  • 逻辑模式:使用逻辑运算符组合多个模式。
// 类型模式
object n1 = 42;
if (obj is int n1)
{
  Console.WriteLine($"Integer: {n1}");
}

// 属性模式
var person = new { Name = "Mary", Age = 30 };

if (person is { Name: "Mary", Age: > 25 })
{
   Console.WriteLine("This is Mary and she is older than 25.");
}

// 常量模式
int n = 25;

switch (n)
{
   case 0:
       Console.WriteLine("One");
       break;
   case 10:
       Console.WriteLine("Eight");
       break;
   default:
       Console.WriteLine("Other");
       break;
}

// 关系模式
int age = 20;

if (age is >= 18 and <= 65)
{
    Console.WriteLine("You are an adult.");
}

// 逻辑模式(与、或、与非)
int value = 15;

if (value is > 10 and > 20)
{
    Console.WriteLine("The value is ranges between 10 and 20.");
}

31. 使用本地函数

本地函数是在方法内部定义的函数,仅在其作用域内使用。

static void Main()
   {
       // 局部函数定义
       int sub(int a, int b)
       {
           return a - b;
       }

       // 调用本地函数
       int result = sub(10, 5);
   }

32. 记录简介

记录 是 C# 9.0 中引入的不可变数据模型。其主要用途是存储和比较数据,而不是修改数据。

public record record_name(string Name, int Age, ...);

33. 使用 with 表达式

在 C# 中,"with"表达式用于通过复制现有对象并修改特定属性来创建新对象。

var New_object = Existing_object with { property_name = new_value };

34. 索引器和范围概述

索引器类似于数组,可以按顺序收集元素。

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// 访问索引 2 到 4 之间的元素(例如范围)
var range = numbers[2..5];

// 获取索引 0 到 3 之间的元素
var range2 = numbers[..4]; 

35. 理解 using 声明

C# 中的"using"声明指的是文件或流等资源。此声明确保资源在程序使用完毕后已关闭并可供重用。

// 文件在作用域结束时自动关闭。
using var file = new FileStream("file_example.txt", FileMode.Open);

36.可空引用类型 (NRT)

有两种方法可以识别 NRT -

  • 非可空引用类型:默认情况下,引用类型不能为空。
  • 可空引用类型:它只需在类型后使用 ? 语法,例如 string?。
// 非可空引用类型
string name = null; // 编译器错误,因为不允许为空

// 可空引用类型
string? name = null; 

37. 基于模式的"Using"特性

C# 中的"using 语句"确保正确处理实现 IDisposable 接口的对象,无论是同步还是异步。我们可以将这些特性与文件处理过程联系起来。

using (FileStream fileStream = new FileStream(path))
   {
      // do something
   }

38. 默认接口实现

默认接口功能允许用户在不破坏现有实现的情况下向接口添加新方法。如下所示:

public interface IExample
{
   // 默认接口的实现
   void SayHello()
   {
       Console.WriteLine("Hello from the default interface implementation!");
   }
}

39. C# 中的动态绑定

在 C# 中,动态绑定 是指在运行时(而非编译时)解析方法调用、属性或操作的过程。此功能通过 dynamic 实现。简单来说,我们可以说在运行时进行类型检查。

dynamic ob = "Hello"

// 此操作在运行时解析
Console.WriteLine(ob.Length);

// 由于整数不具备 Length 属性,因此在运行时抛出错误
ob = 23