C#
文章平均质量分 76
_学而时习之_
这个作者很懒,什么都没留下…
展开
-
自定义半整型的数值类型
我们常用的数值类型有int、uint、short、long、float、double,假定有某种特殊的需要,需要一种仅可以赋值为整数或0.5倍数的数值类型,这时常用的数值类型就用不了了。这时我们可以自定义一种新的数值类型来适应这种需求,比如我们将其命名为“半整型”。半整型,HalfInt,要实现这样的数值类型,则需要实现相应的加法、减法、乘法、除法、赋值、等于、不等于,这样在书写的时候才会方便。比如说HalfInt a=10,a+=3;a-=2;a*=4a/=4;if(a==10){原创 2020-07-20 09:57:48 · 648 阅读 · 0 评论 -
C# 数据集 DataRow.RowState 属性深入分析
1. RowState 介绍RowState 是 DataRow 很重要的一个属性, 表示 DataRow 当前的状态. RowState 有 Added, Modified, Unchanged, Deleted, Detached 几种, 分别表示 DataRow 被添加, 修改, 无变化, 删除, 从表中脱离. 在调用一些方法或者进行某些操作之后, 这些状态可以相互转化.转载 2013-05-27 11:38:23 · 4239 阅读 · 0 评论 -
C#技巧之快速删除bin和obj文件夹
C#程序总会生成bin和obj文件夹,为了减小源码的大小,就有必要将这两个文件夹删除,于是想到用批处理文件来删除。以下是批处理的代码:@echo offset nowPath=%cd%cd \cd %nowPath%::delete specify file(*.pdb,*.vshost.*)for /r %nowPath% %%i in (*.pdb,*.vsho原创 2013-06-06 09:13:41 · 3183 阅读 · 0 评论 -
C#由于出现被放弃的mutex,等待过程结束
今天使用互斥对象Mutex操作线程时,碰到一个奇怪的问题:由于出现被放弃的mutex,等待过程结束。找了很多资料后,总算解决了,原来是mutex.WaitOne()和mutex.ReleaseMutex()不一致造成的。所以使用Mutex操作线程时,一定要确保mutex.WaitOne()和mutex.ReleaseMutex()的次数一样。尤其是,当线程中使用invoke操作界面时,原创 2013-06-17 12:01:26 · 10154 阅读 · 0 评论 -
C#速学
第一章 1、.NET是平台,C#是.NET上的一门语言。2、C#的异常处理机制:try catch finally Try 引发异常 catch捕获异常 finally 释放资源3、catch finally(错误)问题:.NET Framework由什么组成?答:有公共语言运行时(CLR)和.NET F转载 2013-06-24 08:25:03 · 1730 阅读 · 1 评论 -
win7 IIS7 发布网站 出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误
windows7下发布web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”原因:vs2010默认的是4.0框架,4.0的框架是独立的CLR,和2.0的不同,如果想运行4.0的网站,需要用转载 2013-07-18 09:16:16 · 1444 阅读 · 0 评论 -
C#利用lambda实现委托事件的挂接
在写一个小程序的时候,碰到了这样的问题,需要用委托来挂接事件,但是又想在这事件中使用局部的变量,而委托一旦定义好后,挂接方就没有办法再添加额外的形参了。那有没有什么 办法,可以实现呢?委托定义如下:public class SocketSp{ public delegate void ReceiveCompleted(byte[] receiveBuffer, int receiveT原创 2013-07-19 08:39:14 · 2544 阅读 · 0 评论 -
C#根据域名查询IP(CMD命令参数输入或者启动程序后再输入查询)
有时因为需要,希望知道域名的IP,那用C#怎么实现呢?以下是实现代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;namespace IPSearch{ class Program { static原创 2013-07-19 14:27:49 · 1601 阅读 · 0 评论 -
C#基于SMTP协议和SOCKET通信,实现邮件内容和附件的发送,并可隐藏收件人
C#基于SMTP协议和SOCKET通信,实现邮件内容和附件的发送,并可隐藏收件人。同时解决了邮件主题和内容为中文时的乱码问题。支持多收件人的邮件发送。原创 2013-07-23 18:36:28 · 2726 阅读 · 0 评论 -
提高开发效率的Visual Studio 2010使用技巧
相信做开发的没有不重视效率的。开发C#,VB的都知道,我们很依赖VS,或者说,我们很感谢VS。能够对一个IDE产生依赖,说明这个IDE确实有它的独特之处。无容置疑,VS是一个非常强大的IDE,它支持多语言编辑。支持C#,VB,C/C++,HTML......它拥有强大的调试编译功能。它让我们不用去记住那些安装,环境变量设置,服务器设置,编译的繁琐过程。高度集成化。凡事有利有弊,在敏捷开发盛行的时代转载 2013-07-30 18:01:51 · 2364 阅读 · 2 评论 -
C#基于SOCKET通信开发的Telnet模拟工具
最近在折腾网络方面的通讯协议,每次熟悉协议的时候,总是习惯用telnet来测试,但是在测试的过程中,很纠结的是,有的地方输入不能出错,一出错就得重新输入,而且还不能像CMD命令一样,可以通过方向键回到之前的输入。在痛苦了多次后,决定做一个类似Telnet功能的模拟工具,更确切的说是基于SOCKET的网络通信工具,以便更好的进行SMTP/POP3/IMAP的测试。实现在的关键代码如下原创 2013-07-25 17:10:34 · 4053 阅读 · 0 评论 -
C# 类中继承接口的属性
在开发中面对接口编程,有时需要将属性放到接口中,但是在类中又要如何去继承接口的属性呢?开始的时候,我以为只要继承了接口,就可以将属性拿来用了。代码如下:public interface IA{ int count{get;set;} void test();}public class A:IA{ public void test原创 2013-08-02 15:50:59 · 8783 阅读 · 2 评论 -
C#HTTP代理的实现之注册表实现
HTTP代理的实现形式,可以通过修改注册表项,然后启动浏览器来实现,也可以通过SOCKET通信,构造HTTP头实现。下面是关于注册表实现的方式。注册表实现,只需要修改几个关键的注册表项就可以了。第一项:启用代理的注册表项。第二项:代理的IP和端口。第三项:连接的方式。第四项:让注册表项立即生效。严格来说,这一步并没有修改注册表项,而是调用原创 2013-07-29 09:43:18 · 1645 阅读 · 0 评论 -
C#利用NPOI在同一个Excel文件中创建多个sheet
借用NPOI来实现,要在同一Excel文件中创建多个sheet,只需要在同一个workbook中创建多个sheet即可。要注意的是,sheet的名字一定不能重复。下面是实现的代码: private void buttonTest_Click(object sender, EventArgs e) { HSSFWorkbook workBook = new原创 2013-08-06 13:30:29 · 7241 阅读 · 0 评论 -
lambda妙用集锦
前言在使用 Lambda 表达式时,我们常会碰到一些典型的应用场景,而从常用场景中抽取出来的应用方式可以描述为应用模式。这些模式可能不全是新的模式,有的参考自 JavaScript 的设计模式,但至少我看到了一些人为它们打上了名字标签。无论名字的好与坏,我还是决定给这些模式进行命名,至少这些名字很具有描述性。同时我也会给出这些模式的可用性、强大的部分和危险的部分。提前先说明:绝大多数模式是转载 2013-08-06 10:31:58 · 1865 阅读 · 0 评论 -
C#利用lambda在函数中创建内部函数
有使用过JS的朋友,相信都知道function。JS中的function是可以在里面在定义一个作为内部使用的。有时为了控制作用域,或者这种小函数只在这个函数体内会使用,所以就不希望在外部在作额外的定义。那C#中有没有这样类似的方式呢?答案是有的。在C#中要实现,需要用到的是委托和lambda表达式。对于lambda表达式,是可以实现匿名函数定义和挂接委托事件的。具体的可参见该文C#利用原创 2013-08-08 08:55:31 · 5017 阅读 · 1 评论 -
C#利用lambda表达式将函数作为参数或属性跨类传递
在编码时,由于开始是在winform下进行简单的测试开发的,后来代码多了,就想分到不同的类里边去,可是因为原来的测试是在同一个form下的,所以对于函数调用可以很方便,而一旦跨类之后,就会发现,这函数的耦合度太高,以至于不知道该怎么样解耦到类里边去。这时,不妨使用委托类型的Func和Action来实现。下面是最开始测试时在winform里写的简单代码using System;using原创 2013-08-09 09:44:43 · 10566 阅读 · 0 评论 -
VS2012利用Wix打包问题
在用VS2012打包的时候,忽然发现没有像VS2010一样可以本地打包的项目模板,于是找了N多资料后,发现现在微软在推荐用WIX打包。在折腾WIX打包生成界面的时候,遇到了一个很纠结的问题。Unresolved reference to symbol 'WixUI:WixUI_InstallDir' in section 'Product:{9E327731-0EAC-4A02...原创 2013-08-14 12:07:05 · 2770 阅读 · 0 评论 -
C#利用Lambda和Expression实现数据的动态绑定
在程序开发过程中,有时为了让数据能够实时更新,我们会采用数据绑定来实现。一般我们数据绑定时我们是这样写的public class Helper : INotifyPropertyChanged { #region statusInfo Property private string statusInfo_ = "";原创 2013-08-29 08:15:06 · 3887 阅读 · 0 评论 -
重构的10个小技巧
重构的手法有很多种,相对而言,一篇文章的涵盖量自然是无法提到所有,LZ这里也只能提出一些平时会经常使用的一些手法,像一些比较高端的手法,各位有兴趣的可以去找一些专门的书籍涉猎。 另外还有一点,由于LZ是做JAVA开发的,因此部分重构小技巧可能与JAVA语言,或者说与面向对象的语言息息相关,不过大多数技巧,无论是面向过程的语言,还是面向对象的语言,都是可以相互通用的。转载 2013-09-10 08:10:18 · 1515 阅读 · 1 评论 -
C#中双问号、双冒号等几个特殊关键字
1、@这个东东看似和邮件有关啊,但是在C#的世界里,可跟邮件没有一毛钱关系,它是string的女朋友(当然了string有N多女友),二者结合就可以发挥作用了。你可以给它起个名字,叫做“逐字字符串”,或者别的什么东东都行,这都不重要,关键你要会泡它~在处理字符串时,那些个字符串转义字符我们可伤不起,一个个的记又记不住,用了还要查,麻烦的不行,那@就是为解决这个而诞生的,直接让字符串转载 2013-09-12 08:14:29 · 11122 阅读 · 2 评论 -
C#调用C++DLL传递结构体数组的终极解决方案
在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了。但是当传递的是结构体、结构体数组或者结构体指针的时候,就会发现C#上没有类型可以对应。这时怎么办,第一反应是C#也定义结构体,然后当成参数传弟。然而,当我们定义完一个结构体后想传递参数进去时,会抛异常,或者是传入了结构体,但是返回值却不是我们想要的,经过调试跟踪后发现,那些值原创 2013-09-17 18:40:56 · 47464 阅读 · 18 评论 -
结构体的字节对齐(跨语言传参时尤为重要)
在项目开发时,结构体作为一个数据结构,非常适合用语存储某一设备或某一类事务的信息,自然的,将其用作参数也是必然的事。然而在将结构体作为参数生成DLL后,用其他语言调用时,则会有一些问题。比如在用C#调用C++的DLL时,结构体的大小就会有不一样,导到调用出问题。基于以前的BCB开发的产品,需要增加一些接口以实现新的功能,于是将相应的信息封装到了结构体中,然后传出。但是当我用C#调用时,发现怎么原创 2013-09-18 16:00:46 · 3350 阅读 · 1 评论 -
数据实际空间与占用空间
在windows中,我们建立一个文件时,不论文件有多小,哪怕是1个字节,都至少会占用4kb的空间。见下图那为什么会这样呢?windows操作系统对磁盘采用分页管理方式,最小分页大小为4kb,也就是如果你的硬盘假设有100GB,那么,你的分页的个数是:(100×1000×1000)/4 个,当然了,你放入一个字符,只有1个字节的,但是他要分配到一个空间,而这个空间利用一个页大小就可以装得原创 2013-09-19 08:12:35 · 2300 阅读 · 0 评论 -
C#基于MySql驱动(VS2012)操作MariaDB
MariaDB最近越来越热,于是也下了个来捣腾捣腾。我下的是mariadb-10.0.4-win32.msi,但是安装完后,想用C#进行连接时,发现没有可以用的驱动。网上找了一番后,说是MaraiDB兼容MySQL,所以可以用MySql的驱动来连接。不过,有文提到MariaDB5.5相当于MySql的5.5,而MariaDB10.0.4相当于MySql5.6,而MySql现在已经是6.7了,所以下原创 2013-09-22 16:47:41 · 8072 阅读 · 0 评论 -
生成1亿个不重复的8位随机整数
项目中有一部分需要用到8位不重复的随机整数,即有1到99999999种可能,即1亿个可能。这可是一个不小的数据量。那要怎么去实现呢?1、尝试使用Access在看到这个需求时,第一反应就是使用数据库。但是客户又要求不能使用SQL等数据库,于是又换了个思路,既然不能使用SQL,那使用Access来替换不就可以了吗?于是想着在程序中产生随机数,并将其与数据库中已经使用的随原创 2013-10-12 15:46:46 · 13958 阅读 · 0 评论 -
颠覆你对方法调用的看法
注意:如果你是一个初学者,对实例方法,虚方法的调用还不太清楚,强烈建议你不要阅读本文,因为这里面的代码会让你完全崩溃掉。 如果你对实例方法,虚方法的运行机制已经了如指掌,并且,对方法和对象的内存布局也心中有数,那么本文可能会颠覆你以前对他们的认识。 阅读本文的最佳方式就是亲自演练一下,如果看完之后有疑惑,那么是正常的,但是稍加思考就会想明白。转载 2013-10-16 08:27:35 · 1200 阅读 · 0 评论 -
项目中计数不同步和日志记录引发的BUG
项目开发前期早就完成了,但投入实际使用时出现了些很小却很头痛的问题。其中最值得注意又最容易忽略的两点,这里作一下记录。第一:计数不同步在项目投入使用后,发现数据总是会不同步,查遍了代码,从理论上,都不可能发生,但是实际上却又发生了。后来想起了以前看到过的文章,有提到多线程内操作同一个变量进行加减时,变量可能会不一致。按照这个思路,去查了一下日志记录,果然发现计数有莫名跳动的情况。比如数字本原创 2013-10-24 09:14:01 · 1383 阅读 · 0 评论 -
C# 64位系统调用32位DLL异常解决办法(异常来自HRESULT :0x8007007E)
解决办法如下1、在IDE中将目标平台设置成x86(VS是在项目的属性->生成->目标平台)2、如果DLL中调用了其他的DLL,需要将其他的DLL一同编译3、有时DLL生成时会依赖于IDE,比如BCB下生成的DLL就会依赖于rtl60.bpl、vcl60.bpl、borlndmm.dll、cc3260mt.dl等几个DLL,必须要将这DLL放到一起编译4、如果无法确定到底有哪些依赖项原创 2013-10-31 17:58:40 · 9974 阅读 · 1 评论 -
64位引用32位导致“未能加载文件或程序集或它的某一个依赖项”的异常
今天在合并项目时,出现了总是提示“未能加载文件或程序集或它的某一个依赖项”的异常,反复检查了几遍所引用的程序集,并没有哪个依赖项没有加载,而且看生成的文件,程序集也已经生成了,但是一调用的时候就异常。网上搜了很多资料,基本上都说是引用的问题,可是试了之后根本解决不了问题。后来,忽然想到,所引用的项目中引用了一个32位下的C++的DLL,为了兼容这个DLL,项目使用了32位的目标平台进行原创 2013-11-04 11:43:37 · 2570 阅读 · 0 评论 -
dynamic和匿名对象
有时需要使用匿名对象存储数据,而有时需要使用dynamic去提取数据,这里写了一个简单的示例,代码如下static void Main(string[] args) { List datas = new List(); for (int index = 0; index < 1000; index++) {原创 2013-11-18 17:57:42 · 2511 阅读 · 0 评论 -
.NET4.0的并行调试窗(Parallel Tasks)如何调出
.NET4.0增加了并行处理功能,在进行并行调试时,需要调出并行调试窗进行跟踪查看,可是按照>一书中说的Debug-Windows->Parallel Tasks,根本没有找到并行调试窗,如下图。这是为什么呢?看着>一书中明明是可以调用的,思考了一会儿之后,想着会不会是要在运行中调出的。于是设了两个断点,然后在运行中按Debug->Windows->Parallel Tasks,得到了原创 2013-11-20 10:35:31 · 2139 阅读 · 0 评论 -
并行化时要注意的线程安全与任务安全
在串行编程时,操作都是按顺序执行的,比如数字从1到100000递增,就必然的是1、2、3、4……100000。代码如下for (int i = 1; i <= 100000; i++) { Console.WriteLine(i); }然而,在并行化编程时,因为是并行运行的,所以执行顺序会与系原创 2013-11-22 15:20:57 · 2236 阅读 · 0 评论 -
超线程将物理内核提升至更多的逻辑内核
现在电脑大多数是多核的,比如我的电脑是宏基的,下面是驱动精灵硬件检测的结果。我们可以看到,硬件概要中显示CPU是双核的,现在我们再看看CPU(处理器)的具体信息。同样是使用驱动精灵检测结果。这时我们会看到,核心/线程部分显示的是双核、四线程。那么这里的四线程又是什么意思呢?我们再看看任务管理器中性能选项的情况,见下图我们看到在CPU使用记录一项,显示出了四个块,原创 2013-11-23 09:13:06 · 4207 阅读 · 0 评论 -
Environment.CurrentDirectory引起的BUG
今天在运行一个项目时,提示“配置文件不存在”,经查是源于一个配置文件的路径不正确。可是程序在本地运行OK的,为什么在客户电脑上运行就不OK了?想来想去只能是Environment.CurrentDirectory这个取路径的方式不对,然后换成了Application.StartupPath程序正常了。解决完问题后,回过头来思考,本地运行和客户电脑上运行唯一的差别就是系统上,本地是WIN7原创 2013-11-12 18:17:52 · 3188 阅读 · 1 评论 -
VS2012并发可视化工具启动异常(当前正在进行ETW收集)
在调出VS2012的并发可视化时,弹出异常"Concurrentcy Visualizer无法启动,因为当前正在进行ETW收集",如下图后来查找资料,查了很久,终于在《收集 Windows 事件跟踪 (ETW) 数据》一文中找到线索。按照文中的说法,需要在性能管理器中右击性能会话,然后点开属性进行相应的设置,可是并发可视化工具在开启进直接异常了,这又怎么会有会话呢?既然直路走不通,原创 2013-11-26 16:26:28 · 3366 阅读 · 0 评论 -
用线程安全随机数解决Random在多线程中随机性重复的问题
在.NET中,随机数一般是用Random来获取,但是当在多任务的并行化编程时,问题就出现了。因为Random是基于时间作为种子来生成伪随机数的,而如果程序在多核并行时,在同一时间内的多个核中取到的时间是一样的,这样一来,生成的伪随机数就有可能会有一样的。如果业务需求中需要不可重复的随机数,那么这后果将会相当严重,所以必须采取一种新的方式来获取线程安全的伪随机数。下面是摘自《.NET Paralle原创 2013-11-27 10:36:54 · 10638 阅读 · 0 评论 -
SpinWait的性能高于Thread.Sleep
在进行多线程开发时,我们经常会用到Thread.Sleep(timeout_ms)来等待或者腾出时间来让其他线程处理。不过,即使我们把timeout_ms设置为0,Thread.Sleep还是会执行等待操作。这就让人很纳闷了,我明明指定的等待时间是0毫秒,为什么还会执行等待呢?这时因为当我们调用Thread.Sleep时,是让内核暂停处理当前的线程,然后再看需要等待多久,当发现等待时间是tim原创 2013-11-27 13:03:50 · 25920 阅读 · 6 评论 -
VS中使用define和undef实现条件编译(csc.exe条件编译)
在C和C++中常有用到宏定义#define,在C#中也这个关键字,不过功能不同了,C#中是作为条件编译的条件。#define XXX 是定义XXX为条件编译的条件,相当于将XXX设为true。#undef XXX是取消XXX的条件编译条件,相当于将XXX设为false。#define和#undef必须在using之前进行定义,不然编译不通过。#define和#undef需要结合#if/原创 2013-12-09 15:01:09 · 3506 阅读 · 0 评论 -
用TaskScheduler代替invoke和begininvoke异步更新那界面数据
在异步编程时,为了更新界面的数据,经常会用invoke和begininvoke来操作。而这两个方法又必须是基于控件的,所以为了能够调用还必须传一个控件进去。而在基于任务编程时,可以使用TaskScheduler来直接更新数据。下面是代码using System;using System.Collections.Generic;using System.ComponentModel;usi原创 2013-11-26 10:25:44 · 1953 阅读 · 0 评论