Visual Studio:针对 Java 开发人员的 C# 编程语…
2008-02-23 10:15:41来源:互联网 阅读 ()
有关索引器的更多信息,请参见 Indexer。
属性
为了增加有关类型的声明性信息,C# 引入一种叫做属性的新机制。有关类型的其他信息放在类型定义前面的声明性标记中。下面的示例向您展示了如何利用 .NET 框架属性来修饰一个类或方法。
在下面的示例中,通过添加 WebMethod 属性,GetTime 方法被标记为一个 XML Web 服务。
using System;
using System.Web.Services;
public class Utilities : WebService
{
[WebMethod]
public string GetTime()
{
return DateTime.Now.ToShortTimeString();
}
}
通过添加 CODE>WebMethod 属性,.NET 框架现在会自动处理调用此函数所必需的 XML/SOAP 交换。可以调用这个 Web 服务来检索下列值:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://tempuri.org/">7:26 PM</string>
在下面的示例中,通过添加 Serializable() 属性,Employee 类被标记为 Serializable。虽然 salary 字段被标记为 public,但是它不会被序列化,因为它是用 NonSerialized() 属性标记的。
using System;
[Serializable()]
public class Employee
{
public int ID;
public string Name;
[NonSerialized()] public int Salary;
}
有关创建自定义属性的信息,请参见 Creating Custom Attributes。
委托 (Delegate)
C 、Pascal 和其他一些支持函数指针概念的语言都允许我们在运行时选择我们希望调用的函数。
Java 并没有提供任何具有函数指针功能的结构,但是 C# 却通过 System.Delegate 类提供了此功能。一个委托实例封装一个方法,它是一个可调用实体。
对于实例方法,委托由包含类的实例以及该实例中的方法组成。对于静态方法,可调用实体由一个类和此类中的静态方法组成。因此,委托可用于调用任意对象的函数,并且委托是面向对象、类型安全且可靠的。
在定义和使用委托时有三个步骤:
•声明
•实例化
•调用
我们可以用下面的语法声明一个委托:
delegate void myDelegate();
然后,就可以用这个委托来引用返回 void 而且不带任何参数的所有函数。
类似地,要为带有 string 参数并返回 long 的任何函数创建一个委托,我们应该使用下面的语法:
delegate long myDelegate(string mystring);
然后,我们就可以将该委托指派给具有此签名的任何方法,如下所示:
myDelegate operation = new myDelegate(methodName);
重新指派委托
委托对象是不可改变的,也就是说,与它们匹配的签名一旦设置就不能改变。然而,我们可以指向另一个方法,只要它们都具有相同的签名即可。例如:
delegate myDelegate(int a, int b) myDelegate operation = new myDelegate(Add); operation = new myDelegate(Multiply);
这里,我们将 operation 重新指派给一个新的委托对象,这样 operation 就可以调用 Multiply 方法。只有 Add() 和 Multiply() 都具有相同的签名时,我们才可以这样做。
调用委托
调用委托相当简单,只需要将委托变量的名称替换成方法的名称即可:
delegate long myDelegate(int i, int j); myDelegate operation = new myDelegate(Add); long lresult = operation(10, 20);
这里用值 10 和 20 调用 Add 方法,返回一个长整型结果,并将其赋给变量 lresult。
让我们创建一个程序来快速地演示委托的创建、实例化和调用:
using System;
public class DelegateClass
{
delegate long myDelegate (int i, int j);
public static void Main(string[] args)
{
myDelegate operation = new myDelegate(MathClass.Add);
Console.WriteLine("Call to Add method through delegate");
long l = operation(10, 20);
Console.WriteLine("Sum of 10 and 20 is " l);
Console.WriteLine("Call to Multiply method thru delegate");
operation = new myDelegate(MathClass.Multiply);
l = operation(1639, 1525);
Console.WriteLine("1639 multiplied by 1525 equals " l);
}
}
public class MathClass
{
public static long Add (int i, int j)
{
return (i j);
}
public static long Multiply (int i, int j)
{
return (i*j);
}
}
我们会得到这样的输出:
Call to Add method through delegate Sum of 10 and 20 is 30 Call to Multiply method through delegate 1639 multiplied by 1525 equals 2499475
如前所述,委托实例必须包含对象引用。在上面的示例中,通过将方法声明为静态的(意味着我们自己不需要指定对象引用),我们避免了这样做。然而,如果委托引用一个实例方法,就必须给出对象引用,如下所示:
MathClass obj = new MathClass(); myDelegate operation = new myDelegate(obj.Power);
其中,Power 是 MathClass 方法的一个实例。因此,如果 MathClass 的方法没有声明为静态的,我们就可以通过委托来调用它们,如下所示:
using System;
public class DelegateClass
{
delegate long myDelegate(int i, int j);
public static void Main(string[] args)
{
MathClass mathObj = new MathClass();
myDelegate operation = new myDelegate(mathObj.Add);
Console.WriteLine("Call to Add method through delegate");
long l = operation(10, 20);
Console.WriteLine("Sum of 10 and 20 is " l);
Console.WriteLine("Call to Multiply method thru delegate");
operation = new myDelegate(mathObj.Multiply);
l = operation(1639, 1525);
Console.WriteLine("1639 multiplied by 1525 equals " l);
}
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
