C#与java的异同

网上到处充斥这c#与java对比的文章,看了看,还是觉的MSDN上的一篇文章很全面和客观。《针对JAVA开发人员的C#编程语言》。

    我的第一天C#学习,总体感觉C#在语言层面上保留了更多C++/C的特点,比如virtual,override关键字的使用,比如结构(值类型,存储在栈上),比如delegate(类似函数指针)。比较感兴趣的也就是delegate、事件和attribute方面。C#某种意义上讲比java稍微复杂,比C++简单。

    参照语言规范写的例子,抽象类、继承的例子,可以扩展成一个简单计算器:

using System;
using System.Collections;

namespace VirtualDemo
{
    public abstract class Expression
    {
        public abstract double Evaluate(Hashtable vars);
        
    }
    public class Constant : Expression
    {
        double value;
        public Constant(double value)
        {
            this.value = value;
        }
        public override double Evaluate(Hashtable vars)
        {
            return value;
        }
    }
    public class VariableReference : Expression
    {
        string name;
        public VariableReference(string name)
        {
            this.name = name;
        }
        public override double Evaluate(Hashtable vars)
        {
            object value = vars[name];
            if (value == null)
            {
                throw new Exception("Unknown variable: " + name);
            }
            return Convert.ToDouble(value);
        }
    }
    public class Operation : Expression
    {
        Expression left;
        char op;
        Expression right;
        public Operation(Expression left, char op, Expression right)
        {
            this.left = left;
            this.op = op;
            this.right = right;
        }
        public override double Evaluate(Hashtable vars)
        {
            double x = left.Evaluate(vars);
            double y = right.Evaluate(vars);
            switch (op)
            {
                case '+': return x + y;
                case '-': return x - y;
                case '*': return x * y;
                case '/': return x / y;
            }
            throw new Exception("Unknown operator");
        }
    }
    public class Test
    {
        public static void Main(string []args)
        {
            Expression e = new Operation(
            new VariableReference("x"),
            '*',
            new Operation(
                new VariableReference("y"),
                '+',
                new Constant(2)
            )
        );
        Hashtable vars = new Hashtable();
        vars["x"] = 3;
        vars["y"] = 5;
        Console.WriteLine(e.Evaluate(vars));        // Outputs "21"
        vars["x"] = 1.5;
        vars["y"] = 9;
        Console.WriteLine(e.Evaluate(vars));        // Outputs "16.5"

        }
    }

}

再来一个委托的例子,函数作为变量的传递和使用,对有C++经验或者动态语言经验的人来说不会奇怪:

using System;
namespace DelegateDemo
{
    delegate double Function(double x);
    class Multiplier
    {
        double factor;
        public Multiplier(double factor)
        {
            this.factor = factor;
        }
        public double Multiply(double x)
        {
            return x * factor;
        }
    }

    class Test
    {
        static double Square(double x)
        {
            return x * x;
        }
        static double[] Apply(double[] a, Function f)
        {
            double[] result = new double[a.Length];
            //直接通过f()调用
            for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
            return result;
        }
        static void Main()
        {
            double[] a = { 0.0, 0.5, 1.0 };
            //delegate Function分别赋予了不同的方法
            double[] squares = Apply(a, new Function(Square));
            double[] sines = Apply(a, new Function(Math.Sin));
            Multiplier m = new Multiplier(2.0);
            double[] doubles = Apply(a, new Function(m.Multiply));
            foreach (double b in doubles)
            {
                Console.WriteLine(b);
            }
        }

    }
}

文章转自庄周梦蝶  ,原文发布时间5.17

时间: 2024-09-21 03:38:39

C#与java的异同的相关文章

JAVA 【引用类型】和【对象类型】在【继承】中的异同

介绍     JAVA [引用类型]和[对象类型]在[继承]中的异同,这个问题自己整理过N次,也被人当菜鸟问过N次.所以,在此简单整理一下,以供大家分享. 在继承关系中,一般成员变量是根据引用类型 在继承关系中,静态成员变量是根据引用类型 在继承关系中,一般方法是根据对象类型 在继承关系中,静态方法是根据引用类型 注意     静态成员变量,静态方法是基于类的,本文为了测试观察,所以,会用对象去引用静态成员变量和静态方法.      Super Class: package shuai.stud

java 与 php 区别或异同(整理、整合)

收集了一下PHP和JAVA语言的相同或不同之处(来源在末尾有出处),已备后续使用做参考,在下一篇文章再详细写出,相同或者不同,可以让我们快速入门JAVA 或者PHP. java和php基础部分相同或异同http://blog.csdn.net/fenglailea/article/details/52722710 风.fox 编程范式: Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int.double.boolean.byte.flo

Javascript和Java语言有什么关系?两种语言间的异同比较_java

虽然Javascript与Java有紧密的联系,但却是两个公司开发的不同的两个产品.Java是Sun公司推出的新一代面向对象的程序设计语言.特别适合于Internet应用程序开发:而Javascript是Sun与Netscape公司联合推出的产品,是为了扩展Netscape Navigator功能而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言.且它的前身是Live Script,而Java的前身是Oak语言.下面就对两种语言间的异同作如下比较: (1)基于对象和面向对象 Jav

Java的数组(Array)、Vector、ArrayList、HashMap的异同

数组   array(数组)和Vector是十分相似的Java构件(constructs),两者全然不同,在选择使用时应根据各自的功能来确定. 1.数组:Java arrays的元素个数不能下标越界,从很大程度上保证了Java程序的安全性,而其他一些语言出现这一问题时常导致灾难性的后果.        Array可以存放Object和基本数据类型,但创建时必须指定数组的大小,并不能再改变.值得注意的是:当Array中的某一元素存放的是Objrct reference 时,Java不会调用默认的构

Scala的类层级:与Java类之异同

图释 11.1 Scala 类层级图 图释11.1展示了Scala的类层级的大纲.层级的顶端是类Any,定义了包含下列的方法: final def ==(that: Any): Boolean final def !=(that: Any): Boolean def equals(that: Any): Boolean def hashCode: Int def toString: String 因为每个类都继承自Any,Scala程序里的每个对象都能用==,!=或 equals比较:用hash

java和php基础部分相同或异同

拿着JAVA参考书,一章一章的走过 目前先整理这么多 风.fox 编程范式: Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int.double.boolean.byte.float. long.short.char.但是念在每个Java每个基本数据类型都有包装类(int的包装类是Integer)的基础上,就姑且认为一切是对象吧. PHP:即使用可面向对象的方式编程,又可使用面向过程的方式.这种两种编程范式结合的语言代表了计算机语言以后

Java Servlet和JSP的异同

    Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面. 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层. Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机.     JavaServer Pages(JSP)是一种实现普通

Java web中Cookie与Session 异同总结

当我们在使用浏览器与服务器进行会话的过程中,就必然会产生一些数据.这个时候就需要对数据进行保存.比如常见的购物网站购物车信息的保存.保存客户端与服务器会话数据的两种技术是Cookie与Session. 一.Cookie 1.什么是Cookie? Cookie是保存在客户端的,以name,value的形式保存.当用户使用浏览器访问服务器产生数据时,服务器程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web服

Java中打印函数print、printf、println异同

printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.printf("the number is: d",t);参照JAVA API的定义如下:'d' 整数 结果被格式化为十进制整数'o' 整数 结果被格式化为八进制整数'x', 'X' 整数 结果被格式化为十六进制整数'e', 'E' 浮点 结果被格式化为用计算机科学记数法表示的十进制数'f'