﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java征途漫漫-随笔分类-C#</title><link>http://www.blogjava.net/hig/category/17184.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 02:46:04 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 02:46:04 GMT</pubDate><ttl>60</ttl><item><title>C#摘要笔记（一）</title><link>http://www.blogjava.net/hig/archive/2006/11/13/80944.html</link><dc:creator>hig</dc:creator><author>hig</author><pubDate>Mon, 13 Nov 2006 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/hig/archive/2006/11/13/80944.html</guid><wfw:comment>http://www.blogjava.net/hig/comments/80944.html</wfw:comment><comments>http://www.blogjava.net/hig/archive/2006/11/13/80944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hig/comments/commentRss/80944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hig/services/trackbacks/80944.html</trackback:ping><description><![CDATA[
		<p>int a,b;(System.Int32 a, b;)<br />System.Console.WriteLine("a is {0}, b is {1}", a, b); //{0}{1}占位符，对应 </p>
		<p>后面的数据 </p>
		<p>=============================== </p>
		<p>class myClass{<br /> unsafe public static void Main(){<br />  sizeof(int);<br /> }<br />}<br />sizeof进入到内存，以确定变量或数据类型的大小。C#应该避免直接进入内存，所以 </p>
		<p>采用了unsafe关键字(否则编译器报错)。 </p>
		<p>=============================== </p>
		<p>sbyte      byte     (System.SByte,     System.Byte)<br />short      ushort   (System.Int16,     System.Uint16)<br />int        uint     (System.Int32,     System.Uint32)<br />long       ulong    (System.Int64,     System.Uint64)<br />char                 System.Char<br />float                System.Single<br />double               System.Double<br />bool                 System.Boolean<br />decimal   System.Decimal(16字节，精度28位，(1.0～7.9)×10(-28次方) </p>
		<p>=============================== </p>
		<p>int val1 = 2147483647;<br />int val2; </p>
		<p>unchecked   //编译器将不会检查下面大括号中的语句<br />{<br /> val2 = val1+1;<br />} </p>
		<p>================================ </p>
		<p>0000 1101&gt;&gt;2  结果：0000 0011(13右移2位，3) </p>
		<p> </p>
		<p>================================= </p>
		<p>文档注释<br />================================= </p>
		<p>System.Ramdom r = new System.Random();<br />int value = (int)r.next(1,10);  //返回1-9 </p>
		<p>
				<br />在switch中，若多个case对应一条语句，则case中不能有任何语句，否则编译出错。 </p>
		<p>C++中，有语句没有break也是可以的。 </p>
		<p>foreach语句和for语句类似，遍历数组等集合。 </p>
		<p>system.Math.Sqrt(double); </p>
		<p>类也有访问权限的控制，缺省或者public两种。方法也有访问控制，private， </p>
		<p>protected，public，缺省。 </p>
		<p>C#访问静态数据成员时，必须使用类名；而在C++中，访问静态数据成员可以用类名和 </p>
		<p>对象名。<br />C#似乎静态数据成员可以在类中定义赋值；而在C++中，不能如此，必须在.cpp文件中 </p>
		<p>赋值，但是const的int型可以在类中赋值。 </p>
		<p>文件名不必要和应用程序类名相同，而java中二者必须一致。 </p>
		<p>C#中有属性的概念，能够在内中创建面向对象的字段field，属性使用关键子get和set </p>
		<p>来取得和设置变量的值。 </p>
		<p>类的数量非常大，要对其进行组织。将类集中在一起，形成名称空间。名称空间是一 </p>
		<p>组被命名的类。似乎和java的package有类似功效。 </p>
		<p>System.Console.ReadLine(); </p>
		<p>名称空间可以嵌套，System包含了Drawing，Data，Windows.Forms等名称空间，using </p>
		<p>System.Data; </p>
		<p>==================================</p>
		<p>结构是值数据类型，类是引用数据类型，在参数传递时，值类型要进行拷贝，会影响 </p>
		<p>效率。一般数据成员的内存不超过16个字节时，使用结构。 </p>
		<p>结构体<br />Struct point<br />{<br />public int x; <br />public int y; </p>
		<p>public point(int x, int y)<br />{<br />this.x = x;<br />this.y = y;<br />}<br />}<br />point first_point = new point();<br />point second_point = new point();<br />也可以直接不用关键字new，直接point first_point；但class类不能如此。 </p>
		<p>结构只能有带参数的构造函数。<br />如point first_point( = new point()); //new 可不用<br />如point second_point = new point(8,8); //必须用new </p>
		<p>结构没有析构函数。<br />C++中，定义struct和class要用;结束，而C#则没有。<br />================================== </p>
		<p>疑问：局部变量定义没有赋初值，会编译错误。但是在类中的成员变量，没有赋初值 </p>
		<p>却不会报错，默认初始值为0。 </p>
		<p> </p>
		<p>方法中按引用传递，则在数据类型前面加上关键字ref(reference引用)；而C++中为&amp; </p>
		<p>。public static square(ref double x); </p>
		<p>================================== </p>
		<p>以输出方式访问参数<br />public void myMath(double x, out double half, out double squared, out </p>
		<p>double cubde){<br /> half = x/2;   //必须给所有的输出参数赋值，否则编译错误！<br /> squared = x*x;<br /> cubde = x*x*x;<br />} </p>
		<p>
				<br />调用时，必须先定义存储返回值的变量：<br />double xx = 30;<br />double half_return = 0;<br />double squared_return = 0;<br />double cubde_return = 0;<br />调用的过程中，必须声明out(省略了double)：<br />myMath(xx, out half_return, out squared_return, out cubde_return); </p>
		<p>如果定义了输出参数，则可以只定义，不初始化。(一般的变量不初始化会编译错误) </p>
		<p>； </p>
		<p>================================= </p>
		<p>属性存储器方法set，get能够使数据成员为私有的。 </p>
		<p>实例构造函数和静态构造函数，前者每个实例或对象被创建使调用，后者在类的第一 </p>
		<p>个对象被创建之前被调用。<br />构造函数名称与类名一直，访问限定符一般用public，不指定返回类型，用来初始化 </p>
		<p>设置。 </p>
		<p>
				<br />析构函数不使用限定符或者其他关键字。~test();<br />析构函数不一定被执行，常被称作结束器(finalizer)，与一个Finalize的方法有关。<br />C#运行阶段环境通常是在检查是否有内存可供释放前调用析构函数，如果在对象不再 </p>
		<p>使用之后到程序结束之前，没有执行这种内存检查，则析构函数不会被执行。可以强 </p>
		<p>行进行无用单元收集，但这还不如尽量少用析构函数。创建自己的代码进行扫尾工作 </p>
		<p>，显示地调用。 </p>
		<p>不能显示地调用构造函数和析构函数。 </p>
		<p>C++中可以调用析构函数么？(一般都不直接显示调用) </p>
		<p>================================= </p>
		<p>改变枚举的类型<br />enum Color : byte<br />{red, white, blue} </p>
		<p>Color myColor = Color.red; </p>
		<p>(byte)((rnd.NextDouble()*3)); //返回一个介于 0.0 和 1.0 之间的随机数 </p>
		<p>=================================<br />一维数组<br />数组的初始化：<br />decimal[] balance = new decimal[12]{1,2,3,4,5,6,7,8,9,0,0,12};<br />可以不指明数组的大小：<br />decimal[] balance = new decimal[]{1,2,3,4,5,6,7,8,9,0,0,12}; </p>
		<p>指明数组大小，可以不初始化所有元素，下面只初始化前两个元素：<br />decimal[] balance = new decimal[12]{1,2};<br />不指明大小，则以后不能增加元素：<br />decimal[] balance = new decimal[]{1,2}; //只有2个元素 </p>
		<p>=================================<br />多维数组,注意格式和C++/java的区别。<br />1.char[,] letters = new char[2,3]{{'a', 'b', 'c'},{'x', 'y', 'z'}}; </p>
		<p>letters[0].length = 2; letters.GetLength[0] = 2;<br />letters[1].length = 3; letters.GetLength[1] = 3; </p>
		<p>2.数组长度不同的数组<br />char[][] myname =  new char[3][];  //数组长度myname.Length = 3(GetLength)<br />myname[0] = new char[]{'B','r','d','e','y'}; //myname[0].Length = 5<br />myname[1] = new char[]{'L','.'};   //myname[1].Length = 2<br />myname[2] = new char[]{'J','o','E'};  //myname[1].Length = 3 </p>
		<p>如果用myname.GetLength[1]将出错，因为myname的第1维大小不固定；只能将其转换 </p>
		<p>乘一维数组再取长度myname[1].GetLength(0)。 </p>
		<p>1为矩形数组，2为锯齿状数组。2必须用myname[0][1]来引用，如果用myname[0,1]将 </p>
		<p>出错。 </p>
		<p>可以使用类，结构，或其他任何数据类型来创建数组。 </p>
		<p>char[] name = new name[]{'A','B','C'};<br />foreach(char x int name)    <br />{Console.Write("{0}",x);}<br />//遍历数组时，它依次将各个元素称为x，不需要使用name[i],只使用x。 </p>
		<p>=============================== </p>
		<p>方法的特征标，只能是方法参数的个数和类型。<br />方法返回类型不行，也不能一个方法使用数据类型，另一个方法使用数组。<br />int myMethod(int)<br />int myMethod(int [])    //错误！ </p>
		<p>也不能通过关键字params类区分特征标。在一个地方声明下面两个方法将出错：<br />void myMethod(string, float)<br />void myMethod(string, params float[]) </p>
		<p>=============================== </p>
		<p>
				<br />params关键字用于方法参数列表中，声明参数列表最后的值，params关键字与数组一 </p>
		<p>起使用，接受不同数目的参数。<br />public static long Add(params int[] args)<br />{<br />for(int i=0;i&lt;args.Length;i++)<br />{<br />......<br />}<br />} </p>
		<p>Add(1);Add(1,2,3);Add(1,2,3,4,5); </p>
		<p>params可以传递任何数据类型的值。<br />public static long Add(params object[] args) </p>
		<p>long l = 12345678L;<br />decimal d = 123.5M;<br />string str = "abc";<br />Add(l, d, str);Add(d, str, "xyz"); </p>
		<p>==============================<br />Main(string[] args)接受不同个数的命令行参数，参数将被加到字符串数组中。 </p>
		<p>static int x 和局部变量x会产生编译错误。C++和java中不会 </p>
		<p>类中没有指明访问权限，则它是private型。方法和函数之外定义的变量是全局的。C# </p>
		<p>不允许在类外定义变量。 </p>
		<p>一个类中成员变量和成员函数全部是静态的，则没有必要创建它的对象。可以用 </p>
		<p>private构造函数在阻止创建对象。 </p>
		<p>==============================<br />使用using namespace之后，可以避免使用全限定名称。<br />using System;<br />Console.WriteLine("aaa");<br />放在程序清单开始位置，在其他地方会编译出错。 </p>
		<p>使用using给名称空间甚至是类提供别名。<br />using doit System.Console;<br />doit.WriteLine("aaa"); </p>
		<p>=============================== </p>
		<p>
				<br />Static int x = 100;<br />再定义一个局部变量int x = 10;<br />后面用的时候，会出现冲突。但C++和java都可以局部变量优先使用。 </p>
		<p>try{}catch{} //catch后面不加任何参数，可以捕获所有异常。而BCB中catch(...)是 </p>
		<p>捕获所有异常。 </p>
		<p>try{}catch(System.Exception e){} //将异常作为参数接受，确定是哪种异常 </p>
		<p>一个try可以对应多个catch语句。前面捕获较具体的异常IndexOutOfRangeException </p>
		<p>，后面捕获较通用的异常Exception。如果颠倒将出错，后面具体的异常语句不会被执 </p>
		<p>行。 </p>
		<p>finally无论是否存在异常，是否有catch捕获都将被执行 </p>
		<p>System.IO<br />FileStream fs = new FileStream(args[0], FileMode.Open);<br />StreamReader sr = new StreamReader(fs);<br />sr.ReadLine(); </p>
		<p>throw抛出异常。throw (exception);throw exception;括号可有可无。 </p>
		<p>自定义异常类<br />class myException : Exception<br />{<br />public myException(){}<br />public myExcepiton(string e):base(e){}<br />public myExcepiton(string e, Exception inner):base(e, inner){}<br />} </p>
		<p>在方法1中有try catch 语句，方法2调用它也要知道发生异常，则方法1中必须重新引 </p>
		<p>发异常catch(Exception e){ throw(e); } </p>
		<p>checked,unchecked可以用作语句[un]checked{//statements}<br />或者用作运算符[un]checked(expression),其中要检查的表达式被放在()中(没有试验 </p>
		<p>通过)。 </p>
		<p>================================= <br /></p>
<img src ="http://www.blogjava.net/hig/aggbug/80944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hig/" target="_blank">hig</a> 2006-11-13 17:53 <a href="http://www.blogjava.net/hig/archive/2006/11/13/80944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>