閱讀963 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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.00.51.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

最後更新:2017-05-17 11:05:03

  上一篇:go  PL/SQL學習筆記(一)
  下一篇:go  收到“雲棲”商城發的禮物了,T恤,電腦包和書