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"
}
}
}
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);
}
}
}
}
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
最後更新:2017-05-17 11:05:03