
.NET
文章平均质量分 52
.NET 学习笔记
天天P
...
展开
-
.NET 面向对象 之 多态,类型的多态:抽象类实现多态
【代码】.NET 面向对象 之 多态,类型的多态:抽象类实现多态。原创 2024-01-13 13:04:06 · 473 阅读 · 0 评论 -
.NET IL代码 解读
IL_0007: ldloc.0 // 取Record Frame中位置为0的元素(V_0)的值("i"的值)并压入栈中 (相当于Copy一份值Call Stack中V_0的值。IL_0008: ldloc.1 // 取Record Frame中位置为1的元素(V_1)的值("j"的值)并压入栈中 (同上)IL_000a: ldloc.2 // 取出Record Frame中位置为2的元素(V_2)的值("k"的值)并压入栈中。Ldloca.S:将位于特定索引处的局部变量的地址加载到计算堆栈上(短格式)。原创 2024-01-13 13:03:32 · 571 阅读 · 0 评论 -
.NET 形参和实参的区别
全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。原创 2024-01-07 09:38:39 · 403 阅读 · 0 评论 -
.NET asp.net core Filter
具有较低Order值的过滤器将在具有较高Order值的过滤器之前执行前置方法;具有较低Order值的过滤器将在具有较高Order值的过滤器之后执行后置方法。授权过滤器 在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。其中OnActionExecuting在所有过滤器之前调用,OnActionExecuted在所有过滤器之后调用。当管道的某个阶段存在多个过滤器时,过滤器执行的默认顺序由作用域确定:全局过滤器优先于控制器过滤器,控制器过滤器优先于Action方法过滤器。原创 2024-01-07 09:37:24 · 409 阅读 · 0 评论 -
.NET 建议不使用:静态帮助类
使用帮助类,只需要一步代码,即完成 帮助类的 依赖与注入,把问题包装起来自己处理,不给调用者带来困扰!改用 接口+实现 IOC 方式 使用 扩展帮助方法。然后,将扩展方法 在 实际使用项目时,增加扩展类。原创 2024-01-05 09:21:05 · 397 阅读 · 0 评论 -
.NET MediatR 之 CQRS
CQRS的全称是:“Command and Query Responsibility Segregation”,直译过来就是命令与查询责任分离,可以通俗的理解为读写分离。IRequest 的消息名称以 Query 为结尾的是查询,其对应的 Handler 执行「读」数据。2、「优化的数据架构」: 读取端可使用针对查询优化的架构,写入端可使用针对更新优化的架构。CQRS 使用命令来更新数据,使用查询来读取数据,将读取和写入 分离到不同的 模型中。2、命令可以放置在队列中进行异步处理,而不是同步处理。原创 2024-01-05 09:19:25 · 501 阅读 · 0 评论 -
.NET 分布式 CAP理论
分区指的是在整个分布式系统中,因为各种网络原因,系统被分隔成多个单独的部分,它不仅包含我们通常说的网络分区,也包含因为网络丢包导致的网络不通的情况。并且,这里说的因为网络丢包导致网络不通的情形,还包含节点宕机的场景,由于系统的其他机器不知道某个节点宕机了,只知道与宕机节点的网络是不通的,所以当节点宕机发生时,其他节点发往宕机节点的包也将丢失。CAP 理论对可用性的定义,指的是要求系统提供的服务必须处于 100% 可用的状态,对于用户的每一个操作请求,系统总能够在有限的时间内返回结果。原创 2023-12-30 14:43:07 · 476 阅读 · 0 评论 -
.NET CAP 理论
如果我们选择了 CA 而放弃了 P,那么当发生分区现象时,为了保证 C,系统需要禁止写入,当有写入请求时,系统返回 error(例如,当前系统不允许写入),这又和 A 冲突了,因为 A 要求返回 no error 和 no timeout。强调 client 读操作能够获取最新的写结果就没有问题,因为事务在执行过程中,client 是无法读取到未提交的数据的,只有等到事务提交后,client 才能读取到事务写入的数据,而如果事务失败则会进行回滚,client 也不会读取到事务中间写入的数据。原创 2023-12-30 14:42:31 · 472 阅读 · 0 评论 -
CAP 学习和思考
订单模块的下单付款扣减库存操作是整个系统的核心,我觉得CA都需要保证,在极端情况下牺牲P是可以的。促销是短时间的数据不一致,结果就是优惠信息看不到,但是已有的优惠要保证可用,而且优惠可以提前预计算,所以可以保证AP现在大部分的电商网站对于支付这一块是独立的系统,或者使用第三方的支付宝,微信。发生“网络分区”时,系统中多个节点的数据一定是不一致的,但是可以选择对用户表现出「一致性」,代价是牺牲「可用性」:将未能同步得到新数据的部分节点置为“不可用状态”,访问到这些节点的用户显然感知到系统是不可用的。原创 2023-12-30 14:41:30 · 404 阅读 · 0 评论 -
CAP 细节
在实际设计过程中,每个系统不可能只处理一种数据,而是包含多种类型的数据,有的数据必须选择 CP,有的数据必须选择 AP。而如果我们做设计时,从整个系统的角度去选择 CP 还是 AP,就会发现顾此失彼,无论怎么做都是有问题的。原创 2023-12-30 14:40:32 · 968 阅读 · 0 评论 -
.NET 面向对象 之 继承,抽象类
【代码】.NET 面向对象 之 继承,抽象类。原创 2023-12-29 12:13:51 · 414 阅读 · 0 评论 -
.NET 面向对象 之 封装
例如,如果对client的用户姓名由原来的简单name来标识,换成以firstName和secondName来实现,如果不是属性封装了字段而带来的隐藏内部细节的特点,那么我们在代码中就要拼命地替换原来xiaoWang.name这样的实现了。(1)字段通常定义为private,属性通常实现为public,而方法在内部实现为private,对外部实现为public,从而保证对内部数据的可靠性读写控制,保护了数据的安全和可靠,同时又提供了与外部接口的有效交互。因此,对外交互的方法,通常实现为public。原创 2023-12-29 12:10:09 · 451 阅读 · 0 评论 -
.NET C#面向对象 之 继承
类似于字段的创建过程,方法表的创建也是父类在先子类在后,原因是显而易见的,类Chicken生成方法列表时,首先将Bird的所有虚方法复制一份,然后和Chicken本身的方法列表做对比,如果有重写的虚方法则以子类方法覆盖同名的父类方法,同时添加子类的新方法,从而创建完成Chicken的方法列表。我们可以在编译器中用单步执行的方法来大致了解其分配的过程和顺序,因此,对象的创建过程是按照顺序完成了对整个父类及其本身字段的内存创建,并且字段的存储顺序是由上到下排列,最高层类的字段排在最前面。原创 2023-12-29 12:08:29 · 969 阅读 · 0 评论 -
.NET 中的继承规则
除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。4、派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。5、类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。派生类可以添加新的成员,但不能除去已经继承的成员的定义。原创 2023-12-29 12:06:20 · 501 阅读 · 0 评论 -
.NET 中的抽象类和抽象方法
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法。4:抽象类中的成员可以私有的(只要不是抽象的)、受保护的、内部的或受保护的内部成员,但接口中的成员必须是公共的。1:它们的派生类只能继承一个基类,即只能继承一个抽象类,但是可以继承多个接口。2:抽象类中可以包含抽象成员,但非抽象类中不可以。2:抽象类中可以定义成员的实现,但接口中不可以。1:抽象方法必须声明在抽象类中。原创 2023-12-29 12:04:26 · 581 阅读 · 0 评论 -
.NET 常用知识小结
结构是值类型,只能继承接口,不能被继承,没有默认的构造函数,可以创建,没有析构函数,不可以用abstract和sealed,没有protected修饰符,可以不用new初始化。类是引用类型,可以继承类、接口和被继承,有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。栈:由编译器自动分配、释放。原创 2023-12-29 11:46:08 · 397 阅读 · 1 评论 -
.NET 单例模式 代码
思考:两个线程同时调用getInstance方法,并且由于singleton是空的,所以两个线程都可以通过第一重的if判断,然后由于锁机制的存在,会有一个线程先进入同步语句,并进入第二重的if判断,而另一个线程就会在外面等待,不过当第一个线程执行完 new Singleton() 语句后,就会退出 synchronized 保护的区域,如果没有第二重singleton == null的话,那么第二个线程也会创建一个实例,这就破坏了单例;类装载的时候就完成了实例化,避免了线程同步的问题;原创 2023-12-29 10:44:57 · 457 阅读 · 1 评论 -
.NET C#反射(Reflection)详解
这个接口中包含一个Extension属性,这个属性返回支持的扩展名,另一个方法返回一个解码器的对象(这里我假设了一个Decoder的类,这个类提供把文件流解码的功能,扩展插件可以派生之),通过解码器对象我就可以解释文件流。这样的话,我就不需要在开发播放器的时侯知道将来扩展的格式的类型,只需要从配置文件中获取现在所有解码器的类型名称,而动态的创建媒体格式的对象,将其转换为IMediaFormat接口来使用。答案是可以,这就是反射了,就是在程序运行的时候提供该类型的地址,而去找到它。原创 2023-12-29 10:50:30 · 459 阅读 · 1 评论 -
.NET 希尔排序
希尔排序是将组分段,进行插入排序。原创 2023-12-29 10:38:24 · 374 阅读 · 1 评论 -
.NET 插入排序
输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。原创 2023-12-29 10:37:05 · 386 阅读 · 1 评论 -
.NET 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。选择排序是不稳定的。算法复杂度O(n2)–[n的平方]原创 2023-12-29 10:35:10 · 410 阅读 · 1 评论 -
.NET 直接插入排序
直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位 插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。原创 2023-12-29 10:33:14 · 378 阅读 · 1 评论 -
.NET 冒泡排序算法
冒泡排序 作为一种渐进复杂度O(N^2)的排序方法, 实质上属于一种形式“玄妙的”选择排序,只是相比选择排序多了一些无意义的交换。它比选择排序更难于理解和解释(就在于它多次无意义的交换的干扰,不信你讲给楼下阿姨比较下),又不具有插入排序的“在线”优点,跟极易理解的基数排序更不能在思维难度上相比,就算同快排,归并相比,也具有复杂度高得多的劣势。那么为什么冒泡排序会作为经典,成为初学者学习语言的遇到的首个算法?原创 2023-12-29 10:31:49 · 633 阅读 · 1 评论