资源描述
学习C#的方法
学习C#好方法包括:
1.阅读MSDN
阅读MSDN的方法:最好先阅读相关知识内容所属的namespace,在C#中对各种类、结构、事件等根据不同的功能块进行了归类,一个大类通常会放入到一个namespace中。Namespace会对本类功能进行一个overview的描述,以及其中包含的各个类、结构、事件等子项进行结构层面的描述,这样您就会对该类功能的实现有个大的框架性的了解,基于这种大的框架性的认识,再去阅读内部的细节,就更加理解整个大类的功能以及内部每个类、结构、事件等功能以及它们之间的关系。
2.上机验证
学习计算机语言与学习其它知识最大的不同就是计算机的实践性非常强,对于一些理解不透的知识点通过编写小程序来验证是最好不过的了。
3.利用网络资源
目前internet网络非常发达,网络中有各种各样的资源,遇到难点问题时不妨Google或者百度一回,或许能够快速解决您的问题。
另外参与一些C#主题的论坛、社区或者QQ群、Blog群活动,与同志们一块讨论、交流,对于您的成长也是收益多多。
数据库连接串中的“DriverID”
是驱动类型ID,如24为FoxPro Files,25为Microsoft Access,277就是dBASE Driver,
.NET中各种数据库连接大全
Control之allowdrop属性
是否支持将文件拖拽到控件上,例如将图片拖到一个控件上显示,将声音/视频拖到一个控件中进行播放等,典型的应用是播放器。
Control之doublebuffered属性
支持双缓冲,减少控件重画时出现的闪烁
Control之imeMode属性
输入法模式。输入法编辑器 (IME) 允许用户输入和编辑中文、日语和朝鲜语字符。IME 是用于编写中文、日语和朝鲜语脚本的基本组件。这些书写体系具有的字符比可为常规键盘编码的字符要多。这些语言的 IME 使用描述单个字符或成组字符的基字符序列,以便允许您输入范围较广的一组字符。基字符可以是来自朝鲜文音节的成分字母、日语汉字字符的拼音成分,或者中文字符的各种组合。
Alpha
字母数字单字节字符 (SBC)。此设置仅对朝鲜语和日语 IME 有效。
AlphaFull
字母数字双字节字符。此设置仅对朝鲜语和日语 IME 有效。
Close Disable
IME 被禁用。如果使用此设置,则用户无法从键盘打开 IME,而且 IME 浮动窗口处于隐藏状态。
Hangul
朝鲜文 SBC。此设置仅对朝鲜语 IME 有效。
HangulFull
朝鲜文 DBC。此设置仅对朝鲜语 IME 有效。
Hiragana
平假名 DBC。此设置仅对日语 IME 有效。
Inherit
继承父控件的 IME 模式。
Katakana
片假名 DBC。此设置仅对日语 IME 有效。
KatakanaHalf
片假名 SBC。此设置仅对日语 IME 有效。
NoControl
无(默认)。
Off
IME 已关闭。此模式指示 IME 已关闭,这意味着该对象的行为方式与英语输入模式相同。 此设置仅对日语、简体中文和繁体中文 IME 有效。
On
IME 已打开。此值指示 IME 已打开,可以输入中文或日语特定的字符。此设置仅对日语、简体中文和繁体中文 IME 有效。
Control之Tag属性
可保存一个包含与此控件相关的数据对象,将此Tag指向该数据对象,从而实现控制对此数据的快速访问。
Any type derived from the Object class can be assigned to this property. If the Tag property is set through the Windows Forms designer, only text can be assigned.
A common use for the Tag property is to store data that is closely associated with the control. For example, if you have a control that displays information about a customer you, might store a DataSet that contains the customer's order history in that control's Tag property so the data can be accessed quickly.
Control之Localizable属性
可实现空间的多国语言之支持
Control之Locked属性
Locked让控件在设计器中无法被拖动和修改大小~
但是通过属性窗口或代码仍然可以对其进行修改~这个属性并不会影响程序运行时~所以也就没有必要在代码中来访问这个属性了的
Control之CausesValidation属性
在Focus到本控件时是否启动检测、校验事件。其值为false时validated事件和validating事件无效。
Control之Padding属性
The amount of space between the content of a Control and its Margin or Border. The default is a thickness of 0 on all four sides
Control之AutoScaleMode属性
控件的自动缩放模式:
By Font:控件将会根据字体大小的变化自动进行缩放,以使得保持文字的换行不变。
By Dpi:控件将会根据分辨率的变化自动进行缩放,以使得保持占用屏幕的百分比不变。
Label之Mnemonic属性
If the UseMnemonic property is set to true and a mnemonic character (a character preceded by the ampersand) is defined in the Text property of the Label, pressing ALT+ the mnemonic character sets the focus to the control that follows the Label in the tab order. You can use this property to provide proper keyboard navigation to the controls on your form
如果设置UseMnemonic属性值为true时:则Label之Text属性中的字符“&”看成一个助记符,并不显示“&”字符本身,而是将“&”字符后面的字符添加一个下划线;并且当用户按下Alt+“&”后面的字符时,focus到Label后面的控件中(通常是文本输入控件),实现快速定位。
如果其值为false,则直接显示“&”字符。
Label之AutoEllipsis属性
当其文本超过Label控件本身的宽度时,自动出现一个“…”,表示文本未全展开。此时如果鼠标mouseover该控件,会显示一个tooltip,显示完整的文本内容。
注:此时需设置AutoEllipsis=true,AutoSize=false
问题:在Vs2005中调试时,发现mouseover在Label控件时,并未出现预期的tooltip效果。
但Button控件无此问题。
Label之UseCompatibleTextRendering属性
If true, new controls that support UseCompatibleTextRendering use the GDI+ based Graphics class for text rendering; if false, new controls use the GDI based TextRenderer class
GenerateMember和Modifier属性
GenerateMember:是否将此控件作为它所在容器控件的成员变量,
Modifier:必须和GenerateMember属性配套使用,表示成员变量的前面的修饰符。
注:默认下都会将位于其内的控件作为容器(container或panel)的一个Private成员变量。在某些必要情况下(当外部需要访问本控件时),可以改变此两项设定值。
DrawMode属性
表明Combobox、ListBox、CheckListBox等控件中所有元素是由操作系统来绘制还是由程序代码来绘制。包括以下3个值:
Normal:由操作系统来绘制,且所有元素大小是一样的
OwnerDrawFixed:由程序代码来绘制,且所有元素大小是一样的
OwnerDrawVariable:由程序代码来绘制,且所有元素大小可不相同。
DataSource/ DisplayMember/ ValueMember属性
为ComboBox、Listbox等控件绑定数据源,将数据源中的记录添加到列表控件中显示。
问题:为ComboBox控件绑定一个Access数据表时(通过Property面板操作)发现未能载入绑定数据表中的字段值列表内容。
AcceptReturn属性
是否支持回车换行
True表示按下Enter键时换行,false表示按下Enter+Ctrl键才换行
控件Anchor和Dock的区别
Anchor的英文意思是锚定。表示在窗体重置时控件与窗体(或者父控件)的相对位置保持不变。控件变化要等到窗体重置的时候才能呈现。
例如:
窗体重置前
窗体重置后
相对位置不变
Dock则是停泊的意思,表示控件的某个边与窗体重合(零距离)。控件的变化则在设计的时候就能呈现。此外控件的DocK循序会影像到结果。
ReportViewer与Report报表绑定DataSource问题
创建一个ReportViewer控件-> 创建一个Rdlc报表-> 在报表中添加一个Table控件,但并不为其指定数据源-> 在ReportViewer控件上选择绑定该Rdlc报表(即将报表放在ReportViewer上显示)-> 在报表设计器上为Table指定数据源(从DataSource面板上拖入需要的表字段)-> 编译运行,会出现“A data source instance has not been supplied for the data source …”的错误提示,并无法显示表记录。
分析其中原因:系统只在ReportViewer绑定Rdlc报表时或者对已绑定的报表执行“Rebind Data Source”指令时为Rdlc报表绑定的数据源生成table adapter和bingdingsource,对已经绑定的Rdlc报表进行数据绑定或数据绑定更新后并不会自动更新生成table adapter和bingdingsource,必须在ReportViewer上点击“Rebind Data Source”指令方会更新。
BackgroundWorker
为了让一些耗占时间的操作,例如下载上传、执行数据备份等不影响用户操作,将其放在一个和主线程独立专用的线程里进行运行。
但必须注意,BackgroundWorker只是执行一个单独临时的操作,不用在跨AppDomain的multi-thread中。
.ctor表示构造函数(编译后的构造函数名称)
USB端口工作原理
windows下USB通信编程接口
Usb设备的通讯,C#中主要是通过调用Windows SDK API来进行处理:
获取主机所有的Usb设备列表:使用Win32 API库setupapi.dll中的SetupDiGetClassDevs函数。注:需指定设备的GUID号
将Usb设备的信息保存到一个数据结构中:使用Win32 API库setupapi.dll中的SetupDiEnumDeviceInterfaces函数
从数据结构中获取该Usb设备的详细信息:使用Win32 API库setupapi.dll中的SetupDiGetDeviceInterfaceDetail函数
打开、发送、接收接口:使用Win32 API库kernel32.dll中的CreateFile、WriteFile、ReadFile函数分别来与usb设备建立连接,发起握手请求,并接收握手信息。
捕获USB设备的变动:调用Win32 API库user32.dll中的RegisterDeviceNotification方法,一旦发现有USB设备(通过guid标识类型)插入或拔出,即会向windows操作系统发送一个编号为0x0219的消息,windows操作系统进而将该消息发给本软件进程,调用相应的处理函数将该设备从设备列表中删除或者添加即可。
在Winform中使用自定义的光标
委托与事件
个人理解:委托可看成是一个函数模板(函数类),可生成函数模板实例(对象),函数模板实例(对象)可看成是某个事件或者某个消息,她关联了若干个函数名,一旦函数模板实例事件发生或者收到函数模板实例消息,就会触发该函数模板实例中包括的所有函数的执行动作。
一个委托对象就是一组具有相同参数的函数的集合,可以通过外部来调用该委托对象(即执行其绑定的所有函数)
Hash Code
哈希码,散列码。
系统每生成一个Object对象时,会将它放在内存中,内存中的所有Object对象的存放组织方式的散列式的(类似一个哈希表),为了快速找到某个对象,系统就会为每个对象分配一个哈希码,根据哈希码和哈希算法,就可快速的查找到某个对象。
.Net FrameWork对Hash Code的要求是“two objects considered equal must have the same hash code”
C#中修饰符的含义与用法
类修饰符
public 可以被其它任何场合使用
internal 这是类的默认修饰符,在本命名空间可使用(仅比public低)
sealed 本类不可以被继承
方法、变量、属性修饰符
public 可被其它任何场合使用
protected 只可在本类或其子类中调用
private 这是方法的默认修饰符,只可在本类中使用
static 静态变量或方法,其类不必实例化即可使用
sealed 该方法不可被重写
SuspendLayout、ResumeLayout、PerformLayout方法
SuspendLayout和ResumeLayout方法一般是成对使用,一般用来暂时挂起container类控件(如Panel)中多个属性的改变产生的效果,等完成所有的属性改变后,再使其一同生效,以便提升性能。例如,如果需要同时为某个panel添加多个control,并设置每个control的多个属性值,在之前调用SuspendLayout方法,等添加完所有的子control并设置完所有的属性值后再调用ResumeLayout方法使其同时生效,而不是每添加一个控件或者每改变一个控件的属性值就生效一次(这会导致控件的多次重绘,从而影响性能),提高控件显示的性能。
PerforLayout方法则是将所有的改变同时让其子控件也生效。
out、ref、params的用法
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为ref/out形式。两者都可以使函数传回多个结果。
两者区别:
两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参数,由函数内部计算得到的值再回传到函数外部,因此必须在函数内部对该参数赋值,这将冲掉函数外部的任何赋值,使得函数外部赋值毫无意义。
表现为:
1、 out必须在函数体内初始化,这使得在外面初始化变得没意义。也就是说,out型的参数在函数体内不能得到外面传进来的初始值。
2、 ref必须在函数体外初始化。
3、 两者在函数体内的任何修改都将影响到函数体外面。
Note:如果把一个属性值作为ref或者out参数进行传递,系统会报编译错误,ref或者out只能修饰变量参数。
params本身的含义是 某个方法需要的参数可能是不确定的,我们可以利用C#里的params关键字定义可变数目参数的方法。而且这样写使得代码更加优雅,如果不是确定类型就用object。
控件之间的通讯实现方式(一)
假如有两个控件control1和control2,它们之间如何实现通讯:
Case1:control1与control2之间是父控件与子控件关系(即其中一个控件是另一个控件的container),此处假定control1是control2的父控件。
由control1访问control2的方法是:this.control2
由control2访问control1的方法是:this.parent
Case2:control1与control2之间是多级父控件与子控件关系(即其中一个控件是另一个控件的container的container),此处假定control1是control2的多级父控件。
将父控件中定义的子控件声明为public或者protected类型
由control1访问control2的方法是:this.controlx.control2(假定controlx是control1的子控件,同时是control2的父控件)
由control2访问control1的方法是:this.parent.parent
Case3:control1与control2同属一个父控件controlx。
将需要在两个控件中相关通讯的变量声明为public类型
由control1访问control2的方法是:this.parent.control2
由control2访问control1的方法是:this.parent.contorl1
Case4:control1的多级父控件与control2的多级父控件同属一个父控件controlx。
将父控件中定义的子控件声明为public或者protected类型
将需要在两个控件中相互通讯的变量声明为public类型
由control1访问control2的方法是:this.parent.controlz.control2(假定control1的父控件为controly,control2的父控件为controlz,controly和controlz的父控件为controlx)
由control2访问control1的方法是:this.parent.controly.contorl1
Case5:不存在上述四种关系的任何两个控件。
将一个控件中定义另一个控件类型的变量或者属性,在调用时,将另一个控件的handle传给第一个控件的构造函数,即可在第一个控件中对另一个控件的public类型的变量进行通讯。
例如,要在control1中访问control2的变量:
Class Control1:Control
{
Contorl2 ctr2;
Public Contorl1(control2 ctrl)
{
this.ctr2=ctrl;
}
Public InvoteFun()
{
This.ctr2.color=color.red;
}
}
Class Control2:Control
{
Public color;
}
控件之间的通讯实现方式(二)
控件本质上就是一个类,类与类之间的通信可以通过:
1.继承关系(is a)
2.组合关系(has a)
3.委托与事件 (函数指针,回调函数)
4.windows的消息机制(系统调用,进程间通信)
5.网络通信机制(如socket通信)
6.其它通信方式(如通过外部文件交流)
设置Focus
设置子控件Focus方法不放在父控件的构造函数中,(在构造函数中设置子控件的Focus不产生效果),正确的方式应该放在父控件的Load方法中,即在加载该父控件显示时。
另外,有些情况下Focus()方法对自定义控件不产生作用,可以使用Select()或者ActiveControl()等方法。
Form的KeyDown、KeyUp、KeyPress事件
当一个Form上有其他子控件时,即便Form处于Enable和visible状态,为其绑定的Key事件也可能不起作用,问题在于此时Form没有Focus,Focus在他的子控件中。可以通过设置其KeyPreview属性为true,让在进入其子控件的所有key事件前先执行Form的Key事件。
C#编码规范
C#断行原则
泛型(Generic)
所谓泛型是指将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。
一种类型占位符,或称之为类型参数。我们知道一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这个类型参数是什么。在.net中,泛型能够给我们带来的两个明显好处是——类型安全和减少装箱、拆箱。
泛型是c#2.0的一个新增加的特性,它为使用c#语言编写面向对象程序增加了极大的效力和灵活性。它允许程序员将一个实际的数据类型的规约延迟至泛型的实例被创建时才确定。泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,并允许开发者编写非常优雅的解决方案。
C#中的引用类型与值类型
C#中的数据类型总体分为引用类型(Reference Type)和值类型(Value Type)。
引用类型包括:类 class(所有的class均为引用类型)
值类型包括:结构struct(所有的struct均为值类型)
引用类型可以看成是一个引用变量(或内存指针),所有对引用类型的赋值,都是把其指向堆中的一块内存地址,不能对未指向任何内存地址(指向为null或未初始化)的引用类型的非静态成员进行赋值。由于对引用类型本身赋值即是将其指向一块特定的内存块,故赋值后可能多个引用类型指向同一内存地址,其中通过任何一个引用类型改变内存块中的值,都会影响到所有指向该内存地址的所有引用类型变量。将引用类型作为函数的参数时,函数体内对形参引用类型成员值的改变也就会改变实参的值,因为它们也是指向同一个内存地址(当然,如果在函数内部改变实参的指向内存地址,自然就不会影响到形参的值)。
值类型可以成是传统C/C++中的常见类型,如int、float、double、char、bool、unsigned int、long、unsigned long等等,在C#中这些类型都统一包装成一个struct类型,故C#中stuct类型为值类型,对值类型进行赋值,是在内存栈中分配一块内存,用一个值类型对另一个值类型进行赋值时,不同于引用类型(引用类型会将被赋值变量指向赋值变量指向的内存地址),系统会在栈中重新开辟一块内存,故其中任何一个值类型变量的值发生改变也会影响到另一个值类型变量。将值类型作为函数的参数时,函数内部对形参的值的改变,不会影响到调用传入的实参的值。(当然,如果需要改变实参的值也可以通过ref来实现,本处在此不详述。)
理解Stream
C#中有各种各样的stream类和结构,stream的本质是一块数据源的视窗,你可以把它看成是C/C++下指向一块数据源的指针,C#的命名更具比喻化而已。透过该视窗,你可以对该块数据源中的数据进行相关的操作,如读写、查找、定位等等。
如此,则:stream必须指向(绑定)一块数据源
Stream包括:Stream类、FileStream类、MemoryStream类、BufferStream类等等
更多详细介绍请参考:
BinaryReader、StreamReader、StringReader
BinaryReader:read binary data from a stream
从一个stream中读出原始byte数据,并将其转换为char、string、char array、bool、int、unsigned int、int8、int16、int32、int64、float、double等各种数据类型。
StreamReader:read string or char array from a stream
从一个stream中读出原始byte数据,并将其转换为string 或者char array类型
StringReader:read string or char array from a string
从一个string中读出string的一个、一行、一部分或者全部,并作为string 或者char array类型输出。
生成唯一随机数
一.Random 类
Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数
Random rd = new Random();
int i = rd.Next();
二.Guid 类
System.Guid
GUID (Globally Unique Identifier) 全球唯一标识符
三.RNGCryptoServiceProvider 类
System.Security.Cryptography.RNGCryptoServiceProvider
RNGCryptoServiceProvider 使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器 (RNG)
Note:RNGCryptoServiceProvider的计算较为繁琐,在循环中使用会消耗造成大量的系统资源开销,使用时需注意
四.Membership.GeneratePassword()
Membership是一个方便快捷的进行角色权限管理的类,偶然发现一个很有意思的方法,跟随机数也擦点边吧
float、double与decimal
C#中有三种浮点数据类型float、double与decimal。
float:单精度、4字节
double:双精度、8字节
decimal:高精度、16字节 C#新引入类型,其精度损失小,主要用于财务和货币等高精度要求计算。
详细参考:
DataTable的使用
1. DataTable实质上是一个内存表,其结构完全模拟物理数据库中的表。与之紧密相关的一个概念是DataSet,可以把它看成一个内存数据库,其结构也和物理数据库是一样的。
2. DataTable可以从一个外部数据源中加载数据,例如另一个DataTable
3. DataTable可以和外部数据库中一个表建立关联,实现对数据库表的操作。
4.DataTable可以导出为一个XML文件,也可以从一个XML文件中导入数据
5. 如果对DataTable进行了操作,其每行的DataRowState可以标识行的状态:New/Modify/delete/none等
DataGridView控件之使用
自定义Windows消息
1.自定义消息号
public const int WM_USER=1024; // 1024以内为系统消息
public const int WM_MYMSG=WM_USER+1;
2. 发送自定义的消息
[Dllimport(“user32”)]
public static extern int SendMessage(intPtr handle,uint message,unit wparam,unit lparam);
3.
Windows系统消息列表:
#define PBT_APMQUERYSUSPEND 0x0000
#define PBT_APMQUERYSTANDBY 0x0001
#define PBT_APMQUERYSUSPENDFAILED 0x0002
#define PBT_APMQUERYSTANDBYFAILED 0x0003
#define PBT_APMSUSPEND 0x0004
#define PBT_APMSTANDBY 0x0005
#define PBT_APMRESUMECRITICAL 0x0006
#define PBT_APMRESUMESUSPEND 0x0007
#define PBT_APMRESUMESTANDBY 0x0008
#define PBTF_APMRESUMEFROMFAILURE 0x00000001
#define PBT_APMBATTERYLOW 0x0009
#define PBT_APMPOWERSTATUSCHANGE 0x000A
#define PBT_APMOEMEVENT 0x000B
C#系统命名空间介绍
VS2008和.net3.5新特性(相对于Vs2005和.net2.0)
界面比VS2005更加美观大方。
加载速度比较快,运行速度与耗占资源基本和VS2005持平。
JavaScript 可以智能感应。
自带AJAX 不需要单独安装。
出现新的技术 LINQ
多了ListView 和 DataPager 控件。
安装使用 Silverlight 技术 比 vs2005方便
VS2010和.net4.0新特性(相对于Vs2008和.net3.5)
新增保证代码质量的强有力工具:Code Contract
引入了一个“Managed Extensibility Framework(MEF)”,开发支持插件的软件系统变得前所未有的简单
.NET 4在多线程开发中新推出了一个引人注目的线程“统一取消模型(Unified Model for Cancellation)”,以支持多核化并行处理
新添加了F#,才使函数式编程开始走向真正的商业应用
首次将对云计算的支持直接融入到Visual Studio 2010中,微软的云计算应用依托于Azure这个云计算平台。
展开阅读全文