C#中的函数委托

学C#有大半年了,这篇是我刚从Java转到C#时写的文章。这次转移博客,一起挪了过来,文章写的不好,希望大家看了不要拍砖哈。


刚从Java转到C#,对C#和dotnet平台了解还不深,这里只是发表一下个人从Java角度对C#的理解。

今天刚刚看到C#中的函数委托机制,觉得C#中这个机制非常好,给编程以很大的方便。Java中只有对象的引用,而C#中增加了对值类型(C#中的值类型包括 primitives,枚举和结构体)的引用和函数的引用。

个人觉得值类型的引用用处不大,不仅对提高C#程序的质量没有什么意义,而且会使没有经验的程序员滥用它。比如,一个函数的有一个ref参数或者out参数,那么函数对这个引用参数的值的修改都会影响到外部程序的变量的值,无形中增加了函数和外部程序的耦合性。


class Program
 2{
 3    static void double(ref int i)
 4    {
 5        i *= 2;
 6    }

 7
 8    static void main(string[] args)
 9    {
10        int i = 3;
11        double(i);
12    }

13}
而函数的引用(函数委托就是一种用引用表示函数的机制)则相当有用。试想想,函数的引用本质上是把一个代码块用一个引用变量来表示,你可以根据不同的情况,选择不同的代码块,然后执行它。这种特性在Java和c中是不曾提供的(Java中可以用模式实现),它可以大大减少我们代码量,运用这种特性也可以使我们面对变化的需求时修改的代码量更少。
 1Using directives
 6
 7namespace Ch06Ex05
 8{
 9   class Program
10   {
11      delegate double ProcessDelegate(double param1, double param2);
12
13      static double Multiply(double param1, double param2)
14      {
15         return param1 * param2;
16      }

17
18      static double Divide(double param1, double param2)
19      {
20         return param1 / param2;
21      }

22
23      static void Main(string[] args)
24      {
25         ProcessDelegate process;
26         Console.WriteLine("Enter 2 numbers separated with a comma:");
27         string input = Console.ReadLine();
28         int commaPos = input.IndexOf(',');
29         double param1 = Convert.ToDouble(input.Substring(0, commaPos));
30         double param2 = Convert.ToDouble(input.Substring(commaPos + 1,
31                                                 input.Length - commaPos - 1));
32         Console.WriteLine("Enter M to multiply or D to divide:");
33         input = Console.ReadLine();
34         if (input == "M")
35            process = new ProcessDelegate(Multiply);
36         else
37            process = new ProcessDelegate(Divide);
38         Console.WriteLine("Result: {0}", process(param1, param2));
39         Console.ReadKey();
40      }

41   }

42}
上面这个程序先要求用户输入两个数,然后根据用户的要求选择是进行乘法运算还是除法运算,最后算出结果。我们再来看看同样的功能用Java怎么实现。
6_1.jpg
Computer.java
1package test;
2
3public interface Computer {
4    Double compute(Double x, Double y);
5}
Multiply.Java
1package test;
2
3public class Multiply implements Computer {
4
5    public Double compute(Double x, Double y) {
6        Double re = x*y;
7        return re;
8    }

9}
Divide.java
1package test;
2
3public class Divide implements Computer {
4
5    public Double compute(Double x, Double y) {
6        Double re = x/y;
7        return re;
8    }

9}
Compute.java
 1package test;
 2
 3import Java.io.BufferedReader;
 4import Java.io.IOException;
 5import Java.io.InputStreamReader;
 6
 7public class Compute {
 8    
 9    public static void main(String[] args) throws IOException {
10        BufferedReader stdin = new BufferedReader(
11                new InputStreamReader(System.in));
12        System.out.println("Enter 2 numbers separated with a comma:");
13        String str = stdin.readLine();
14        String[] num = str.split(",");
15        Double param1 = Double.valueOf(num[0]);
16        Double param2 = Double.valueOf(num[1]);
17        
18        System.out.println("Enter M to multiply or D to divide:");
19        String input = stdin.readLine();
20        Computer cm;
21        if (input.equals("M")) {
22            cm = new Multiply();
23        }
 else {
24            cm = new Divide();
25        }

26        System.out.println("Result: " + cm.compute(param1, param2));
27    }

28}

从上面的C#代码和Java代码的比较中,我们可以看出,代码量的差别还是很大的。C#的函数委托功能还是能为我们提供不少方便的。不过我个人觉的Java更面向对象些,不知道是不是个人喜好在作怪。

posted @ 2008-07-06 22:02 Baozi 阅读(27) 评论(0)  编辑 收藏 网摘 所属分类: 开发技术

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-06 22:04 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: