C#知识高阶语法汇总

C#上位机理论知识以及高阶语法汇总


枚举类型?

枚举类型(也可以称为"枚举器")它是值类型,在 C# 中枚举类型不仅可以在类或结构体的内部声明,也可以在类或结构体的外部声明。

使用场景:

  1. 状态管理:枚举类可以用来定义不同的状态,比如订单状态(待支付、已支付、已完成等),用户状态(激活、冻结、已删除等)等。

  2. 配置管理:枚举类可以用来定义不同的配置选项,比如数据库连接字符串类型(Sql Server、MySql、Oracle等),日志级别(Debug、Info、Warn、Error等)等。

  3. 错误码管理:枚举类可以用来定义不同的错误码,方便开发人员和用户查找错误原因,提高代码可读性和可维护性。

类?

类是一种数据结构,它可以包含数据成员(常量和字段)、函数成员(方法、属性、事件、)以及嵌套类型。它是面向对象编程的基本构造块之一。类用于定义对象的结构和行为,作为对象的模板或蓝图

类具有C#的三大特征封装 继承 多态。

  • 封装性‌:类提供了封装机制,将数据和相关的操作(方法)封装在一起,隐藏内部实现细节,只暴露对外接口,提高代码的可维护性和安全性。
  • 继承性‌:C#中的类支持继承关系,一个类可以派生出一个或多个子类,从而继承父类的属性和行为。
  • 多态性‌:C#中的类通过继承和接口实现多态性,允许使用基类或接口引用来引用具体的子类对象,并根据实际对象类型调用相应的方法。

对象?

在C#中,对象是类的实例。类定义了对象的数据和行为,对象则是这些数据和行为的具体实现。

静态成员和非静态成员的区别?

类的成员可以分为两类:静态成员和非静态成员(也称为实例成员)。

静态成员:

属于类本身,不属于类的任何特定实例。使用 static 关键字修饰。可以通过类名直接访问,无需创建类的实例。在程序中只有一个副本,节省内存。且静态成员只能访问静态成员,不能访问非静态成员。

非静态成员:

属于类的特定实例,必须通过类的实例来访问,每创建一个类的实例,非静态成员就会有一个副本。非静态成员可以访问静态成员。

结构体?

结构体也被称为结构类型("structure type"或"struct type"),它是一种可封装数据和相关功能的值类型,在语法上结构体与类(class)非常相似,它们都可以用来封装数据,并且都可以包含成员属性和成员方法。

以下是一些C#结构体的使用场景:

可以用来进行数据存储可以用来存储较小的数据结构,比如坐标、颜色等简单的数据类型。

当创建大型数组的元素时,使用结构体可以减少内存使用。

由于 struct 是值类型,在数学运算中会更高效,比如向量、矩阵等。

类和结构体的主要区别?

类是引用类型,结构体是值类型;

结构体不支持继承,但可以实现接口;

结构体中不能声明默认的构造函数。

类在编译时会自动生成一个无参构造函数

面相对象的三大特征?

封装:

封装是面向对象编程中的一个核心概念,它使得对象的状态(即数据)不会被直接访问,而是通过方法(即行为)来控制和操作。封装可以提高代码的内聚性和可维护性,同时也提供了一种保护数据不被随意修改的方法。

继承:

在创建一个新类时,我们可以使用这个新定义的类继承一个已有的类,通过继承可以在创建新类时重用、扩展和修改被继承类中定义的成员。被继承的类称为"基类(父类)",继承基类的类称为"派生类(子类)"。

需要注意的是,C# 中只支持单继承,也就是说一个派生类只能继承一个基类,但是继承是可以传递的,例如 ClassC 继承了 ClassB,而 ClassB 继承了 ClassA,那么 ClassC 将继承 ClassB 和 ClassA 中的所有成员。

多态:

多态是指同一操作具有多个不同表现形式或形态的能力,可以有不同的解释和不同的行为。多态性涉及到方法重写和重载。

静态性多态: 函数重载,符号重载

动态性多态: 虚方法,抽象类,接口

正则表达式?

正则表达式是一种强大的文本模式匹配工具,列如判断一个字符串是不是手机号,或者密码是否包含大小写数字等这些要求,可以把这些条件写成一个表达式。

在C#中使用Regex类实现正则表达式。

只读属性?

类的字段可以通过一个readonly(只读)表示这个为只读字段,不能被构造函数之外地方进行修改,静态只读字段不能在非静态的构造函数中使用。

IO文件操作?

IO类 就是对应文件的操作的类I/O类 包含各种不同的类 用于执行各种文件操作,创建文件删除文件读写文件。

常用的类:

File处理文件操作的类

FilleStream用于文件当中任何位置的读写

‌Stream类‌:这是一个抽象基类,提供了读取、写入和查找等基本操作。所有流都继承自Stream类,使得数据通信更加方便‌。

‌Path类‌:用于处理文件路径的静态方法,帮助构建和操作文件路径‌1。

序列化和反序列化?

(1)序列化 在编程中,序列化是指将对象转换为可存储或传输的格式,例如将对象转换为 JSON 字符串或字节流。

(2)反序列化 在编程中,反序列化则是将存储或传输的数据转换回对象的过程。 序列化和反序列化经常用于数据的持久化、数据交换以及与外部系统的通信。它们可以使对象在不同的环境中进行传输和重用。

实现json序列化:

一、Newtonsoft.Json ,具有以下优势和特点

(1)使用广泛 多年来已经存在并广泛使用,Newtonsoft.Json 是一个成熟的第三方库,在 .NET 社区中被广泛接受和使用。它拥有丰富的功能和强大的灵活性,已经在许多项目中得到验证。

(2)功能丰富 更丰富的功能,Newtonsoft.Json 提供了一些更高级的功能,如完全自定义的序列化和反序列化逻辑,包括对循环引用的处理、自定义转换器、忽略属性等等。它可以方便地处理一些复杂的 JSON 数据场景。

(3)支持若类型转换的特点

二、System.Text.Json ,具有以下优势和特点

(1)性能 System.Text.Json 在性能方面进行了优化,通常比 Newtonsoft.Json 更快。它利用了新的读写 API,采用更高效的内部实现,以提供更好的性能和内存利用率。

(2)属于 .NET Core System.Text.Json 是 .NET Core 的一部分,因此在创建跨平台应用程序时,不需要额外的依赖项。这使得在 .NET Core 平台上使用它更加方便。

(3)简单场景 System.Text.Json 提供了一些简化的 API,使得在处理简单的 JSON 数据时更容易操作。 例如,可以直接通过 JsonSerializer.Deserialize() 方法进行快速的反序列化,而无需像在 Newtonsoft.Json 中那样使用 JsonConvert.DeserializeObject()。

(4)默认是强类型转换,比如:实体类定义的是字符串,json字符串返回的是整型,转换时会报错

lambda表达式?

‌Lambda表达式‌在C#中是一种非常强大的特性,它允许你定义匿名函数,这些函数可以赋值给委托(delegate)类型,或者作为参数传递给其他方法。Lambda表达式使用=>运算符来分隔参数列表和函数体。

泛型?

在 C# 中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。

* 使用泛型类型可以最大限度地重用代码、保护类型的安全性以及提高性能;

* 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;

* 也可以对泛型类进行约束以访问特定数据类型的方法;

装箱与拆箱?

装箱: 将值类型转换成引用类型的过程;

拆箱: 把引用类型转为值类型的过程,就是拆箱

堆栈和队列?

stack堆栈类表示一个后进先出的对象集合,当需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。

队列(Queue 类)与堆栈类似,它代表了一个先进先出的对象集合,当您需要对项目进行先进先出访问时,则可以使用队列。向队列中添加元素称为入队(enqueue),从堆栈中移除元素称为出队(deque)。

哈希表?

Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。

里氏转换?

里氏转换就是派生类的对象赋值给父类对象,反之则不行

特性?

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:_预定义_特性和_自定义_特性。

委托?

委托(delegate): 类似于C语言的指针,是存有对某个方法的引用的一种引用类型变量,其实委托及时一种数据类型,用来存储一个方法。

可以使用 Invoke 方法调用委托引用的方法

C#委托的应用场景包括但不限于以下几个方面:

事件处理:委托可用于处理事件,例如在用户单击按钮时执行某个方法。

异步编程:通过使用委托,可以在异步编程中实现回调函数的功能,例如在处理完某个任务后执行回调方法。

事件触发器:委托可用于实现事件的触发器,例如定义一个事件委托来触发某个特定事件。

多播委托:通过使用多播委托,可以将多个方法绑定到同一个委托实例上,然后一次性调用这些方法。

默认委托类型

  1. Action < T > 泛型Action委托表示引⽤⼀个void返回类型的⽅法。这个委托类存在16种重载⽅法。

2.Func< T > Func调⽤带返回类型的⽅法。有16种重载⽅法。

自定义实现委托:

public delegate void NumChange(int n); // 定义委托类型

NumChange n = AddNum; // 不使用new 直接等于方法`

反射?

