C#摘要笔记(一)

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),其中要检查的表达式被放在()中(没有试验

通过)。

=================================

你可能感兴趣的:(C#摘要笔记(一))