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