反射(Reflection)是指程序可以访问、检测和修改它本身状态或行为的一种能力,反射中提供了用来描述程序集、模块和类型的对象,可以使用反射动态地创建类型的实例,并将类型绑定到现有对象,或者从现有对象中获取类型,然后调用其方法或访问其字段和属性。 如果代码中使用了特性,也可以利用反射来访问它们。

反射的用途

* 在运行时查看视图属性信息;

* 检查装配中的各种类型并实例化这些类型;

* 在后期绑定到方法和属性;

* 在运行时创建新类型,然后使用这些类型执行一些任务。

事件?

事件(Event)可以看作是用户的一系列操作,例如点击键盘的某个按键、单击/移动鼠标等,当事件发生时我们可以针对事件做出一系列的响应,例如退出程序、记录日志等等。C# 中线程之间的通信就是使用事件机制实现的。

实现事件

// 定义委托类型

public delegate void SimpleEventHandler(object sender, EventArgs e);

// 声明事件

public event SimpleEventHandler SimpleEvent;

多线程?

多线程:

多线程就是多个线程同时工作的过程,我们可以将线程看作是程序的执行路径,每个线程都定义了一个独特的控制流,用来完成特定的任务。如果应用程序涉及到复杂且耗时的操作,那么使用多线程来执行是非常有益的。使用多线程可以节省 CPU 资源,同时提高应用程序的执行效率,例如现代操作系统对并发编程的实现就用到了多线程。到目前为止我们编写的示例程序都是单线程的应用程序,这样的应用程序一次只能执行一个任务。

线程的生命周期中的各种状态:

1 未启用状态,线程创建好了,但是没有调用start方法进行开启

2 就绪状态,线程准备好了等待CPU周期时的状态。

3 不可运行状态(调用了sleep方法 或 调用wait方法,通过I/O操作阻塞)

4 销毁状态,当线程已经完成执行 或着 终止时的状态 (Abort())

实现分线程:

ThreadStart childref = new ThreadStart(CallToChildThread);

Console.WriteLine("在 Main 函数中创建子线程");

Thread childThread = new Thread(childref);

childThread.Start();

如何在线程函数中传参:

使用Lambda表达式作为线程的起始点,直接在lambda内部调用目标方法并传递参数。

如何实现接收线程函数返回值:

通过定义一个变量来存储返回结果,然后将该变量作为参数传递给线程函数。

this关键字?

在 C# 中,可以使用 this 关键字来表示当前对象,日常开发中我们可以使用 this 关键字来访问类中的成员属性以及函数。

命名空间?

在 C# 中,可以将命名空间看作是一个范围,用来标注命名空间中成员的归属,一个命名空间中类与另一个命名空间中同名的类互不冲突,但在同一个命名空间中类的名称必须是唯一的。

访问器?

属性访问器有两种,分别是 get 属性访问器和 set 属性访问器。其中 get 访问器用来返回属性的值,set 访问器用来为属性设置新值。在声明访问器时可以仅声明其中一个,也可以两个访问器同时声明

C#异步Task?

异步:在C#中,异步编程主要通过async和await关键字来实现。async关键字用于声明异步方法,而await用于挂起方法的执行,直到等待的异步操作完成。 也可以使用task类来实现异步

使用task实现异步

Task<int> task = Task.Run(() =>

{

int result = LongRunningCalculation(); // 长时间运行的计算

return result;

});

// 等待任务完成并获取结果

int finalResult = await task;

Encoding编码?

在网络通信中,很多情况下都是将字符信息转成字节序列进行传输。将字符序列转为字节序列的过程称为编码。当这些字节传送到接收方,接收方需要逆向将字节序列转为字符序列。这个过程就是解码。

常见编码有ASCII字符集 ,非ASCII字符集 如GB2312 GB18030等,Unicode字符集。

在C#中,字符集默认是Unicode,一个英文占2个字节,一个汉字也占2个字节。Unicode能够表示大部分国家的文字,但是空间占用相对ASCII较为浪费。

为了节约空间,后续出现了UTF-8,UTF-16,UTF-32.

UTF8是使用最为广泛的一种UTF格式。属于Unicode的一种变长字符编码,一般使用1-4个字节编码表示一个Unicode字符,即将一个Unicode字符编为1-4个字节组成的UTF8格式,根据不同符号而变化字节长度。

UTF8字节序列在所有系统中都一样的,所以这样可以很容易的进行排序。

UTF16将每个码位表示为一个由1-2个16位整数组成的序列。

UTF32将每个码位表示为一个32位整数。

二进制、十六进制、十进制互转?

1.二进制转十进制数 string i = "0010";

Console.WriteLine(Convert.ToInt32(i,2));//二进制转十进制数

