- 博客(24)
- 收藏
- 关注
原创 C#23 12.23
队列允许在一端(队尾)添加元素(称为入队),并在另一端(队头)移除元素(称为出队)。队列是集合类System.Collections.Generic命名空间下的一部分,用于存储具有相同类型的元素序列。队列遵循先进先出的原则,即最早加入队列的元素将首先被移除。
2024-12-23 18:55:15
175
原创 C#22 12.22
尾递归是一种特殊的递归形式,其中递归调用是函数体中的最后一个操作。在尾递归中,当前函数的状态(或返回值)直接依赖于递归调用的结果,而不需要进行任何进一步的计算。尾递归的一个重要性质是,理论上,编译器或解释器可以优化它,通过重用当前函数的调用帧来避免栈溢出,这种优化技术称为尾调用消除(Tail Call Elimination)。递归是一种编程技术,其中一个函数直接或间接地调用其自身。递归函数通常包含一个或多个基准条件(base case),这些条件在递归的某个阶段会阻止函数继续调用自身,从而避免无限循环。
2024-12-22 18:37:28
144
原创 C#21 12.19
异步编程的特点非阻塞执行:异步编程允许在等待IO操作(如文件读写、网络请求、数据库查询等)或长时间计算任务完成时,不阻塞当前线程,从而可以继续执行其他任务。 提高资源利用率:通过并发执行多个任务,异步编程可以更好地利用计算资源,提高程序的性能和响应速度。 提升用户体验:在GUI应用程序中,异步编程可以保持用户界面的响应性,避免界面卡顿,提升用户体验。C#中实现异步编程的方式Task和Task<TResult>:这是.NET Framework 4.0引入的异步编程基础。Task表示
2024-12-19 19:48:56
315
原创 C#20 12.18
委托可以看作是对具有特定参数列表和返回类型的方法的引用。当你定义一个委托时,你实际上是在声明一个可以引用符合特定签名(即参数类型和返回类型)的任何方法的类型。
2024-12-18 18:42:14
155
原创 C#18 12.9
接收方在收到数据报后,可以重新计算校验和并与发送方的校验和进行比较,以检测数据报是否在传输过程中被损坏。由于 UDP 的上述特性,它通常用于那些对实时性要求较高而可靠性要求相对较低的应用场景,如实时视频传输、在线游戏、DNS 查询等。UDP 将应用程序的数据封装成一个个独立的数据报(Datagram),每个数据报都包含完整的源地址、目的地址、长度和校验和等信息。综上所述,UDP 是一种简单、高效、面向数据报的传输层协议,它适用于那些对实时性要求较高而可靠性要求相对较低的应用场景。
2024-12-10 19:32:08
251
原创 C#17 12.8
引用参数(Reference Parameters):输出参数(Output Parameters):值参数(Value Parameters):委托参数(Delegate Parameters):
2024-12-09 11:21:47
176
原创 C#16 12.5
异常(Exception)是指在程序执行过程中,由于某些不期望的情况(如除零错误、文件未找到、网络问题等)导致的程序异常终止或需要特殊处理的情况。块中的代码就会被执行。在这个块中,你可以编写处理异常的代码,比如记录错误信息、向用户显示错误消息、清理资源等。结构用于捕捉和处理这些异常,以防止程序因为未处理的异常而崩溃。块中的代码执行时,如果发生了异常,程序会立即跳转到对应的。:这是放置可能引发异常的代码的区域。块通常与一个特定的异常类型相关联。:这是处理异常的代码区域。
2024-12-06 11:10:56
232
原创 C#15 12.4
在Unity这样的游戏开发引擎中,直接使用底层的Socket API可能会比较复杂,因为需要处理很多细节,比如连接管理、数据序列化、错误处理等。尽管封装后的Socket库提供了很多便捷的功能,但开发者仍然需要注意一些网络编程中的常见问题,比如网络延迟、数据丢失、安全性等。简单来说,Socket就像是一个电话插座,当两个Socket连接在一起时,它们就可以进行数据的发送和接收。在Unity中使用封装后的Socket时,开发者通常只需要调用封装库提供的接口,而不需要关心底层的实现细节。
2024-12-06 10:58:01
194
原创 C#14 12.3
总之,TCP和UDP在解决丢包问题上采取不同的策略。TCP通过内置的可靠性机制来确保数据的可靠传输;而UDP则需要依赖应用层或其他外部机制来解决丢包问题。在实际应用中,可以根据具体需求选择合适的传输协议和解决方案。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP是一种无连接的、不可靠的传输层协议。
2024-12-03 18:44:28
1681
原创 C#13 12.2
粘包指的是发送方发送的数据包在传输过程中被合并成一个或多个更大的数据包,而接收方在接收到这些数据包时无法正确区分原始数据包的边界,从而导致数据解析出错或者数据丢失。
2024-12-02 18:43:30
313
原创 C#12 12.1
这时每个线程都指向新的域变量temp(此时每个线程都有属于自己的花括号的域变量)在该线程中temp不受其他线程影响。因为每次循环中的i都是同一个i,是共享变量,在输出的过程中,i的值会发生变化。Lambda简洁高效,但是在捕获变量的时候要注意,捕获的变量是否共享。调用Start方法时传入参数。解决方法-局部域变量。
2024-12-02 18:31:56
131
原创 C#11 11.28
1、线程池的线程不能设置名字 导致线程调试困难2、线程池的线程都是background线程3、阻塞一个线程池的线程,会导致延迟4、可以随意设置线程池的优先级,在回到线程池时改线程就会被重置。
2024-11-28 18:24:04
158
原创 C#10 11.27
Background线程则不是。一旦Foreground线程执行完,应用程序结束,background就会强制结束。默认情况下创建的线程都是Foreground,只要有一个Foregournd线程在执行,应用程序就不会关闭。此时并不能在Main方法里捕获线程Go方法的异常,如果是Thread自身的异常可以捕获。线程t调用Join方法,阻塞主线程,直到t线程执行结束,再执行主线程。Join可以实现暂停另一个线程,直到调用Join方法的线程结束。Foreground线程和Background线程。
2024-11-27 18:41:54
157
原创 C#9 11.26
当创建一个线程时,就会消耗几百毫秒cpu,创建一些新的私有局部变量栈。线程池通过共享和回收线程,允许在不影响性能的情况下启用多线程。一旦Foreground线程执行完,应用程序结束,background就会强制结束。默认情况下创建的线程都是Foreground,只要有一个Foregournd线程在执行,应用程序就不会关闭。每个.NET程序都有一个线程池,线程池维护着一定数量的工作线程,这些线程等待着执行分配下来的任务。可以用IsBackground来查看该线程是什么类型的线程。
2024-11-26 18:58:21
236
原创 C#8 11.25
UDP将数据分割成独立的数据报,每个数据报包含源端口、目标端口、长度和校验和。校验和覆盖了UDP头部和数据部分,但它的错误检测能力有限,无法像TCP那样确保数据的完整性。:UDP不保证数据包的传输成功率,也不保证数据包的顺序。:UDP不具备TCP的流量控制机制,无法根据接收方的处理能力调整数据传输速率,可能导致数据包的丢失或网络拥塞。:UDP不具备TCP的拥塞控制机制,当网络拥塞时,UDP不会自动减少传输速率,可能加剧网络拥塞。:UDP的头部仅包含源端口、目标端口、长度和校验和,结构简单,传输开销小。
2024-11-25 18:33:09
283
原创 C#7 11.24
无流量控制:UDP不具备TCP的流量控制机制,无法根据接收方的处理能力调整数据传输速率,可能导致数据包的丢失或网络拥塞。无拥塞控制:UDP不具备TCP的拥塞控制机制,当网络拥塞时,UDP不会自动减少传输速率,可能加剧网络拥塞。第二次握手:服务器收到SYN包后,回复一个SYN-ACK包,确认收到请求,并向客户端发送自己的SYN请求。文件传输:如FTP和HTTP,文件传输需要确保数据的完整性和顺序性,TCP的可靠传输机制非常适合。较高的延迟:由于TCP的连接建立、重传和拥塞控制机制,它的传输延迟较高。
2024-11-24 19:02:10
563
原创 C#6 11.21
TCP和UDP是两种不同的传输协议,各有其优势和适用场景。TCP提供可靠的、有序的数据传输服务,适用于对数据完整性要求较高的应用场景;UDP则提供快速传输和较低的开销,适用于实时性要求高但数据可靠性要求不高的应用场景。在实际应用中,应根据具体需求和应用场景的不同,选择适合的协议以提高网络性能和用户体验。
2024-11-21 18:29:58
352
原创 C#5 11.20
每个Socket对象只能一台远程主机连接,如果你想连接到多台远程主机,你必须创建多个Socket对象。:优化Socket缓冲区大小,以平衡内存使用和吞吐量。:Socket编程中,网络异常非常常见,如连接超时、网络中断等。因此,要添加充分的异常处理代码,如try-catch块,以捕获并处理这些异常。:确保及时关闭Socket连接和释放相关资源,避免资源泄漏。:配置防火墙和路由器,确保Socket通信所需的端口是开放的,并且允许相应的流量通过。一个Socket一次只能连接一台主机。Socket的注意事项。
2024-11-20 18:57:12
186
原创 C#4 11.19
在Visual Studio(VS)中或更广泛地在C#编程环境中,Socket类的静态成员和非静态成员有着根本的区别。这些区别主要基于面向对象编程的基本原理,而不仅仅是在Visual Studio这个开发环境中的特定表现。
2024-11-19 19:28:53
132
原创 C#3 11.18
Socket编程是一种允许程序通过网络进行通信的方法。在计算机网络中,Socket可以被看作是一种特殊的文件描述符,通过这个文件描述符,程序可以读写远程或本地网络服务提供的数据流。Socket通信涉及服务器端和客户端两端的编程,服务器端的Socket会绑定到一个端口上,并监听来自客户端的连接请求;综上所述,VS中的Socket编程是网络编程的重要部分,它允许程序通过网络进行通信。通过理解Socket的基本概念、工作原理以及VS中的Socket编程方法,开发者可以构建出高效、稳定的网络应用程序。
2024-11-18 19:11:33
323
原创 C#2 11.14
中断模式下(调试-窗口-局部变量)可以在断点过程中观察断点位置上下代码的变量数值变化。中断模式下(调试-窗口-即时)可以在断点过程中修改变量的值或输入表达式。中断模式下(调试-窗口-监视)可以自定义要监视的字段。中断模式下(调试-窗口-堆栈)(调试-窗口-断点)
2024-11-15 13:40:51
127
原创 C#1 11.13
这样,开发者可以检查当前程序的状态,包括变量的值、调用堆栈等。断点调试是Unity开发中常用的调试手段之一,但它并不是唯一的调试方法。在Visual Studio中,我们可以使用Console.Write(或WriteLine)方法向控制台输出变量的值,从而检查这些值是否符合预期,以便调试错误。而在中断模式下的调试中,我们可以暂停程序的执行,以便查看程序的状态,并决定是否让程序继续执行。此时,开发者可以在调试器中查看当前程序的状态,包括变量的值、调用堆栈等,以便进行调试和分析。
2024-11-14 16:11:40
498
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人