
CSharp
文章平均质量分 51
C#编程语言的基本知识
zhy29563
让我踩过的坑,都风吹云散
展开
-
【设计模式】合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。通常类的复用分为继承复用和合成复用两种。继承复用虽然有简单和易实现的优点,但它也存在以下缺点:继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为白箱复用。子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。采用组合或聚原创 2022-01-04 22:09:48 · 728 阅读 · 0 评论 -
【设计模式】迪米特法则(Demeter Principle)
又称最少知道原则。指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。1 案例分析(明星、经纪人、粉丝、媒体公司)明星由于全身心投入艺术,所以许多日常事原创 2022-01-04 22:08:29 · 1048 阅读 · 0 评论 -
【设计模式】接口隔离原则(Interface Segregation Principle)
客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。1 案例分析(安全门)我们需要创建一个A品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。using System;namespace DesignPattern{ internal static class Program { public static void Main(string[] args) {原创 2022-01-04 22:07:10 · 235 阅读 · 0 评论 -
【设计模式】依赖倒转原则(Dependence Inversion Principle)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。1 案例分析(组装电脑)组装一台电脑,需要CPU,硬盘,内存条等配件。这些配件又各自具有多种品牌,例如,CPU有Intel与AMD,硬盘有择希捷与西数,内存条有金士顿与海盗船。using System;namespace DesignPattern{ internal static class Program原创 2022-01-04 22:05:25 · 137 阅读 · 0 评论 -
【设计模式】里氏代换原则(Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。如果通过重写父类的方法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。1 案例分析(正方形不是长方形)在数学领域里,正方形毫无疑问是长方形,它是一个长宽相等的长方形。我们开发的一个与几何图形相关的软件系统,就可以顺理成章的让正方形继承自长方形。原创 2022-01-04 22:03:07 · 319 阅读 · 0 评论 -
【设计模式】开闭原则(Open Close Principle)
开闭原则的含义是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。想要达到热插拔的效果,我们需要进行抽象(接口和抽象类)。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。1 案例分析(输入法皮肤)搜狗输入法的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换输入法的皮肤。这些皮肤有.原创 2022-01-04 22:00:51 · 619 阅读 · 0 评论 -
【设计模式】设计模式简介
设计模式(Design pattern)代表了最佳的实践,通常被面向对象的软件开发人员所采用。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。1. 设计模式分类根据参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译原创 2022-01-04 21:58:28 · 120 阅读 · 0 评论 -
【CSharp】简单的TCP/IP服务器
public class SimpleTcpServer { private int networkPort; private bool isWaitingListen = true; private bool isWaitingRecieve = true; private System.Net.Sockets.Socket listenSocket; public void NetworkStart(int net原创 2021-11-29 19:40:27 · 1985 阅读 · 0 评论 -
【CSharp】加密数据
机密数据应得到保护,从而使未授权的用户不能读取它们。这对于在网络中发送的数据或存储的数据都有效。可以用对称或不对称密钥来加密这些数据。通过对称密钥,可以使用同一个密钥进行加密和解密。与不对称的加密相比,加密和解密使用不同的密钥:公钥/私钥。如果使用一个公钥进行加密,就应使用对应的私钥进行解密,而不是使用公钥解密。同样,如果使用一个私钥加密,就应使用对应的公钥解密,而不是使用私钥解密。不可能从私钥中计算出公钥,也不可能从公钥中计算出私钥。公钥/私钥总是成对创建。公钥可以由任何人使用,它甚至可以放在Web站原创 2021-11-27 07:34:34 · 628 阅读 · 0 评论 -
【CSharp】延迟初始化(Lazy)
参考https://www.jb51.net/article/202143.htm1. 什么是延迟初始化延迟初始化是一种将对象的创建延迟到第一次需要用时的技术,换句话说,对象的初始化是发生在真正需要的时候才执行。通过使用延迟初始化技术,可以避免应用程序不必要的计算和内存消耗。2. 简单使用场景考虑下面两个类,Customer和Order,Customer类包含了一个Orders属性。一个人肯定会有很多的订单,也就意味着它可能包含了很多的数据,甚至还需要连接数据库去获取Orders记录。在这种场.原创 2021-11-24 22:00:28 · 1333 阅读 · 0 评论 -
【异步编程】三种模式
.NET 提供了执行异步操作的三种模式: 基于任务的异步模式 (Task-based Asynchronous Pattern, TAP) 该模式使用单一方法表示异步操作的开始和完成。TAP 是在 .NET Framework 4 中引入的。这是在 .NET 中进行异步编程的推荐方法。C# 中的 async和 await关键词为 TAP 添加了语言支持。 ...原创 2019-02-20 14:47:13 · 1162 阅读 · 0 评论 -
【异步编程】异步模型 (APM)
使用 IASyncResult设计模式的异步操作是通过名为BeginOperationName和EndOperationName的两个方法来实现的,这两个方法分别开始和结束异步操作 OperationName。在调用BeginOperationName后,应用程序可以继续在调用线程上执行,同时异步操作在另一个线程上执行。应用程序还应通过调用EndOperationName来获取...原创 2019-02-20 22:33:58 · 454 阅读 · 0 评论 -
【CSharp】二维数组转一维数组
1. 二维数组var two = new double[3,3];two[0,0] = 1;two[0,1] = 2;two[0,2] = 3;two[1,0] = 4;two[1,1] = 5;two[1,2] = 6;two[2,0] = 7;two[2,1] = 8;two[2,2] = 9;two.Dump();2. Array.Copyvar one = new double[9];// 数组需要有相同的维数Array.Copy(two, one, one.Len原创 2021-11-15 16:35:08 · 1836 阅读 · 0 评论 -
【CSharp】VS编译项目并将编译结果发送到远程电脑
1. 远程电脑需要打开共享文件夹假设远程电脑的IP为192.168.58.101,共享文件夹的名称为Shared2. VS 配置项目属性 >> Build Events >> Post-build event command line >> Edit Post-build event command line增加以下DOS命令# 断开所有远程连接,因为一次只能连接一个net use * /del /y# 连接远程电脑# IP原创 2021-11-10 17:33:54 · 707 阅读 · 0 评论 -
【CSharp】排序3X3的二维点坐标
1. 构建模拟点序列var list = new List<Tuple<int, int>>();list.Add(new Tuple<int, int>(1, 2));list.Add(new Tuple<int, int>(3, 2));list.Add(new Tuple<int, int>(1, 3));list.Add(new Tuple<int, int>(2, 2));list.Add(new Tuple<原创 2021-10-31 09:13:03 · 363 阅读 · 0 评论 -
【CSharp】序列化
C# 序列化1 序列化的格式与方式根据序列化的格式,序列化分为以下三种形式:二进制序列化指对象序列化之后是二进制形式的。通过 BinaryFormatter 类实现,这个类位于 System.Runtime.Serialization.Formatters.Binary 命名空间下。BinaryFormatter效率很高,能生成非常紧凑的字节流。所有成员,甚至只读成员都被执行序列化与反序列化XML序列化指对象序列化之后的结果是XML形式的。通过 XmlSerializer 类实现,原创 2021-04-06 22:16:02 · 872 阅读 · 0 评论 -
【CSharp】垃圾回收
NET Framework的垃圾回收机制非常复杂,但平时编程不需要了解它的全部细节。事实上,它设计得是如此周到,以至于根本不会妨碍到你。但是,如果对技术细节感兴趣,就继续阅读这个补充内容。对象内存从托管堆中分配,这是.NET运行时专门用来存储动态分配对象的区域。每次分配都在堆中划出一定空间 ,而堆内存可能耗尽,或者更有可能的是,一次分配找不到一个足够大的连续空间。如果内存分配失败,就会调用垃圾回收器检查是否存在没人引用的对象,以便回收其内存来 释放出一些堆内存。基本过程如下所示:找出所有仍然活动的原创 2020-12-24 16:40:45 · 279 阅读 · 1 评论 -
【CSharp + JSON】序列化与反序列化基类集合中的子类对象
1. 测试数据结构public interface IPerson{ string Name { get; set; }}public class Person : IPerson{ public string Name { get; set; } public Test Test { get; set; } = new Test();}public class Test{ public string AA { get; set; } = "AA"; public string原创 2020-09-12 08:43:03 · 2658 阅读 · 2 评论 -
【CSharp】反射获取集合的值
void Main(){ var tool = new BlobTool(); var type = tool.GetType(); var results = type.GetProperty("Results").GetValue(tool) as IEnumerable<object>; foreach (var element in results) { Debug.WriteLine(element); }}public class BlobTool.原创 2020-09-11 13:14:22 · 461 阅读 · 0 评论 -
【CSharp】字节数组与十六进制字符串互转
var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";// 字符串转字节数组var buffer = System.Text.Encoding.ASCII.GetBytes(str);// 字节数组转十六进制字符串var strHex = string.Join(" ", buffer.Select(item => $"{item:X2}"));// 十六进制字符串转字节数组var by.原创 2020-06-28 16:44:47 · 1583 阅读 · 1 评论 -
【LINQ】System.Linq.Enumerable.Aggregate
Aggregate是LINQ中可以自定义功能的聚合函数,该函数输入一个可枚举的序列,输出单个值。在微软的官方文档中给出了三个重载,分别如下:1. 对序列应用累加器函数1.1 函数原型public static TSource Aggregate<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, Func原创 2020-06-19 17:13:24 · 310 阅读 · 0 评论 -
【CSharp】删除指定目录下的指定文件
删除指定目录下的指定文件,并删除因文件删除后的空目录public void DeleteFileWithFileType(string directory, string fileType){ // 获取指定文件夹下的所有子文件夹 var allSubDirs = Directory.GetDirectories(directory, "*.*", SearchOption.AllDirectories).OrderByDescending(item => item.Length).ToL原创 2020-05-18 20:34:33 · 563 阅读 · 0 评论 -
【CSharp】【SplashScreen】启动窗体
https://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C使用方式:public FrmMain(){ InitializeComponent(); this.Opacity = 0.0;}private void FrmMain_Load(object sender, EventArgs e){ var task = Task.Run(() =.原创 2020-05-16 11:04:03 · 443 阅读 · 0 评论 -
【AutoUpdater.NET】从Web Server 或 Ftp Server 更新程序
目录1. 一般工作流程2. XML配置文件2.1 标签说明3. 使用方法4. 相关说明4.1 查看当前程序集的版本号4.2 通过FTP Server进行更新4.3 同步更新(默认异步)4.4 禁用跳过按钮4.5 禁用稍后提醒4.6 禁用先前设置的稍后提醒和跳过选项4.7 强制更新4.8 基本的身份认证4.9 用户代理4.10 错误报告4.11 关闭管理员权限4.12 查看更新而不下载4.13 稍后提醒4.14 代理服务器4.15原创 2020-05-16 10:33:47 · 4254 阅读 · 0 评论 -
【CSharp】线程同步
lock语句lock语句是设置锁定和解除锁定的一种简单方式。开启20个任务,每个任务对相同的初始值为0的字段各加一50000次,理论上的结果为20*50000 = 1000000。但是,多次运行该程序几乎得不到正确的结果。方法DoTheJob及其在IL语言中的代码如下:public void DoTheJob(){ for (int i = 0; i < 500...原创 2019-11-02 22:39:09 · 1140 阅读 · 0 评论 -
【CSharp】LINQ
LINQ查询var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };var namesWithJ = from n in names where n.StartsWith("J") orderby n select n;foreach (string name in na...原创 2019-10-24 16:25:07 · 910 阅读 · 0 评论 -
【CSharp】引用类型的相等性比较
关于引用类型的相等性比较,.NET中工提供了以下几种方式:static System.Object.ReferenceEquals() static System.Object.Equals() System.Object.Equals() 比较运算符(==)ReferenceEquals静态方法,比较两个引用是否指向类的同一个实例,特别是两个引用是否包含内存中的相同地址。可以比较...原创 2019-10-24 15:11:32 · 367 阅读 · 0 评论 -
【CSharp】枚举器
数组或集合实现带GetEumerator()方法的IEnumerable接口。GetEnumerator()方法返回一个实现IEumerator接口的枚举器。注意:GetEumerator()方法用IEnumerable接口定义。foreach语句并不真的需要在集合类中实现这个接口。有一个名为GetEumerator()的方法,它返回IEnumberator接口的对象就足够了。IE...原创 2019-10-24 14:50:45 · 614 阅读 · 0 评论 -
【CSharp】System.Array
用方括号声明数组是C#中使用Array类的表示法。在后台使用CE语法,会创建一个派生自抽象基类Array的新类。这样,就可以使用Array类为每个C#数组定义的方法和属性了。创建数组Array类是一个抽象类,所以不能使用构造方法类创建数组。但除了可以使用C#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组。如果实现不知道元素的类型,该静态方法就非常有用,因为...原创 2019-10-24 13:50:28 · 612 阅读 · 0 评论 -
【CSharp】用指针直接访问内存
1. 用unsafe关键字编写不安全的代码因为使用指针会带来相关的风险,所以C#只允许在特别标记的代码块中使用指针。标记代码所用的关键字时unsafe。// 标记方法unsafe int GetSomeNumber(){ }任何方法都可以标记为unsafe,无论该方法是否应用了其他修饰符。在这种方法中,unsafe修饰符还会应用到方法的参数上,允许把指针用作参数。还可以...原创 2019-10-23 17:15:55 · 1664 阅读 · 0 评论 -
【CSharp】访问修饰符
public 任何代码均可以访问该项protected 只有派生的类型能访问该项internal 只能在包含它的程序集中访问该项private 只能在它所属的类型中访问该项protected internal 只能在包含它的程序集和派生类型的任何代码中访...原创 2019-10-23 16:50:12 · 782 阅读 · 0 评论 -
【CSharp】程序集
.NET程序的库和可执行文件称为程序集。程序集时编译好的、面向.NET Framework的代码的逻辑单元。程序集是完全自描述性的,它是一个逻辑单元而不是物理单元,这意味着它可以存储在多个文件中(动态程序集存储在内存种,而不是存储在文件中)。如果一个程序集存储在多个文件中,其中就会由一个包含入口点的主文件,该文件描述了程序集中的其他文件。可执行代码和库代码使用相同的程序集结构。唯一的区别是...原创 2019-10-23 16:13:44 · 481 阅读 · 0 评论 -
【CSharp】静态构造函数
可以给类编写无参的静态构造函数。这种函数只执行一次,而一般的构造函数 ,只要创建类的对象,就会执行。编写静态构造函数的一个原因是,类有一些静态字段或属性,需要在第一次使用类之前,从外部源进行初始化。.NET运行库没有确保什么时候执行静态构造函数,所以不应把要求在某个特定时刻执行的代码放在静态构造函数中。也不能预计不同类的静态构造函数按照什么顺序执行。但是,可以确保静态构造函数至多执行一次,...原创 2019-10-23 10:11:09 · 619 阅读 · 1 评论 -
【CSharp】计算两个时间间隔的年月日时分秒
System.TimeSpan = System.DateTime - System.DateTime仅能够获取到时间的间隔,无法直接获取日期检测。为了能够直接获取需要的功能,需要使用VisualBasic中的DateAndTime类,因此要引用Microsoft.VisualBasic.dll程序集var years = DateAndTime.DateDiff("yyyy",...原创 2019-10-16 18:51:00 · 956 阅读 · 0 评论 -
获取电脑上已安装的DotNet版本,并判断是否满足程序需求
// 程序启动函数, 判断当前系统中的DotNet版本是否安装有DotNet3.5及其以上版本public void Main(){ var verMin = new System.Version(3, 5); foreach (var ver in InstalledDotNetVersions()) { if (ver >= verMin)...原创 2018-10-16 21:54:42 · 1225 阅读 · 0 评论 -
【CSharp】Winform自定义控件的启动时的事件顺序
1. ParentChanged2. VisibleChanged3. BindingContextChanged4. Load5. Layout6. Paint7. ChangeUICues原创 2018-09-06 11:05:21 · 954 阅读 · 0 评论 -
【CSharp】只运行一个应用程序实例
Programe.csstatic class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [System.STAThread] static void Main() { S...原创 2018-09-05 23:31:18 · 530 阅读 · 0 评论 -
【CSharp】Winform 普通控件的双向绑定
文中实现: string <====> TextBox.Text decimal <====> NumericUpDown.Value bool <====> CheckBox.Checked界面如下:...原创 2018-09-05 23:05:42 · 8813 阅读 · 1 评论 -
C# 窗体程序后台线程操作窗体控件
源码如下:// For Method Two public delegate void SetTextCallback(string text); public partial class MainForm : Form { // For Method One System.Threading.SynchronizationCon...原创 2017-11-01 10:03:57 · 2044 阅读 · 0 评论 -
C# 析构函数与IDisposable接口
利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾回收的工作方式,它会给运行库增加不可接受的系统开销 IDisposable接口提供了一种机制,该机制允许类的用户控制释放资源的时间,但需要保证调用Dispose()方法建议:如果实现了析构函数,那么就应该实现IDisposable接口。假定大多数程序员都能正确调用Dispose()方法,同时把实现析构函数作为一种安全机...原创 2019-01-08 09:13:29 · 1190 阅读 · 0 评论