2.二进制转十六进制数

string i = "1010";

Console.WriteLine(string.Format("{0:x}",Convert.ToInt32(i,2));//二进制转十六进制数

3.十进制转二进制

int i = 200;

Console.WriteLine(Convert.ToString(i,2));//十进制转二进制

4.十进制转十六进制

int i = 200;

Console.WriteLine(Convert.ToString(i,16));//十进制转十六进制

5.十六进制转二进制

Console.WriteLine(Convert.ToString(0x0A,2));//十六进制转二进制

6.十六进制转十进制

Console.WriteLine(Convert.ToString(0x0C,10));//十六进制转十进制

Path类?

在C#中,文件和目录的操作是编程中常见的需求,而.NET Framework为我们提供了一个名为Path的类,用于进行文件的路径操作。

Path类在实际编程中的应用

路径解析:在使用文件和目录路径时,经常会遇到需要将相对路径转换为绝对路径,或者提取路径的某一部分(如文件名或扩展名)的情况。Path类提供了一系列方法来完成这些任务,例如Path.GetFullPath和Path.GetDirectoryName。

路径组合:在创建新文件或目录时,通常需要将多个路径片段组合成一个完整的路径。Path.Combine方法可以方便地完成这个任务。

文件读写:在进行文件读写操作时,可能需要知道文件的完整路径或者将读取的数据写入到特定的文件路径。Path类可以帮助我们处理这些路径相关的细节。

错误处理:Path类的方法在处理路径时可能会抛出异常,例如路径无效或文件不存在等。在调用这些方法时,应该适当处理可能出现的异常,以确保程序的健壮性。

值类型和引用类型的区别?

值类型变量是直接包含值。将⼀个值类型变量赋给另⼀个值类型变量,是复制包含的值,默认值是0

引⽤类型变量的赋值只复制对对象的引⽤,⽽不复制对象本身,默认值是null 值类型有整形、浮点型、bool、枚举。

引⽤类型有class、delegate、Object、string

值类型存储在栈中,引⽤类型存储在堆中

在.NET中配件是什么意思?

程序集。(中间语⾔,源数据,资源,装配清单)

强类型和弱类型?

强类型是在编译的时候就确定类型的数据,在执⾏时类型不能更改,⽽弱类型在执⾏的时候才会确定类 型。没有好不好,⼆者各有好处,强类型安全,因为它事先已经确定好了,⽽且效率⾼。

using关键字?

1.引⽤命名空间,也可using 别名

2.释放资源,实现了IDisposiable的类在using中创建,using结束后会⾃定调⽤该对象的Dispose⽅法, 释放资源。

什么是ORM?

ORM指的是⾯向对象的对象模型和关系型数据库的数据结构之间的互相转换。

(表实体跟表之间的相互转换)

ORM框架有很多,EF框架是ORM框架的其中⼀种,是实现了ORM思想的框架。

O=>表实体

M=>映射关系

R=>数据库.表

EF是什么?

实体框架EF是http://ADO.NET中的⼀组⽀持开发⾯向数据的软件应⽤程序的技术,是微软的⼀个ORM 框架。

主要有三种⽅式:

Database FirstDatabase First"模式 我们称之为"数据库优先",前提是你的应⽤已经有相应的数据库,你可以使⽤EF设计⼯具根据数据库⽣ 成数据数据类,你可以使⽤Visual Studio模型设计器修改这些模型之间对应关系。

来⾃ Model FirstModel First我们称之 为"模型优先",这⾥的模型指的是"ADO.NET Entity Framework Data Model",此时你的应⽤并没有 设计相关数据库,在Visual Studio中我们通过设计对于的数据模型来⽣成数据库和数据类。

Code FirstCode First模式我们称之为"代码优先"模式,是从EF4.1开始新建加⼊的功能。

使⽤Code First模式进⾏EF开发时开发⼈员只需要编写对应的数据类(其实就是领域模型的实现过 程),然后⾃动⽣成数据库。这样设计的好处在于我们可以针对概念模型进⾏所有数据操作⽽不必关⼼ 数据的存储关系,使我们可以更加⾃然的采⽤⾯向对象的⽅式进⾏⾯向数据的应⽤程序开发。

ORM的框架?

dapper EntityFramework、 EJB、Hibernate、IBATIS、TopLink、OJB

相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht2 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht2 小时前
Swift闭包的本质
开发语言·ios·swift
小吴同学·2 小时前
.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】
c#·.netcore·.net core
wjs20242 小时前
Swift 数组
开发语言
Python私教2 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc4 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe4 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql