Posted on 2007-02-10 17:39
dennis 閱讀(688)
評論(0) 編輯 收藏 所屬分類:
C#歷程
??? 網(wǎng)上到處充斥這c#與java對比的文章,看了看,還是覺的MSDN上的一篇文章很全面和客觀。《
針對JAVA開發(fā)人員的C#編程語言》。
??? 我的第一天C#學(xué)習(xí),總體感覺C#在語言層面上保留了更多C++/C的特點,比如virtual,override關(guān)鍵字的使用,比如結(jié)構(gòu)(值類型,存儲在棧上),比如delegate(類似函數(shù)指針)。比較感興趣的也就是delegate、事件和attribute方面。C#某種意義上講比java稍微復(fù)雜,比C++簡單。
??? 參照語言規(guī)范寫的例子,抽象類、繼承的例子,可以擴(kuò)展成一個簡單計算器:
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"
????????}
????}
}
再來一個委托的例子,函數(shù)作為變量的傳遞和使用,對有C++經(jīng)驗或者動態(tài)語言經(jīng)驗的人來說不會奇怪:
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()調(diào)用
????????????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);
????????????}
????????}
????}
}