Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts


C++中的成员指针

C++的有些知识点可能不在《C++ Primer,5th》或者《The C++Programming Language,4th》里,作为一个看这两本书的初学者,这有些难办。C++的有些知识藏在犄角旮旯里,但时不时就能碰到,今天就谈谈遇到的成员指针。跟C#或者Java中成员变量或者函数必须定义在类里面不同,C++中的成员变量或者函数既可以写在类的外面,也可以写在类的里面,这或许是为了兼容C的缘故。针对指向的是否是成员变量或成员函数,C++中必须要进行区分,这或许就是成员指针的由来,本文简单介绍C++成员指针中的成员变量指针和成员函数指针。 …

Pointers to data members Pointers to member functions

C++中的虚函数表以及动态分发

在C++中,如果一个类有虚函数,那么该类的对象在实例化后,会多一个指向虚函数表(virtual table, vtbl)的指针(vitrual table pointer, vptr)。虚函数表及虚函数调用是C++实现多态或者说动态分发(dynamic dispatch)的基础。本文首先介绍一下C++中的对象的虚函数指针以及类的虚函数表的结构,然后介绍了通过使用虚函数表实现动态分发的原理,最后讨论了虚函数调用的性能。 …

static dispatch dynamic dispatch early binding virtual table

使用Windows Subsystem for Linux安装Ubuntu以及配置C++开发环境

随着Windows开始拥抱Linux,在Windows 10以及之后的操作系统里内置了Windows Subsystem For Linux(WSL)模块,可以很方便的在Windows上使用和体验Linux,并且资源开销相对于虚拟机来说要小的多,相当于在Windows上安装了一个名为Ubuntu的应用,并且可以在Windows上直接访问和查看Linux下面的文件系统。我初步体验下来还是非常友好和方便的,Linux操作起来在有些情况下就是比Windows下面更加直接和高效。本文记录一下在Windows 11上启用WSL,安装Ubuntu,以及Ubuntu里面搭建C++的基本开发环境的步骤,算是一个笔记,后面在熟悉Linux操作系统以及学习C++的时候,直接就可以使用WSL里面的Ubunut环境。 …

Ubuntu C++ WSL

一些有关Excel的小技巧

在日常工作中的有些需求,比如数据分析和预处理,通过其它工具比如Excel点点鼠标也能解决,而且可能比写代码还快。Excel有很多强大的功能,这里只简单介绍一下我在Excel里面用到的一些小功能。这些功能包括,分列,函数,高级复制粘贴,以及数据透视表 …

Pivot Table

DataGridView绑定到DataTable和BindingList的分析与比较

本文介绍了使用DataGridView绑定数据的两种方法,一种是直接将其DataSource属性绑定到DataTable的DefaultView,绑定后它默认支持排序,筛选等高级功能,另外当DataTable值发生变化时DataGridView也会自动刷新,它的缺点是DataTable结构过于重,而且对于单元格赋相同的值时,仍然会触发事件导致界面刷新,这在有些场景下会影响效率。另外一种方法是DataGridView绑定BindingList实体,它的有点是能够进行更多的精细控制,并且效率会更高,缺点是内置的BindingList对象并没有实现排序,筛选等功能。针对BindingList的缺点,本文介绍了BindingListView这个第三方的库,它完美解决了BindingList默认不支持排序和筛选,且要实现筛选筛选功能单一的问题。 …

DataTable DataGridView BindingList BindingListView DataBinding

将条件字符串解析为lambda表达式

将条件字符串动态解析并转换为lambda表达式在很多场景下非常有用,它一方面便于实现逻辑和配置的分离,另一方面也提供了更大的灵活性。在很多场景我们都能看到这种将条件表达式字符串保存起来,然后动态解析执行的列子,比如股票软件里面的公式编辑器、比如规则引擎RulesEngine。通常,要手动实现将条件表达式字符串解析为lambda表达式是困难的,因为这会用到一些编译器里面类似的诸如语法分词,词法分析的内容。 虽然在C#中,可以运用之前介绍的表达式树ExpressionTree来一定程序上简化这些操作,但要手动解析,仍然十分繁琐。本文站在巨人的肩膀上介绍两种,一种是System.Linq.Dynamic.Core,一种是使用Roslyn的Microsoft.CodeAnalysis.Scripting。 …

RulesEngine Roslyn lambda ExpressionTree CodeAnalysis Dynamic LINQ

一种实时监控日志文件变更并读取变更内容的方法

本文介绍了一种监控日志文件变化,并读取变动内容的方法。通过使用FileSystemWatcher类,可以监控文件变化,并通过回调事件触发通知。为了避免文件频繁变动导致频繁的文件读写,这里使用了一个定时器来定时读取。当文件距离上一次读取发生变化时就读取。在读取文件的时候,由于涉及到多进程读写同一个文件,所以这里创建了FileStream并通过指定FileShare参数,而不是直接创建StreamReader来解决了读写冲突导致日志文件丢失的问题。在解决这一问题的过程中,还分析了long4net源码中RollingFileAppender写入文件时的FileShare参数以及StreamReader源码中,如果直接指定path时FileStream的参数。 …

RollingFileAppender log4net FileShare FileSystemWatcher

在C#应用程序中根据不同的编译环境动态生成相应的配置文件

在开发应用程序的时候,会有不同的解决方案配置,在ASP.NET Core时代,针对不同环境的不同配置,Visual Studio原生提供了很好的支持,但对于Winform来说,要实现多环境不同配置则需要花一些功夫。本文首先演示了ASP.NET Core里面如何针对不同的环境配置不同的配置文件,紧接着介绍了在Winform中使用Visual Studio编译后任务的功能,通过手动修改项目文件来实现了不同的编译环境的不同配置,最后针对Visual Studio编译后任务实现不同环境不同配置文件的两个缺点,介绍了使用SlowCheetah第三方插件,结合SlowCheetah的Visual Studio的插件来实现这一功能,简单方便依赖少。希望本文对您了解这一功能有所帮助。 …

SlowCheetah UAT STAGING CONFIGURATION WINFORM

Windows消息系统

窗体和消息系统是两个紧密联系的概念,本文介绍了Window的消息系统以及消息循环。在此基础上演示了如何使用Window窗体来进行消息通讯。 …

windows message message queues

告别暴力终止线程

有时候需要让一个线程终止运行,.NET Framework的Thread类中提供了Abort方法,调用某个线程实例对象的Abort方法,可以让该线程类抛出一个ThreadAbortException从而终止该线程的运行。但使用Abort方法终止一个线程对象显得比较暴力,而且可能会有很多潜在的问题,尤其是一个线程调用另外一个线程的Thread.Abort方法终止时。好消息是从.NET 5.0开始Thread.Abort方法就已经被弃用,如果调用就会抛出“PlatformNotSupportedException”,本文主要介绍简单粗暴杀手线程的可能危害,以及如何优雅地退出线程的方法。 …

Thread.Abort cooperative cancellation model CancellationTokenSource