- 博客(67)
- 收藏
- 关注
翻译 使用网络依赖注入的装饰器模式
假设您的代码库中有一个(全局使用的)接口(来自您自己的或来自第三方的),并且您想要引入需要应用于所有实例的通用行为。它通过将类封装在一个(或多个)装饰器类中来实现这一点,这些装饰器类将方法调用委托给链接的类。接下来,更新 DI 配置以使用 Scrutor 的“Decorate”方法,而不是使用工厂方法手动执行此操作。,它是真实实例(或装饰实例),并用自己的实现包装它。实现此目的的一种方法是创建一个包含新行为的新(抽象)类,然后在所有派生类中从该类继承。在下面的例子中,我们定义了一个装饰器,它在调用存储库(
2024-08-15 10:44:52
103
翻译 Csharp 中的模式匹配示例
我第一次接触模式匹配是在几年前,当时我正在摆弄一些函数式编程语言,比如 Elixir 和 F#。当我用 C#(以及 JavaScript)编写代码时,我缺少对值或对象进行模式匹配的能力。我很高兴看到 C# 7 引入了,它支持最低限度的功能。由于我之前接触过模式匹配,所以这有点令人失望,因为它没有我习惯的所有可能性。幸运的是,C# 8 的发布通过支持更多功能扩展了模式匹配语法,这些功能在 C# 9 中得到了进一步增强,而且这种趋势似乎在即将推出的 C# 版本中仍在继续。
2024-08-15 10:35:51
117
翻译 在 Blazor 中集成 Tailwind CSS
如果您正在浏览此页面,您可能已经熟悉,这是一个实用优先的 CSS 框架,并且您希望将其集成到您的 Blazor 应用程序中。因此,我不会浪费您的时间介绍 Tailwind CSS,而是直接进入正题。
2024-08-15 10:27:09
177
原创 8.性能注意事项和最佳实践
内存管理是软件开发的一个重要方面,它直接影响应用程序的性能、可靠性和可扩展性。在 .NET 生态系统中,开发人员必须根据正在开发的应用程序类型考虑不同的内存管理策略。桌面应用程序在资源有限的单台机器上运行。高效的内存使用对于避免耗尽系统资源至关重要。了解 .NET GC 相对于框架(Windows Forms、WPF 或 WinUI)的行为非常重要。每个框架都有细微差别,因此可以采用不同的编码技术来确保应用程序高效运行。
2024-08-04 08:17:04
104
原创 7.低级编程
本章深入介绍了低级编程的各种技术和概念,主要涉及编写不安全代码和与非托管代码交互的代码。它涵盖了内存分配、指针、固定语句和互操作机制等重要主题,包括 P/Invoke、COM Interop、Interop Marshaling 和SafeHandle类。我们首先回顾了什么是托管和非托管内存,以及如何分配 GC 不管理的内存。当我们有需要尽可能高性能的操作时,这一点变得至关重要,这意味着我们希望减少 GC 参与分配和释放内存的性能开销。
2024-08-04 08:15:16
54
原创 6.内存分析和优化
识别分配模式涉及了解如何以及在何处为对象和数据结构分配内存。这可以帮助开发人员优化内存使用,提高性能,并减少与内存泄漏和过度垃圾收集相关的问题。关于垃圾收集,我们现在知道这是 .NET 开发中的一个标志性功能,GC 在评估哪些对象仍在使用以及哪些对象超出范围后会自动为我们释放内存。我们还知道我们可以编写代码来消除 GC 的影响,这就是我们最终出现内存泄漏的原因。由于很难轻松检测到错误代码的执行位置,我们可以将代码片段添加到代码中的不同执行点,以尝试评估是否发生了垃圾收集以及发生了多少次。GC0。
2024-08-04 08:12:51
114
原创 5.高级内存管理技术
本章介绍了并发、多线程和异步编程范式中的内存管理。每个部分都提供了实用的见解和全面的理解,以适应现代软件开发在 .NET 中的特定需求和复杂性。我们回顾了 .NET 如何在多个线程并行运行的环境中处理内存,以及 GC 如何寻求高效和并发地管理内存,重点是最大限度地减少暂停时间和最大限度地提高吞吐量。我们讨论了并发编程挑战,例如竞争条件、死锁和饥饿,以及解决方案,例如锁定机制、使用不可变对象以及使用 .NET 提供的并发集合来减轻同步开销并改善内存管理。
2024-08-04 08:09:15
66
原创 4.内存泄漏和资源管理
本章探讨了检测应用程序中内存泄漏的各种技术和工具。它强调了识别内存泄漏迹象的重要性,例如随着时间的推移内存使用量逐渐增加、应用程序速度变慢或由于资源耗尽而崩溃。我们还回顾了内存分析,使用 .NET 特定的工具和方法来检查 .NET 应用程序如何利用内存。我们介绍了使用 Visual Studio 中的内存使用情况分析器和诊断工具。这些工具为我们提供有关应用程序在调试期间的执行情况的实时反馈,对于早期内存泄漏检测非常有用。然后,我们回顾了如何使用 .NET CLI 中的扩展来分析数据转储和内存使用情况。
2024-08-04 08:06:47
184
原创 3.内存分配和数据结构
本章探讨了内存分配和优化概念的几个维度。反复出现的主题是不同的构造为我们的算法和应用程序带来不同的好处。我们首先讨论了 Java、C 和 C++ 中内存分配的基础知识,因为它们是基础语言,是 C# 的有力竞争对手。我们看到了 C 和 C++ 将处理内存分配和释放的责任放在开发人员手中。相比之下,Java 和 .NET 采用自动清理过程并遵循类似的理念。我们还深入研究了各种 .NET 数据结构,例如数组、列表、字典和更专业的集合,例如SpanMemory和并发集合。
2024-08-04 08:02:07
277
原创 2.对象生命周期和垃圾回收
在本章中,我们更深入地了解了垃圾收集、对象分配和释放,以及一些确保我们编写高效应用程序的技术。了解系统中的对象和引用生命周期可以帮助我们作为开发人员在编写代码时做出正确的决策。我们始终希望确保,虽然 .NET 运行时为我们提供了一个出色的后台工具来自动清理我们的混乱,但我们也不会制造不必要的混乱。CLR 管理对象在内存中的分配方式,并保留一个连续的块以满足应用程序的需求。在这个连续的块中,根据实际进程的需求创建和清理对象。保留一个连续块的显著优势是几乎没有碎片。这使得在需要时很容易找到对对象的引用。
2024-08-04 08:00:07
56
原创 1.内存管理基础知识
现代计算机旨在在应用程序运行时存储和检索数据。每台现代设备或计算机都旨在允许一个或多个应用程序在读取和写入支持数据的同时运行。数据可以长期或短期存储。对于长期存储,我们使用硬盘等存储介质。这就是我们所说的非易失性存储。如果设备断电,数据会保留下来,以后可以重新使用,但这种类型的存储并未针对高速情况进行优化。除了需要长时间存储的数据外,应用程序还必须在进程之间存储数据。当应用程序执行各种操作时,数据会不断被写入、读取和删除。这种数据类型最好存储在易失性存储或内存缓存和数组中。
2024-08-04 07:55:52
184
原创 9. 无限循环
第三个选项是使用和。关于的事情是它们实际上不是数组,它们只是指向数据项的指针,以及如何获取下一个项的指令。在这种情况下,我们可以创建自己的 IEnumerable 接口实现,但具有我们自己的行为。在我们的 Monopoly 示例中,我们希望能够迭代,直到用户选择一种方法来越狱,或者掷出双数。我们实际上从外部世界开始使用,但。是位于幕后的类,实际上执行枚举工作。这就是我们需要开始的。了解其底层工作原理后,您可以看到如何在Enumerable中实现您想要的任何行为。如果您愿意,您可以像Enumerable。
2024-08-03 09:36:54
851
原创 8. 柯里化和部分应用
柯里化和部分应用是另外两个直接来自旧数学论文的函数式概念。前者与印度食物毫无关系,尽管它确实很美味,但它以杰出的美国数学家 Haskell Brooks Curry 的名字命名,有不少于三种编程语言以他的名字命名。柯里化源自 Haskell Curry 在组合逻辑方面的工作,它是现代函数式编程的基础之一。我不会给出枯燥的正式定义,而是通过示例进行解释。在这个例子中,我们期望答案是 300(即 100+200),事实确实如此。但是,如果我只提供一个参数会怎样?
2024-08-03 09:36:14
1043
原创 7.函数流
调用外部系统(无论是数据库、Web API 还是其他什么)绝对是一件痛苦的事情,不是吗?在使用数据之前(这是您正在编写的函数中最重要的部分),您必须:捕获并处理任何异常。可能是网络出现故障,或者数据库服务器离线?检查从数据库返回的内容是否为 NULL检查是否存在实际、合理的数据集,即使它不为 NULL。这些都是大量繁琐的样板代码,所有这些都会妨碍您的实际业务逻辑。
2024-08-03 09:35:25
443
原创 6.可区分联合
高阶函数这个名字对于一个非常简单的东西来说有点奇怪。事实上,如果你花了很多时间使用 LINQ,那么你可能已经使用它们一段时间了。传递到Where函数的是一个箭头表达式 - 这只是写出函数的简写。因此,这里,该函数已作为参数传递给另一个函数,并在该函数内部的其他地方执行。在这里,我们使用代码创建一个Func委托并将其作为另一个函数的返回类型返回,这次将在创建它的函数的某个外部使用。简而言之,高阶函数是作为变量传递的函数。这可以是另一个函数的返回类型或参数。
2024-08-03 09:34:45
458
原创 5.高阶函数
高阶函数这个名字对于一个非常简单的东西来说有点奇怪。事实上,如果你花了很多时间使用 LINQ,那么你可能已经使用它们一段时间了。传递到Where函数的是一个箭头表达式 - 这只是写出函数的简写。因此,这里,该函数已作为参数传递给另一个函数,并在该函数内部的其他地方执行。在这里,我们使用代码创建一个Func委托并将其作为另一个函数的返回类型返回,这次将在创建它的函数的某个外部使用。简而言之,高阶函数是作为变量传递的函数。这可以是另一个函数的返回类型或参数。
2024-08-03 09:33:31
423
原创 5.高阶函数
高阶函数这个名字对于一个非常简单的东西来说有点奇怪。事实上,如果你花了很多时间使用 LINQ,那么你可能已经使用它们一段时间了。传递到Where函数的是一个箭头表达式 - 这只是写出函数的简写。因此,这里,该函数已作为参数传递给另一个函数,并在该函数内部的其他地方执行。在这里,我们使用代码创建一个Func委托并将其作为另一个函数的返回类型返回,这次将在创建它的函数的某个外部使用。简而言之,高阶函数是作为变量传递的函数。这可以是另一个函数的返回类型或参数。
2024-08-03 09:31:35
317
原创 4. 用功能代码来巧干,而不是苦干
我们大多数人在编码时可能都使用过 Enumerable,但您是否知道,在表面之下有一个引擎,您可以访问它并使用它来创建各种有趣的自定义行为?使用自定义迭代器,当循环数据时需要更复杂的行为时,我们可以大幅减少所需的代码行数。但首先,有必要了解 Enumerable 在表面之下的工作原理。在 Enumerable 的表面之下有一个类,它是驱动 Enumeration 的引擎,它允许您使用 ForEach 循环遍历值。它被称为 Enumerator。Current:从可枚举对象中取出当前项。
2024-08-03 09:30:41
339
原创 3. C# 7 及更高版本中的函数式编码
在本章中,我们研究了自函数式编程开始集成到 C# 3 和 4 以来发布的所有 C# 功能。我们研究了它们是什么、如何使用它们以及为什么值得考虑。模式匹配,在 C# 中实现为 switch 语句的高级形式,允许简短而简单地编写非常强大的代码节省逻辑。我们看到了每个版本的 C# 都为开发人员贡献了更多的模式匹配功能。不变性,即在实例化变量后防止其被更改的能力。
2024-08-03 09:30:00
710
原创 2. 我们现在能做什么?
递归位于许多函数式迭代版本的背后。对于任何不知道的人来说,它是一个反复调用自身的函数,直到满足某些条件。它是一种非常强大的技术,但在 C# 中有一些限制需要牢记。如果开发不当,它会导致无限循环,直到用户终止应用程序或堆栈上所有可用空间都被消耗为止。正如流行的英国奇幻 RPG 游戏节目Knightmare的传奇地下城主 Treguard 所说的那样:“哦,真讨厌”。在 C# 中,与其他形式的迭代相比,它们往往会消耗大量内存。有办法解决这个问题,但这是另一章的主题。
2024-08-03 09:28:24
1038
原创 1.函数式编程介绍
函数式编程中有几个基本概念,其中许多概念的名称相当晦涩,但其实并不难理解。我会尽量在这里简单地介绍它们。在使用 C# 进行函数式编程的这一激动人心的第一部分中,我们强大而令人敬畏的英雄——你——勇敢地了解了函数式编程到底是什么,以及为什么值得学习。不变性高阶函数表达式优于语句引用透明性递归模式识别无状态讨论了函数式编程最适合使用的领域,以及可能需要讨论是否以纯粹的形式使用它。我们还研究了使用函数式范式编写应用程序的诸多好处。
2024-08-03 09:26:30
631
原创 11.提高应用程序性能
通常,Windows Presentation Foundation (WPF) 应用程序的性能是其最大的问题之一。我们渲染的数据对象和 UI 包含的视觉层越多,渲染它们所花费的时间就越多,因此我们经常需要保持平衡 在使我们的应用程序具有视觉吸引力和使其性能更好之间。这种情况可以通过在功能更强大的计算机上运行我们的 WPF 应用程序来改善。这就解释了为什么这些应用程序在金融行业中最为普遍。但是,并不是每个人都可以为此更新所有用户的计算机。
2024-08-02 11:11:54
858
原创 10.完成出色的用户体验
这四个值的工作方式类似于 Margin 属性,使我们能够为四个边中的每一个设置不同的值,或者在 CornerRadius 属性的情况下为角设置不同的值。我们需要在我们的 FeedbackManager 类中添加一个新方法,以使我们能够直接添加来自 GetDataOperationResult 和 SetDataOperationResult 类的反馈消息。这假设我们已经有一个我们想要用于 TextBox 控件的默认样式,并且我们的新样式将基于该样式,但添加了这个额外的可聚焦功能。
2024-08-02 11:09:35
542
原创 9.实施响应式数据验证
INotifyDataErrorInfo 接口已添加到 .NET 4.5 中的 .NET Framework 中,以解决对先前 IDataErrorInfo 接口的问题。和 IDataErrorInfo 接口一样,INotifyDataErrorInfo 接口也是一个简单的事情,我们只需要实现三个成员。
2024-08-02 11:07:31
542
原创 8.创建具有视觉吸引力的用户界面
在内部边框内,我们声明了一个 Grid 面板,以便我们可以添加所需的 ContentPresenter 和使用资源中的 GreenGlow 画笔绘制的 Rectangle 元素。特别要注意的是,它的 RelativeTransform 属性设置为名为 ScaleTransform 的 ScaleTransform 元素,并且它的第三个 GradientStop 对象是我们控件中绑定到 GlowColor 属性的数据。在这种情况下,我们已经有了 MainWindow 类,需要添加一个额外的窗口。
2024-08-01 15:29:13
955
原创 7.精通动画
WPF 提供了广泛的动画可能性,从简单到非常复杂。在本章中,我们将深入探讨 WPF 属性动画系统,但主要关注那些可以适用于实际业务应用程序的部分。我们将研究如何实时控制正在运行的动画,并主要关注基于 XAML 的语法。然后我们将看到如何将动画直接构建到我们的应用程序框架中。在 WPF 中,动画是通过定期重复更改各个属性值来创建的。动画由许多组件组成:我们需要一个计时系统、一个负责更新特定类型对象值的动画对象和一个合适的动画属性。
2024-08-01 14:32:04
776
原创 6.调整内置控件
它们在控件生命周期中的某些点被调用,使我们能够更改每个控件的默认行为。它们使我们能够做一些简单的事情,例如在控件初始化后立即启动进程,或者在应用后从自定义。
2024-07-31 10:26:43
1006
原创 5.为工作使用正确的控件
当内置面板的布局行为不能满足我们的要求时,我们可以轻松地定义具有自定义布局行为的新面板。我们需要做的就是声明一个扩展 Panel 类的类并重写其 MeasureOverride 和 ArrangeOverride 方法。在 MeasureOverride 方法中,我们只需对 Children 集合中的每个子项调用 Measure 方法,并传入设置为 double.PositiveInfinity 的 Size 元素。
2024-07-31 10:20:04
2156
原创 ArcPy-11.地图脚本
本章介绍 ArcPy 制图模块,也称为arcpy.mp。该模块的主要目的是操作现有项目 (.aprx) 和图层文件 (.lyrx) 的内容。这包括处理地图、图层和表格;应用符号系统;以及管理布局。**注意:**尽管该模块被称为制图模块,但这个名称可能会造成混淆。x中 ArcPy 中的模块称为,但 ArcGIS Pro 的功能发生了重大变化,该模块被arcpy.mp模块取代。但更一般地说,该模块的目的是相同的,即自动执行制图任务。因此,它仍然被称为制图模块,尽管实际名称是arcpy.mp。
2024-07-30 15:49:15
294
原创 ArcPy-10.使用栅格
栅格是一种独特的空间数据,许多地理处理工具都是专门为利用栅格数据结构而设计的。ArcPy 包括arcpy.sa(空间分析器)和arcpy.ia(图像分析器)模块,它们提供对许多地理处理工具的访问,以处理图像和栅格数据。本章说明如何使用 ArcPy 处理栅格对象、列出和描述栅格以及执行栅格数据分析和处理。ArcPy 还将地图代数集成到 Python 环境中。还介绍了arcpy.sa和arcpy.ia。
2024-07-30 15:42:25
312
原创 ArcPy-9.处理几何图形
本章介绍如何使用几何图形,包括如何从现有要素中读取几何图形对象的属性以及如何从坐标信息创建新的几何图形对象。单个要素(例如点、折线和多边形)可以分解为顶点。通过从这些顶点的坐标列表创建几何图形对象来写入几何图形。能够读取和写入几何图形可以详细控制要素类、要素以及构成要素的部分和顶点。要素类中的每个要素都由顶点组成。顶点是一对 x,y 坐标。可以使用几何图形对象(例如点、折线和多边形)访问这些顶点。您可以通过在要素类的几何图形字段(通常名为 Shape)上设置游标来使用几何图形对象及其属性。设置游标是通过使用
2024-07-30 13:34:48
257
原创 4.精通数据绑定
我们在本章中介绍了许多重要信息,从检查绑定路径语法迷你语言到探索许多不同的绑定场景。我们研究了声明我们自己的依赖属性时提供的大量选项,并使用一些有趣的示例研究了附加属性的创建。最后,我们研究了数据模板的更详细的细节,并探索了将数据绑定到枚举的多种方法。在下一章中,我们将深入了解 WPF 框架中的各种 UI 元素及其最相关的属性。我们将研究何时自定义它们以及何时需要创建自己的控件。然后,我们将探索修改 WPF 中现有控件的各种方法,最后,详细了解如何创建我们自己的自定义控件。
2024-07-29 09:33:17
889
原创 3.编写自定义应用程序框架
用最简单的术语来说,应用程序框架由类库组成,这些类库共同提供应用程序所需的最常见功能。通过使用应用程序框架,我们可以大大减少创建应用程序各个部分所需的工作量和时间。简而言之,它们支持应用程序的未来开发。在典型的三层应用程序中,框架通常会扩展到应用程序的所有层;表示层、业务层和数据访问层。因此,在使用 MVVM 模式的 WPF 应用程序中,我们可以在该模式的所有三个组件中看到应用程序框架的各个方面;模型、视图模型和视图。
2024-07-29 09:27:46
533
原创 2.调试 WPF 应用程序
在本章中,我们研究了追踪编码问题的最佳方法。我们研究了我们可以访问的各种调试跟踪输出,甚至发现了如何输出我们自己的自定义跟踪信息。我们发现 WPF 中引发的异常通常会在其属性中隐藏有用的信息。最后,我们找到了一些在尝试查找数据绑定值错误时可以使用的提示和技巧。下一章将深入探讨应用程序框架的主题,我们将开始构建我们自己的框架。我们了解基类的好处,并发现实现框架功能的替代方法。本章最后将研究各种技术,以确保我们的应用程序保持 MVVM 提供的基本关注点分离。
2024-07-29 09:16:54
962
原创 1.使用 WPF 的更智能方式
模型-视图-视图模型 (MVVM) 是一种软件架构模式,由 John Gossman 于 2005 年在他的博客上提出,现在在开发 WPF 应用程序时普遍使用。其主要目的是在业务模型、用户界面 (UI) 和业务逻辑之间提供关注点分离。它通过将它们分为三种不同类型的核心组件来实现这一点:模型、视图和视图模型。让我们看一下它们是如何排列的以及每个组件代表什么:正如我们在这里看到的,视图模型组件位于模型和视图之间,并提供对它们中的每一个的双向访问。
2024-07-29 09:13:39
1116
原创 ArcPy-8.处理空间和表格数据
本章详细介绍了用于处理数据的 ArcPy 数据访问模块arcpy.da。此模块允许控制编辑会话、编辑操作、光标支持、用于将表和要素类转换为 NumPy 数组或从 NumPy 数组转换为 NumPy 数组以进行其他处理的函数,以及对版本控制和副本工作流的支持。本章重点介绍用于迭代表中行的光标。不同类型的光标搜索记录、添加新记录和更改现有记录。搜索光标在 Python 中执行 SQL 查询表达式。本章还介绍了文本和字段名称的验证。
2024-07-29 09:00:00
249
原创 ArcPy-7.调试和错误处理
本章讨论了调试过程并回顾了最常见的 Python 错误。还讨论了错误处理过程,包括如何充分利用try-except语句。无论您在编写代码时多么小心,错误都必然会发生。Python 有三种主要类型的错误:语法错误、异常和逻辑错误。语法错误首先会阻止代码运行。当发生异常时,脚本将在中途停止运行。逻辑错误意味着脚本将运行但会产生不理想的结果。接下来将回顾语法错误和异常,并介绍如何解决它们的策略。
2024-07-29 08:55:00
250
原创 ArcPy-6.探索空间数据
本章介绍了几种探索空间数据的方法,包括检查数据集是否存在、描述数据集以及在工作空间中列出数据集。列表函数不仅用于列出数据集,还用于列出工作空间、字段和表等元素。内置 Python 函数可用于操作列表。列表在脚本中很常见,因为它们可以迭代元素以自动化工作流程。
2024-07-28 11:00:27
200
原创 ArcPy-5.使用 Python 进行地理处理
本章介绍 ArcPy 包,该包允许将 ArcGIS Pro 与 Python 紧密集成。ArcPy 包含许多模块、类和函数,这使得可以在 Python 脚本中使用 ArcGIS Pro 中的所有地理处理工具。本章概述了 ArcPy 的功能,重点介绍了使用地理处理工具。它还介绍了与运行地理处理工具相关的其他非工具功能,包括建立环境、设置数据路径和管理许可证。后续章节介绍了 ArcPy 中可用的其他功能。
2024-07-28 10:57:00
184
原创 ArcPy-4.学习 Python 语言基础知识
本章介绍 Python 语言的基础知识,包括数据类型和数据结构、变量、关键字、语句和表达式、方法、函数和模块的使用。这些元素构成了用 Python 编写代码的基本语法。本章的第二部分介绍控制工作流,包括条件语句、分支和循环的使用。这些结构是 ArcGIS Pro 地理处理脚本的重要元素,也是批处理操作的基础。本章的第三部分专门介绍编写脚本的最佳实践,包括命名约定、代码组织和提供注释。**注意:**作为重要提醒,本书专门关注 Python 3。
2024-07-28 10:35:47
208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人