理解基于对象编程的实质,写一篇关于编程方法分析或议论的课程小论文
一、最小化窗口
点击“X”或“Alt+F4”时,最小化窗口,
protectedoverridevoidWndProc(refMessagem)
constintWM_SYSCOMMAND=0x0112;
constintSC_CLOSE=0xF060;
if(m.Msg==WM_SYSCOMMAND&&(int)m.WParam==SC_CLOSE)
//Userclickedclosebutton
this.WindowState=FormWindowState.MinimiZed;
return;
base.WndProc(refm);
二、如何让Foreach循环运行的更快
foreach是一个对集合中的元素进行简单的枚举及处理的现成语句,用法如下例所示:
usingSystem;
usingSystem.Collections;
namespaCELoopTest
classClass1
staticvoidMain(string[]args)
//createanArrayListofstrings
ArrayListarray=newArrayList();
array.Add("Marty");
array.Add("Bill");
array.Add("George");
//printthevalueofeveryitem
foreach(stringiteminarray)
Console.WriteLine(item);
你可以将foreach语句用在每个实现了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NETFrameworkSDK文档中的C#LanguageSpecification。
在编译的时候,C#编辑器会对每一个foreach区域进行转换。
IEnumeratorenumerator=array.GetEnumerator();
stringitem;
while(enumerator.MoveNext())
item=(string)enumerator.Current;
Console.WriteLine(item);
finally
IDIsposabled=enumeratorasIdisposable;
if(d!=null)d.Dispose();
这说明在后台,foreach的管理会给你的程序带来一些增加系统开销的额外代码。
三、将图片保存到一个XML文件
WinForm的资源文件中,将PictureBox的Image属性等非文字内容都转变成文本保存,这是通过序列化(Serialization)实现的,
usingSystem.Runtime.Serialization.Formatters.Soap;
Streamstream=newFileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);
SoapFormatterf=newSoapFormatter();
Imageimg=Image.FromFile("E:\\Image.bmp");
f.Serialize(stream,img);
stream.Close();
四、屏蔽CTRL-V
在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:
privatevoidrichTextBox1_KeyDown(objectsender,System.Windows.Forms.KeyEventArgse)
if(e.Control&&e.KeyCode==Keys.V)
e.Handled=true;
五、判断文件或文件夹是否存在
使用System.IO.File,要检查一个文件是否存在非常简单:
boolexist=System.IO.File.Exists(fileName);
如果需要判断目录(文件夹)是否存在,可以使用System.IO.Directory:
boolexist=System.IO.Directory.Exists(folderName);
六、使用delegate类型设计自定义事件
在C#编程中,除了Method和Property,任何Class都可以有自己的事件(Event)。
百事通定义和使用自定义事件的步骤如下:
(1)在Class之外定义一个delegate类型,用于确定事件程序的接口
(2)在Class内部,声明一个publicevent变量,类型为上一步骤定义的delegate类型
(3)在某个Method或者Property内部某处,触发事件
(4)Client程序中使用+=操作符指定事件处理程序
例子://定义Delegate类型,约束事件程序的参数
publicdelegatevoidMyEventHandler(objectsender,longlineNumber);
publicclassDataImports
//定义新事件NewLineRead
publiceventMyEventHandlerNewLineRead;
publicvoidImportData()
longi=0;//事件参数
while()
//触发事件
if(NewLineRead!=null)NewLineRead(this,i);
//...
//...
//...
//以下为Client代码
privatevoidCallMethod()
//声明Class变量,不需要WithEvents
privateDataImports_da=null;
//指定事件处理程序
_da.NewLineRead+=newMyEventHandler(this.DA_EnterNewLine);
//调用Class方法,途中会触发事件
_da.ImportData();
//事件处理程序
privatevoidDA_EnterNewLine(objectsender,longlineNumber)
//...
七、IP与主机名解析
使用System.Net可以实现与Ping命令行类似的IP解析功能,例如将主机名解析为IP或者反过来:
privatestringGetHostNameByIP(stringipAddress)
IPHostEntryhostInfo=Dns.GetHostByAddress(ipAddress);
returnhostInfo.HostName;
privatestringGetIPByHostName(stringhostName)
System.Net.IPHostEntryhostInfo=Dns.GetHostByName(hostName);
returnhostInfo.AddressList[0].ToString();
本回答由网友推荐