论文部分内容阅读
摘要: Visual C#.net是Visual Studio系列中的最新成员。本文列举了C#.net编程中的几个常用操作技巧。
关键词: C#.net 编程操作技巧
Visual C#.net是Visual Studio系列中的最新成员。这种新语言在计算机高级语言C/C 的基础上深化了面向组件编程的有关内容。下面是我在使用C#.net编程中总结的几点技巧。
一、使用属性代替原始数据
因为属性是语言本身的元素,所以我们在声明数据元素时,它的作用域等级没有必要大于“private”。因为代码本身会把属性看成数据元素,我们并没有失去使用简单数据类型的便利性。相反,它会使代码更加灵活、功能更加强大。属性使数据元素封装性更好,它可以使用“lazy evaluation”来返回数据。lazy evaluation的意思是当用户请求时才计算它的值,而不是一直保留着它。属性可以是“virtual”,也可以是“abstract”。我们也可以在接口中定义属性。对于维护方面的因素我们应当注意:尽管操作两者的方法是一样的,但是我们把一个数据元素变成属性,那么原先客户端的程序便不能访问服务端的新版本程序了。实际上对于在Web service中想实现序列化的值,我们可以把它们变成属性来使用:
private int TheMonth = 0;
public int Month
{ get { return TheMonth; }
set { TheMonth = value; } }
我们这样简单地通过属性就可以使所有数据元素私有化。
二、尽量使用接口来编程
C#.net框架包括类和接口,在编写程序时,我们可能知道正在用C#.net的哪个类。然而,在这种情况下如果我们用C#.net支持的接口而不是用它的类来编程时,代码会变得更加稳定、可用性会更高。如一段代码从一个可为任何对象的数组中加载ListBox,这段代码被限定为只能使用数组。假设过些时候我们发现那些对象存在数据库中,或别的集合中,那么,我们就需要修改程序来使用不同的集合类型。如果用ICollection接口来写那段程序,我们就不用修改那段程序了,因为对于任何实现ICollection接口的类型它都能很好地工作:ICollection被数组和所有System.Collection中的集合实现。此外,多维数组也支持ICollection接口。如果那还不够的话,数据库.net类同样支持ICollection接口,用接口写的这个函数不用修改就可以在许多情况中使用。
三、使用“delegate”类型设计自定义事件
在编程中,除了“Method”和“Property”,任何“Class”都可以有自己的事件(Event)。定义和使用自定义事件的步骤如下:
(1)在“Class”之外定义一个“delegate”类型,用于确定事件程序的接口。
(2)在“Class”内部声明一个“public event”变量,类型为上一步骤定义的“delegate”类型。
(3)在某个“Method”或者“Property”内部某处,触发事件。
(4)Client程序中使用“ =”操作符指定事件处理程序。
例子:
public delegate void MyEventHandler(object sender, long lineNumber) ; // 定义Delegate类型,约束事件程序的参数
public class DataImports
{
// 定义新事件NewLineRead
public event MyEventHandler NewLineRead ;
public void ImportData()
{
long i = 0 ; // 事件参数
while()
{
i ;
// 触发事件
if( NewLineRead != null ) NewLineRead(this, i);
//...
}
//...
}
//...
}
// 以下为Client代码
private void CallMethod()
{
// 声明Class变量,不需要WithEvents
private DataImports _da = null;
// 指定事件处理程序
_da.NewLineRead = new MyEventHandler(this.DA_EnterNewLine) ;
// 调用Class方法,途中会触发事件
_da.ImportData();
}
// 事件处理程序
private void DA_EnterNewLine(object sender, long lineNumber)
{
// ...
}
四、IP与主机名解析
使用System可以实现与Ping命令行类似的IP解析功能,例如将主机名解析为IP或者反过来:
private string GetHostNameByIP(string ipAddress)
{
IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
return hostInfo.HostName;
}
private string GetIPByHostName(string hostName)
{
System.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
return hostInfo.AddressList.ToString();
}
参考文献:
[1]李兰友,杨晓光.Visual C#.net程序设计.北京:清华大学 北方交通大学出版社,2004.
[2]王昊亮,李刚等.Visual C#程序设计教程.北京:清华大学出版社,2003.
[3]孙永强等.Visual C#.net入门与提高.北京:清华大学出版社,2002.
[4]郭胜等.C#.net程序设计教程.北京:清华大学出版社,2002.
[5]B-power工作室.C#网络程序设计.北京:中国铁道出版社,2001.
[6][美]Anders Hejlsberg,Scott Wiltamuth,Peter Golde著.张晓坤,谭立平,车树良译.C#编程语言详解.北京:电子工业出版社,2004.
关键词: C#.net 编程操作技巧
Visual C#.net是Visual Studio系列中的最新成员。这种新语言在计算机高级语言C/C 的基础上深化了面向组件编程的有关内容。下面是我在使用C#.net编程中总结的几点技巧。
一、使用属性代替原始数据
因为属性是语言本身的元素,所以我们在声明数据元素时,它的作用域等级没有必要大于“private”。因为代码本身会把属性看成数据元素,我们并没有失去使用简单数据类型的便利性。相反,它会使代码更加灵活、功能更加强大。属性使数据元素封装性更好,它可以使用“lazy evaluation”来返回数据。lazy evaluation的意思是当用户请求时才计算它的值,而不是一直保留着它。属性可以是“virtual”,也可以是“abstract”。我们也可以在接口中定义属性。对于维护方面的因素我们应当注意:尽管操作两者的方法是一样的,但是我们把一个数据元素变成属性,那么原先客户端的程序便不能访问服务端的新版本程序了。实际上对于在Web service中想实现序列化的值,我们可以把它们变成属性来使用:
private int TheMonth = 0;
public int Month
{ get { return TheMonth; }
set { TheMonth = value; } }
我们这样简单地通过属性就可以使所有数据元素私有化。
二、尽量使用接口来编程
C#.net框架包括类和接口,在编写程序时,我们可能知道正在用C#.net的哪个类。然而,在这种情况下如果我们用C#.net支持的接口而不是用它的类来编程时,代码会变得更加稳定、可用性会更高。如一段代码从一个可为任何对象的数组中加载ListBox,这段代码被限定为只能使用数组。假设过些时候我们发现那些对象存在数据库中,或别的集合中,那么,我们就需要修改程序来使用不同的集合类型。如果用ICollection接口来写那段程序,我们就不用修改那段程序了,因为对于任何实现ICollection接口的类型它都能很好地工作:ICollection被数组和所有System.Collection中的集合实现。此外,多维数组也支持ICollection接口。如果那还不够的话,数据库.net类同样支持ICollection接口,用接口写的这个函数不用修改就可以在许多情况中使用。
三、使用“delegate”类型设计自定义事件
在编程中,除了“Method”和“Property”,任何“Class”都可以有自己的事件(Event)。定义和使用自定义事件的步骤如下:
(1)在“Class”之外定义一个“delegate”类型,用于确定事件程序的接口。
(2)在“Class”内部声明一个“public event”变量,类型为上一步骤定义的“delegate”类型。
(3)在某个“Method”或者“Property”内部某处,触发事件。
(4)Client程序中使用“ =”操作符指定事件处理程序。
例子:
public delegate void MyEventHandler(object sender, long lineNumber) ; // 定义Delegate类型,约束事件程序的参数
public class DataImports
{
// 定义新事件NewLineRead
public event MyEventHandler NewLineRead ;
public void ImportData()
{
long i = 0 ; // 事件参数
while()
{
i ;
// 触发事件
if( NewLineRead != null ) NewLineRead(this, i);
//...
}
//...
}
//...
}
// 以下为Client代码
private void CallMethod()
{
// 声明Class变量,不需要WithEvents
private DataImports _da = null;
// 指定事件处理程序
_da.NewLineRead = new MyEventHandler(this.DA_EnterNewLine) ;
// 调用Class方法,途中会触发事件
_da.ImportData();
}
// 事件处理程序
private void DA_EnterNewLine(object sender, long lineNumber)
{
// ...
}
四、IP与主机名解析
使用System可以实现与Ping命令行类似的IP解析功能,例如将主机名解析为IP或者反过来:
private string GetHostNameByIP(string ipAddress)
{
IPHostEntry hostInfo = Dns.GetHostByAddress(ipAddress);
return hostInfo.HostName;
}
private string GetIPByHostName(string hostName)
{
System.IPHostEntry hostInfo = Dns.GetHostByName(hostName);
return hostInfo.AddressList.ToString();
}
参考文献:
[1]李兰友,杨晓光.Visual C#.net程序设计.北京:清华大学 北方交通大学出版社,2004.
[2]王昊亮,李刚等.Visual C#程序设计教程.北京:清华大学出版社,2003.
[3]孙永强等.Visual C#.net入门与提高.北京:清华大学出版社,2002.
[4]郭胜等.C#.net程序设计教程.北京:清华大学出版社,2002.
[5]B-power工作室.C#网络程序设计.北京:中国铁道出版社,2001.
[6][美]Anders Hejlsberg,Scott Wiltamuth,Peter Golde著.张晓坤,谭立平,车树良译.C#编程语言详解.北京:电子工业出版社,2004.