因为要看看Monocross的东西,用它去实现移动开发的跨平台。Monocross是利用C# .net 去做的,所以就看了下C#,C#与C++及java都蛮相似,但也有其一些独特的东西,稍稍小结如下:
1、C#是一门建立在C++和java基础上的面向对象的跨平台语言,但与java不同的是,C#的跨平台不是依赖于JVM,而是.net framework,这是C#与java的本质差别。
java编译后形成字节代码,这些代码需要在jre(java runtime environment)下提供的JVM上运行;C#程序也被编译成IL(intermediate Language),运行在.net framework 的公共语言运行时(Common Language Runtime)。
2、C#抛弃了C++中指针,禁止直接的内存操作。
3、C#的全部代码都属于类和对象的代码,不存在全局变量、全局函数的概念。继承方面,C#只允许单继承。
4、强大的web应用支持;对XML的高度支持;
5、二维数组:
e.g.定义一个二维整型数组a:
int [,]a;a = new int[2,3];orint [,]a = new int[2,3]{ { 1,2,3},{ 4,5,6}};
6、枚举:
int[] a ={ 1,2,3,4};foreach(int i in a){ Console.WriteLine(i); }
7、类的概念及继承、重载、多态的概念与C++类似。
在派生类中访问基类中的成员,用base.xxx 。
派生类D的构造函数调用基类C中的重载的构造函数: public D(int x, int y,int z) : base(x,y) {this.z = z;}
8、接口:
interface I{ void f(int x); }class A: I{ public void f(int x) { }}
接口声明:
interface I1{ void f(int x); //方法 int att{ get;set;} //属性,可读写 event EventHandler OnDraw; //事件 string this [int index] { get; set;} //索引器}
9、方法的委托:这是C#的特有的功能。
using System;namespace simpleDelegatePro{ delegate void MyDelegate(string s); class A { public void f (sting msg) { Console.WriteLine(msg); } public static void g (sting msg) { Console.WriteLine(msg); } } class B { public void h (MyDelegate m) { m("通过委托传递过来的是方法"+m.Method.Name+",这是调用该方法输出的结果."); } } class Program { MyDelegate gd = new MyDelegate(A.g); // 此后,“gd” 与“A.g” 同等,同一个函数名 A a = new A(); MyDelegate fd = new MyDelegate(a.f); // 此后,“fd” 与“a.g” 同等,同一个函数名 gd("这里是静态方法A.g()的委托gd输出的结果"); //等效于A.g("这里是静态方法A.g()的委托gd输出的结果"); Console.WriteLine(""); fd("这里是对象a的方法f()的委托fd输出的结果"); //等效于a.f("这里是对象a的方法f()的委托fd输出的结果"); Console.WriteLine(""); B b = new B(); b.h(fd); //通过委托将方法a.f传到方法b.h中 Console.ReadKey(); } }}
最终输出的结果是:
这里是静态方法A.g()的委托gd输出的结果
这里是对象a的方法f()的委托fd输出的结果
通过委托传递过来的是方法f,这是调用该方法输出的结果.
委托的声明:
属性 修饰符 delegate 返回类型 委托类型名(参数列表)
属性、修饰符是可选项,可选的修饰符包括new public internal protected private
属性列表和返回类型共同决定了委托能过关连的一组方法。
委托的实例化:
委托对象 = new 委托类型(关联方法);
委托的引用:
在创建委托后,通过引用该对象可以实现对其关联方法的调用,简而言之,就是把委托对象名当作方法名来使用。
委托的组合:
委托作为一种组合,它比C/C++中的函数指针的功能强得多,例如,委托可以做组合。
delegate string MyDelegate(int n);MyDelegate a,b,c,d;//在对a,b,c,d进行赋值后,可以进行下面的运算d = a + b + c; // 委托组合d = d - a ;
这时调用d就是调用其包含的所有委托,并将d的参数值传递给这些委托。如果关联的方法具有返回值,则组合的委托d返回委托列表中最后一个委托的返回值。
10、命名空间
命名空间是C#中一个重要的概念,它为程序逻辑结构提供了一种组织方式。
命名空间的声明:
namespace 命名空间名{ 命名空间成员;}
如果在一个命名空间中访问另外一个命名空间的成员,需通过命名空间名实现: 命名空间名.命名空间成员
命名空间的导入:
using 命名空间名; //相当于java的import
11、is & as
C#中的is操作符与Java中的instanceof操作符一样,两者都可以用来测试某个对象的实例是否属于特定的类型。
在Java中没有与C#中的as操作符等价的操作符。as操作符与is操作符非常相似,但它更富有“进取心”:如果类型正确的话,as操作符会尝试把被测试的对象引用转换成目标类型;否则,它把变量引用设置成null。
比如:两个类:A和B
B b = new B();//不用as,进行强制转换,如果类型不匹配,会引发转换异常A a = (A) b;//使用as,类型不匹配,不会引发异常,会返回一个null,此时 a = nullA a = b as A;12、attribute
13、using
using在c#中有三种用法:
a、引用命名空间
b、创建别名:
e.g.:
using MSWord = Microsoft.Office.Interop.Word;
好处:避免繁琐;解决同一个.cs文件中引用不同命名空间但是类名有相同的问题。
c、强制资源管理
用途:清理非托管资源,不受GC控制的资源。Using结束后会隐式的调用Disposable方法。相当于调用了一个局部的子程序。
check:
14、 List.AddRange 方法
将指定集合的元素添加到 List 的末尾。
命名空间:System.Collections.Generic
程序集:mscorlib(在 mscorlib.dll 中)check: