- 博客(26)
- 收藏
- 关注
原创 C#知识点26
除了使用 C# 内置的Stack<T>类,也可以自己实现一个简单的栈结构在这个自定义的MyStack类中,通过一个数组来存储元素,用top变量来标记栈顶元素的位置,实现了基本的入栈、出栈、查看栈顶元素以及判断栈是否为空的功能,可以根据实际需求进一步扩展和完善它。
2024-12-20 15:03:34
198
原创 C#知识点25
语句来遍历队列中的元素。不过需要注意的是,遍历过程中不应该对队列进行修改操作,否则可能会导致不可预测的结果。列是一种先进先出的数据结构。就像排队一样,先进入队列的元素先被取出。在 C# 中,队列可以用于许多场景。可以在不取出元素的情况下查看队列头部的元素。,也可以自己实现一个简单的队列。属性可以检查队列中元素的数量。用于将元素添加到队列的末尾。用于从队列的头部取出元素。
2024-12-20 14:58:05
179
原创 C#知识点24
但是,一些高级的编译器或者特定的编程环境可能会提供这样的优化。开发人员可以通过手动改写递归函数为尾递归形式来在一定程度上避免栈溢出的风险,提高程序的性能和稳定性。每次函数调用时,都会在栈上分配一块空间,当递归过深时,栈空间会被耗尽。尾递归是一种特殊的递归形式,在尾递归函数中,递归调用是函数的最后一个操作。函数在计算第n项斐波那契数时,会根据定义调用自身来计算第n-1项和第n-2项的值,然后将它们相加得到结果。尾递归的一个重要优势是,一些编译器可以将尾递归优化为循环,从而避免栈溢出的问题。
2024-12-20 14:52:43
184
原创 C#知识点23
在 C# 中,回调函数是一种将函数作为参数传递给另一个函数的机制。它允许一个函数在完成某些操作后调用另一个函数。委托是一种引用类型,它可以引用一个或多个具有相同参数列表和返回类型的方法。在 C# 中,委托就像是函数的指针,但它是类型安全的。假设有两个方法,一个是执行某些长时间运行的操作的方法,另一个是在操作完成后要调用的回调方法。当一个异步操作完成时,可以通过回调的方式来处理结果或者执行后续操作。事件对应的委托不为空)时,就会触发事件,调用所有订阅了该事件的方法(在这里是。方法执行)时被调用。
2024-12-20 14:42:45
211
原创 C#知识点22
以一个图形用户界面应用程序为例,在同步模式下,如果用户点击一个按钮来加载一个大型文件,在文件加载完成之前,整个界面会冻结,无法进行其他操作。而使用异步编程,用户可以在文件加载的同时进行其他操作,如滚动窗口、点击其他按钮等,极大地改善了用户体验。它用于暂停当前方法的执行,直到等待的异步操作完成。在 C# 中,异步编程是一种编程模式,它允许程序在执行长时间运行的任务时,不会阻塞主线程。:在桌面应用程序或者移动应用程序的用户界面开发中,异步编程可以确保用户界面的响应性,避免因为长时间的操作导致界面冻结。
2024-12-20 13:42:45
693
原创 C#知识点21
1、声明事件通常先定义一个委托类型,然后基于该委托类型来声明事件2、定义触发事件的方法在包含事件的类内部,往往还会定义一个方法用于在合适条件下触发(调用)这个事件,通常按照命名约定会叫类似On<事件名称>的名字。
2024-12-20 13:33:49
339
原创 C#知识点19
这就好比两个人打电话,首先要互相确认对方是否能接听(相当于三次握手),才能开始正式交谈(传输数据):用于流量控制,发送方的发送窗口大小表示可以发送的数据量。接收方通过告知发送方自己的接收窗口大小来控制发送方的发送速度。:TCP 为每个发送的数据字节都编上一个序列号,接收方通过确认号来告诉发送方已经成功接收的数据字节。TCP即传输控制协议,是一种面向连接的、可靠的传输层协议,在网络通信中起着至关重要的作用。:如果发送方在一定时间内没有收到接收方的确认报文段,就会认为数据丢失,然后重新发送数据。
2024-12-10 15:52:47
305
原创 C#知识点18
源端口和目的端口用于标识发送方和接收方的应用程序进程,就像不同房间的门牌号一样,通过端口号可以让数据准确地找到对应的程序。长度字段指明了 UDP 数据报的总长度(首部和数据部分),校验和用于检查数据在传输过程中是否出现错误。UDP 是无连接的协议,这意味着在数据传输之前,发送方和接收方不需要建立像 TCP那样的连接。就好比寄明信片,你不需要提前和收件人建立专门的通信链路,直接把明信片(数据)寄出去就行。UDP 数据报由首部和数据部分组成。UDP即用户数据报协议,是一种简单的传输层协议。
2024-12-10 15:47:12
258
原创 C#知识点17
以固定的时间间隔调用,这个间隔可以在项目设置中设置(通常用于物理更新)。它与 Update 不同,Update 是每一帧调用一次,而 FixedUpdate 的调用频率相对固定,不受帧率变化的影响。:每一帧都会被调用,用于更新游戏状态。:当脚本实例被加载时调用。这个方法总是在任何 Start 函数之前被调用,并且在整个生命周期中只调用一次。:在 Awake 之后,在 Update 函数第一次被调用之前调用。并且在脚本的生命周期中只调用一次。:在 Update 函数之后的每一帧调用。
2024-12-10 15:42:00
262
原创 C#知识点15
粘包” 是在网络编程中经常出现的一个概念在基于 TCP的网络通信中,“粘包” 是指发送方发送的多个数据包被接收方当成一个数据包接收,或者接收方将一个数据包分割成多个部分接收的现象。这是因为 TCP 是一种面向字节流的协议,它不像 UDP那样有消息边界。
2024-12-04 14:13:27
293
原创 C#知识点14
应用层传输层网络层网络接口层四层网络模型每层各司其职,消息在进入每一层时都会多加一个,每多一个报头可以理解为软件是属于上的而"李东","亚健康终结者"这两条消息在进入传输层时使用的是。消息在进入时会被切片为一个个数据包。这个数据包的长度是MSS。
2024-12-03 18:38:08
353
原创 C#知识点13
委托可以有任意个传入和输出参数 以Action,Func来举例。Action 有零个或多个传入参数,但是没有返回值。Func 有零个或多个传入参数,和一个返回值。3、抛出未处理异常给调用线程。Task泛型允许有返回值。使用回调函数获取返回值。1、等待委托异步的结束。
2024-12-02 18:34:52
468
原创 C#知识点12
这时每个线程都指向新的域变量temp(此时每个线程都有属于自己的花括号的域变量)在该线程中temp不受其他线程影响。因为每次循环中的i都是同一个i,是共享变量,在输出的过程中,i的值会发生变化。Lambda简洁高效,但是在捕获变量的时候要注意,捕获的变量是否共享。使用lambda表达式直接传入参数。调用Start方法时传入参数。解决方法-局部域变量。
2024-12-01 18:42:59
247
原创 C#知识点11
每个线程还消耗约1 MB的内存。线程池通过共享和回收线程,允许在不影响性能的情况下启用多线程。每个.NET程序都有一个线程池,线程池维护着一定数量的工作线程,这些线程等待着执行分配下来的任务。2、调用该委托的BeginInvoke方法,获取返回类型为IAsyncResult的值。4、可以随意设置线程池的优先级,在回到线程池时改线程就会被重置。1、线程池的线程不能设置名字 导致线程调试困难。2、线程池的线程都是background线程。3、阻塞一个线程池的线程,会导致延迟。1、声明一个和方法匹配的委托。
2024-11-28 17:45:49
258
原创 C#知识点10
Background线程则不是。一旦Foreground线程执行完,应用程序结束,background就会强制结束。默认情况下创建的线程都是Foreground,只要有一个Foregournd线程在执行,应用程序就不会关闭。此时并不能在Main方法里捕获线程Go方法的异常,如果是Thread自身的异常可以捕获。线程t调用Join方法,阻塞主线程,直到t线程执行结束,再执行主线程。Join可以实现暂停另一个线程,直到调用Join方法的线程结束。可以用IsBackground来查看该线程是什么类型的线程。
2024-11-27 18:25:50
228
原创 C#知识点9
在单处理器计算机上,线程调度程序是执行时间切片 — 迅速切换每个活动线程。在多处理器计算机上,多线程用一种混合的时间切片和真正的并发性来实现,不同的线程会在不同的cpu运行代码。线程是一个独立的运行单元,每个进程内部都有多个线程,每个线程都可以各自同时执行指令。每个线程都有自己独立的栈,但是与进程内的其他线程共享内存。多线程由内部线程调度程序管理,线程调度器通常是CLR委派给操作系统的函数。线程调度程序确保所有活动线程都被分配到合适的执行时间,线程在等待或阻止时不会消耗 CPU 时间。
2024-11-26 18:39:34
221
原创 C#知识点8
视频流媒体:如YouTube和Netflix,视频流媒体对数据传输的实时性要求高,UDP能够减少延迟,提高用户体验。远程登录:如SSH和Telnet,远程登录需要保证命令的顺序执行和响应的正确性,TCP能够提供这种保障。文件传输:如FTP和HTTP,文件传输需要确保数据的完整性和顺序性,TCP的可靠传输机制非常适合。在线游戏:游戏中的实时交互对延迟非常敏感,UDP的低延迟特性使其成为在线游戏的首选。拥塞避免:当网络拥塞迹象出现时,TCP减少发送速率,避免进一步拥塞。
2024-11-25 18:15:56
164
原创 C#知识点7
第三次握手:客户端收到服务器的SYN-ACK包后,发送一个ACK包确认收到服务器的请求。发送方根据接收方的窗口大小调整发送的数据量,确保接收方能够处理接收到的数据。第二次握手:服务器收到SYN包后,回复一个SYN-ACK包,确认收到请求,并向客户端发送自己的SYN请求。第四次挥手:发送方收到FIN包后,发送一个ACK包确认。第二次挥手:接收方收到FIN包后,发送一个ACK包确认。第一次挥手:发送方发送一个FIN包,表示不再发送数据。第三次挥手:接收方准备断开连接时,发送一个FIN包。
2024-11-24 18:41:42
188
原创 C#知识点6
TCP是一种面向连接的、可靠的传输层协议。它确保数据包按顺序且无误地传送到接收方连接建立:TCP是面向连接的协议,这意味着在发送数据之前,通信双方需要先建立一个连接。这通常通过“三次握手”机制完成可靠性:TCP通过序列号和确认机制确保数据包按顺序传输,并使用重传机制处理丢失的数据包。流量控制:TCP使用流量控制机制,确保发送方不会淹没接收方,避免网络拥塞拥塞控制:TCP采用各种拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复)来管理网络拥塞。
2024-11-21 17:39:25
190
原创 C#知识点5
一个Socket一次只能连接一台主机。Socket关闭后无法再次使用。每个Socket对象只能一台远程主机连接,如果你想连接到多台远程主机,你必须创建多个Socket对象。
2024-11-20 19:03:36
160
原创 C#知识点4
静态成员属于类本身,内存中只有一份副本,适合存储全局数据或共享资源。非静态成员属于类的每个实例,每个实例都有自己的成员副本,适合存储与实例相关的数据。静态成员可以通过类名直接访问,而非静态成员必须通过类的实例来访问。
2024-11-19 19:29:51
166
原创 C#知识点2
在中断模式下,可以在右下角看到调用堆栈,在调试模式下 通过调试-窗口-调用堆栈,打开调用堆栈窗口。断点过程中我们可以通过 (调试-窗口-监视),打开监视窗口。断点过程中我们可以通过 (调试-窗口-局部变量)可以通过 (调试-窗口-断点),打开断点窗口。断点过程中我们可以通过 (调试-窗口-即时)
2024-11-15 16:09:07
203
原创 C#知识点1
变量名字写错,导致编译器无法编译(语法错误)有的时候我们的逻辑在某些方面有瑕疵,也会产生错误,这类错误成为语义错误(逻辑错误)断点是调试的核心工具,允许开发者在代码的特定行设置标记。断点是源代码中自动进入中断模式的一个标记,当遇到断点的时候,程序会进入中断模式。中断模式指我们可以暂停程序的执行,然后查看程序中的状态,也可以让程序继续执行。即时窗口允许开发者在调试过程中执行代码语句,查看变量的值或修改变量的值。调用堆栈窗口显示当前执行的函数调用链,帮助开发者理解程序的执行路径。
2024-11-15 12:47:44
150
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人