
C#语言
掌控自身命运
二十多年的企业管理软件开发经历,熟知管理软件的整个开发流程,熟练掌握VFP语言,掌握VB语言,了解JAVA、asp.net、CSS、HTML/HTML5等语言,使用C#语言开发企业管理软件七年以上,熟练掌握SQL server2000/2005/2008数据库的开发。负责企业新员工编程技术的培训工作。喜欢学习和了解新知识,喜欢解决编程中有挑战性的问题。
展开
-
C#语言中的Using语句块确保资源被释放
在开发C#的过程中,.NET在对象不再引用之后,清理它们的方法是使用非析构方式。 在C++中,对象只要使用完毕,就会自动调用其析构函数。这对于基于资源的类的设计人员是非常好的消息,因为如果用户忘记关闭资源,则最好使用析构函数。只要对象使用完毕,就会调用C++析构函数。所以,例如,如果出现了异常,但没有捕获,有析构函数的对象就会调用它们的析构函数。 在C#和其它托管语言中,没有自原创 2017-10-10 11:46:03 · 2112 阅读 · 0 评论 -
C#托管和非托管的资源(一)——资源
资源是一个被反复使用的术语。术语“资源”的一个用法是本地化。在本地化中,资源用于翻译文本和图像。基于用户的区域,加载正确的资源。这里,资源用于另一个主题:使用托管和非托管的资源——存储在托管或本机堆中的对象。尽管垃圾收集器释放存储在托管堆中的托管对象,但不释放本机堆中的对象。必须由开发人员自己释放它们。使用托管环境时,很容易被误导,注意不到内存管理,因为垃圾收集器(GC)会处理它。很多工作都由GC原创 2017-11-20 09:41:44 · 1494 阅读 · 0 评论 -
C#(KeyChar)键值对照表
KeyCode最为常用,记录了键盘上按了哪个键,当使用组合键时如ctrl+a,其值是"A";KeyData可以记录组合键,当使用组合键时如ctrl+a时,其值为"A,ctrl";KeyValue则是KeyCode的数字值,当使用组合键时如ctrl+a时,其值为65(A),注意不是97(a); 虚拟键值表虚拟键十六进制值十进原创 2017-11-15 11:58:04 · 41337 阅读 · 3 评论 -
C#托管和非托管的资源(二)——后台内存管理
C#编程的一个优点是程序员不需要担心具体的内存管理,垃圾回收器会自动处理所有的内存清理工作。用户可以得到像C++语言那样的效率,而不需要考虑像在C++中那样内存管理工作的复杂性。虽然不必手动管理内存,但仍需要理解后台发生的事情。理解程序在后台如何管理内存有助于提高应用程序的速度和性能。以下要介绍给变量分配内存时在计算机的内存中发生的情况。1、值数据类型Windows使用一个虚拟寻址系统,该原创 2017-11-20 11:28:53 · 1319 阅读 · 0 评论 -
C#托管和非托管的资源(三)——强引用和弱引用
垃圾回收器不能回收仍在引用的对象的内存——这是一个强引用。它可以回收不在根表中直接或间接引用的托管内存。然而,有时可能会忘记释放引用。 注意:如果对象相互引用,但没有在根表中引用,例如,对象A引用B,B引用C,C引用A,则GC可以销毁所有这些对象。 在应用程序代码内实例化一个类或结构时,只要有代码引用它,就会形成强引用。例如,如果有一个类MyClass,并创建了一个变量原创 2017-11-20 15:32:13 · 1363 阅读 · 1 评论 -
C#托管和非托管的资源(四)——处理非托管资源
垃圾回收器的出现意味着,通常不需要担心不再需要的对象,只要让这些对象的所有引用都超出作用域,并允许垃圾回收器在需要时释放内存即可。但是,垃圾回收器不知道如何释放非托管的资源(例如,文件句柄、网络连接和数据库连接)。托管类在封装对非托管资源的直接或间接引用时,需要制定专门的规则,确保非托管的资源在回收类的一个实例时释放。 在定义一个类时,可以使用两种机制来自动释放非托管的资源。这些原创 2017-11-20 16:21:13 · 2292 阅读 · 0 评论 -
C#托管和非托管的资源(五)——不安全的代码
如前所述,C#非常擅长于对开发人员隐藏大部分基本内存管理,因为它使用了垃圾回收器和引用。但是,有时需要直接访问内存。例如,由于性能问题,要在外部(非.NET环境)的DLL中访问一个函数,该函数需要把一个指针当作参数来传递(许多Windows API函数就是这样)。本节将论述C#直接访问内存的内容的功能。一、用指针直接访问内存下面把指针当作一个新论题来介绍,而实际上,指针并不是新东西。因为在原创 2017-11-21 10:42:48 · 1199 阅读 · 0 评论 -
C#托管和非托管的资源(六)——平台调用
并不是Windows API调用的所有特性都可用于.NET Framework。旧的Windows API调用是这样,Windows10或Windows Server2016中的新功能也是这样。也许开发人员会编写一些DLL,导出非托管的方法,在C#中使用它们。要重用一个非托管库,其中不包含COM对象,只包含导出的功能,就可以使用平台调用(P/Invoke)。有了P/Invoke,CLR会加原创 2017-11-21 11:35:09 · 1128 阅读 · 0 评论 -
C#泛型(一)——泛型概述
泛型是C#和.NET的一个重要概念。泛型不仅是C#编程语言的一部分,而且与程序集中的IL(IntermediateLanguage,中间语言)代码紧密地集成。有了泛型,就可以创建独立于被包含类型的类和方法。我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可。另一个减少代码的选项是使用Object类,但使用派生自Object类的类型进行传递不是类型安全的。泛型类使用泛型类型,原创 2017-11-21 12:21:34 · 526 阅读 · 0 评论 -
C#泛型(二)——创建泛型类
首先介绍一个一般的、非泛型的简化链表类,它可以包含任意类型的对象,以后再把这个类转化为泛型类。在链表中,一个元素引用下一个元素。所以必须创建一个类,它将对象封装在链表中,并引用下一个对象。类LinkedListNode包含一个属性Value,该属性用构造函数初始化。另外,LinkedListNode类包含对链表中下一个元素和上一个元素的引用,这些元素都可以从属性中访问。public c原创 2017-11-21 17:49:07 · 1929 阅读 · 0 评论 -
C#类和对象(六)——可空类型
引用类型(类)的变量可以为空,而值类型(结构)的变量不能。在一些情况下,这可能是一个问题,如把C#类型映射到数据库或XML类型。数据库或XML数量可以为空,而int或double不能为空。 处理这个冲突的一个方法是使用映射到数据库数字类型的类(这由Java实现)。使用引用类型,映射到允许空值的数据库数字,有一个重要的缺点:它带来了额外的开销。对于引用类型,需要垃圾收集器进行清理。值类型不原创 2017-11-16 17:04:01 · 529 阅读 · 0 评论 -
C#MaskedTextBox掩码元素说明
掩码元素说明0数字,必选。此元素将接受 0 到 9 之间的任何一个数字。9数字或空间,可选。#数字或空间,可选。如果掩码中该位置为空白,在Text属性中将把它呈现为一个空格。允许使用加号 (+) 和减号 (-)。L字母,必选。将输入限定为 ASCII 字母 a转载 2017-12-05 17:18:44 · 4878 阅读 · 0 评论 -
DateTimePicker控件CustomFormat格式字符串及其说明
格式字符串描述d一个或两位数的日期。dd两位数的日期。 位数字的日期值的前面带有为 0。ddd三个字符一天的星期几的缩写。dddd完整的星期名称中。h12 小时格式的一个或两位数小时数。hh12原创 2017-12-14 11:23:39 · 6327 阅读 · 0 评论 -
C#泛型(三)——泛型类的功能
在创建泛型类时,还需要一些其他C#关键字。例如,不能把null赋予泛型类型。此时,如下一节所述,可以使用default关键字。如果泛型类型不需要Object类的功能,但需要调用泛型类上的某些特定方法,就可以定义约束。本节讨论如下主题:●默认值●约束●继承●静态成员首先介绍一个使用泛型文档管理器的示例。文档管理器用于从队列中读写文档。先创建一个新的控制台项目DocumentM原创 2017-12-28 11:05:52 · 1453 阅读 · 0 评论 -
C#正则表达式参考
正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。本文详细地列出了能在正则表达式中使用,以匹配文本的各种字符。当你需要解释一个现有的正则表达式时,可以作为一个快捷的参考。一. 匹配字符字符类匹配的字符举 例\d从0-9的任一数字\d...原创 2018-03-21 17:43:24 · 724 阅读 · 0 评论 -
C#字符串的Split数组陷阱
C#中,当我们把一个字符串用Split方法中指定的一个或多个字符分隔生成数组时,如果字符串为空时,这个数组的宽度为1,而不是我们想象的0,如下:string str1="";string str2="a,b,c";int length1=str1.Split(',').Length;int length2=str2.Split(',').Length;此时,length1=1,而不是0,lengt...原创 2018-04-12 16:36:32 · 1168 阅读 · 0 评论 -
C#解决XML文件乱码问题
一些英文版源码,用中文版VS打开后,会出现乱码问题。特别是把XML文件中的英文改为中文后会显示乱码,解决的办法是:1、在XML文件的头部加<?xml version="1.0" encoding="UTF-8"?>语句2、用记事本打开XML文件,点击另存为,在弹出的对话框中:保存类型选择“所有文件(*.*)”,编码选择“Unicode”这样在读取XML文件时就不会出现乱码问题了。...原创 2018-06-10 10:43:48 · 4293 阅读 · 1 评论 -
C#继承(五)——is和as运算符
在结束接口和类的继承之前,需要介绍两个与继承有关的重要运算符:is和as。如前所述,可以把具体类型的对象直接分配给基类或接口——如果这些类型在层次结构中有直接关系。例如,前面创建的SaverAccount可以直接分配给IBankAccount,因为SaverAccount类型实现了IBankAccount接口:IBankAccount venusAccount=new SaverAccou原创 2017-11-19 17:19:34 · 857 阅读 · 0 评论 -
C#继承(四)——接口
如前所述,如果一个类派生自一个接口,声明这个类就会实现某些函数。并不是所有的面向对象语言都支持接口,所以我们将详细介绍C#接口的实现。下面列出Microsoft预定义的一个接口System.IDisposable的完整定义。IDisposable包含一个方法Dispose(),该方法由类实现,用于清理代码:Publicinterface IDisposable{Void Dispose原创 2017-11-19 17:00:38 · 1300 阅读 · 0 评论 -
C#继承(三)——修饰符
前面已经遇到许多所谓的修饰符,即应用于类型或成员的关键字。修饰符可以指定方法的可见性,如public或private;还可以指定一项的本质,如方法是virtual或abstract。C#有许多访问修饰符,下面讨论完整的修饰符列表。1、访问修饰符下表中的修饰符确定了是否允许其他代码访问某一项。修饰符应用于说明Public原创 2017-11-19 14:37:47 · 448 阅读 · 0 评论 -
C#语法的一般特性
1、语句结尾:在C#中,与其他C风格的语言一样,大多数语句都以(;)分号结尾,语句可以写在多个代码行上,不需要使用续行字符。VB的续行字符是”_”。如:1) 单行:string strA=”select * from Admin where [ID]=’101’”;2) 多行:string strA=”select * from Admin where [ID]=’101’”+“ an原创 2017-11-11 15:38:46 · 419 阅读 · 0 评论 -
C#程序流控制(一)——条件语句
条件语句可以根据条件是否满足或根据表达式的值来控制代码的执行分支。C#有两个控制代码的分支的结构:if语句,测试特定条件是否满足;switch语句,比较表达式和多个不同的值。一、if语句 对于条件分支,C#继承了C和C++的if...else结构。对于用过程语言编程的人,其语法非常直观:if(condition)statement(s)elsestatement(s)如果在条件中要执原创 2017-11-13 09:43:33 · 516 阅读 · 0 评论 -
C#程序流控制(二)——循环语句
C#提供了4种不同的循环机制(for、while、do...while和foreach),在满足某个条件之前,可以重复执行代码块。一、for循环C#的for循环提供的迭代循环机制是在执行下一次迭代前,测试是否满足某个条件,其语法如下: for (initializer; condition; iterator): statement( s) 其中: initializer原创 2017-11-13 10:39:39 · 330 阅读 · 0 评论 -
C#程序流控制(三)——跳转语句
C#提供了许多可以立即跳转到程序中另一行代码的语句,在此。一. goto语句goto语句可以直接跳转到程序中用标签指定的另一行(标签是一个标识符,后跟一个冒号):goto Label1; WriteLine(" 这行不会被执行!"); Label1: WriteLine(" 继续从这行开始执行!"); goto语句有两个限制。不能跳转到像for循环这样的代码块中,也不能原创 2017-11-13 10:57:28 · 424 阅读 · 0 评论 -
C#类和对象(七)——枚举
枚举是一个值类型,包含一组命名的常量,如这里的Color类型。枚举类型用enum关键字定义:public enum Color { Red, Green, Blue } 可以声明枚举类型的变量,如变量c1,用枚举类型的名称作为前缀,设置一个命名常量,来赋予枚举中的一个值:Color c1 = Color. Red; WriteLine( c1);原创 2017-11-17 11:55:57 · 1032 阅读 · 0 评论 -
C#类和对象(八)——部分类
partial关键字允许把类、结构、方法或接口放在多个文件中。一般情况下,某种类型的代码生成器生成了一个类的某部分,所以把类放在多个文件中是有益的。假定要给类添加一些从工具中自动生成的内容。如果重新运行该工具,前面所做的修改就会丢失。partial关键字有助于把类分开放在两个文件中,而对不由代码生成器定义的文件进行修改。partial关键字的用法是:把partial放在class、struct原创 2017-11-18 13:08:19 · 1764 阅读 · 0 评论 -
C#类和对象(一)——类和结构的区别
C#语言的主要模块,包括变量、数据类型和程序流语句,如何把这些内容组合在一起,构成一个完整的程序,其关键就在于对类的处理。类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。类定义了类的每个对象(称为实例)可以包含什么数据和功能。例如,如果一个类表示一个顾客,就可以定义字段CustomerID、FirstName、LastName和Address,以包含该顾客的原创 2017-11-13 15:52:27 · 855 阅读 · 0 评论 -
C#类和对象(二)——类
[注:本文适用于vs2015C#6.0]类包含成员,成员可以是静态或实例成员。静态成员属于类;实例成员属于对象。静态字段的值对每个对象都是相同的。而每个对象的实例字段都可以有不同的值。静态成员关联了static修饰符。成员的种类见下表: 成员说明字段字段是类的数据成员,它是类型的一个变量,该类型是类的一个成员原创 2017-11-14 09:49:55 · 459 阅读 · 0 评论 -
C#类和对象(三)——匿名类型
var关键字,它用于表示隐式类型化的变量。var与new关键字一起使用时,可以创建匿名类型。匿名类型只是一个继承自Object且没有名称的类。该类的定义从初始化器中推断,类似于隐式类型化的变量。如果需要一个对象包含某个人的姓氏、中间名和名字,则声明如下:var captain = new {FirstName = "James", MiddleName = "T", Las原创 2017-11-14 11:27:24 · 220 阅读 · 0 评论 -
C#类和对象(四)——结构
前面介绍了类如何封装程序中的对象,也介绍了如何将它们存储在堆中,通过这种方式可以在数据的生存期上获得很大的灵活性,但性能会有一定的损失。因为托管堆的优化,这种性能损失比较小。但是,有时仅需要一个小的数据结构。此时,类提供的功能多于我们需要的功能,由于性能原因,最好使用结构。看看下面的例子:public class Dimensions { public double Length原创 2017-11-14 11:53:48 · 259 阅读 · 0 评论 -
C#类和对象(九)——扩展方法
有许多扩展类的方式。继承就是给对象添加功能的好方法。扩展方法是给对象添加功能的另一个选项,在不能使用继承时,也可以使用这个选项(例如类是密封的)。 注意:扩展方法也可以用于扩展接口。这样,实现该接口的所有类就有了公共功能。 假设希望用一个方法扩展string类型,该方法计算字符串中的单词数。GetWordCount方法利用String.Split方法把字符串分割到字符串原创 2017-11-19 08:03:26 · 591 阅读 · 0 评论 -
C#类和对象(十)——Object类
所有的.NET类最终都派生自System.Object。实际上,如果在定义类时没有指定基类,编译器就会自动假定这个类派生自Object。如果没有使用继承,则每个类都派生自System.Object(如前所述,对于结构,这个派生是间接的:结构总是派生自System.ValueType,System.ValueType又派生自System.Object)。 其实际意义在于,除了自己定义的原创 2017-11-19 08:19:12 · 2536 阅读 · 0 评论 -
C#类和对象(五)——按值和按引用传递参数
假设有一个类型A,它有一个int类型的属性X。ChangeA方法接收类型A的参数,把X的值改为2。public static void ChangeA( A a) { a.X = 2; } Main()方法创建类型A的实例,把X初始化为1,调用ChangeA方法: static void Main() { A a1 = new A { X = 1}; Chang原创 2017-11-14 16:19:52 · 3175 阅读 · 1 评论 -
C#继承(一)——继承的类型
面向对象的三个最重要的概念是继承、封装和多态性。 首先介绍一些面向对象(Object-Oriented,OO)术语,看看C#在继承方面支持和不支持的功能。 ●单重继承:表示一个类可以派生自一个基类。C#就采用这种继承。●多重继承:多重继承允许一个类派生自多个类。C#不支持类的多重继承,但允许接口的多重继承。●多层继承:多层继承允许继承有更大的层次结构。类B派生自原创 2017-11-19 10:14:33 · 1890 阅读 · 0 评论 -
C#继承(二)——实现继承
如果要声明派生自另一个类的一个类,就可以使用下面的语法:class MyClass: MyBaseClass { //成员} 如果类(或结构)也派生自接口,则用逗号分隔列表中的基类和接口: public class MyClass: MyBaseClass, IInterface1, IInterface2 { //成员} 如果类和接口都用于派生,则类总原创 2017-11-19 12:03:21 · 3456 阅读 · 0 评论 -
VS2015帮助查看器打不开的解决办法
我的VS2015帮助文档安装到了移动硬盘,当时的盘符是I盘,有一天,我插入一个U盘后,移动硬盘的四个盘符都变了,原来的I盘变成了H般,打开VS2015后按F1,出现如下画面:解决办法是,直接修改注册表值:把HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Help\v2.2\Catalogs\VisualStudio14...原创 2018-09-20 15:56:56 · 3434 阅读 · 0 评论