??xml version="1.0" encoding="utf-8" standalone="yes"?> 代表主要有两个用途,一个是回调Q另一个是事g处理。对于回调,代表像是用typedef定义了一个指向函数的指针。代表需要用new来生,代表也可以在形式上类gc那P来定义个该代表的对象Q也可以作ؓ对象作ؓ函数参数q行传递?/p>
nested loop的意思是嵌套循环Q经常看到nestedq个词,但一直不知道啥意思,现在ȝ知道了?/p>
U程部分Q?br />
在System.Threading名空间中定义Q?br />
创徏U程不必要利用到一个ThreadStart的代表,该代表来指定一个方法,q一Ҏ是U程执行的函CQ?br />
启动U程用StartQ?br />
休眠U程用SleepQ?br />
?NET中,U程可以越q程的界限,讉K其他q程中的U程Q?br />
U程挂v有Sleep(0)和Suspend两种ҎQ第一U方法直到其他线E调用该U程的Interrupt来中断这U挂L态,W二U方法会直到其他U程调用该线E的Resume才能恢复挂v的状态; .NET中用MonitorcdCcM于信号量的机制来对代码块q行串行化的讉K?br />
Monitor.Enter(this); C#中用lock实现了类似Monitor的功能,使用Ҏ如下Q?br />
lock(this) 可以通过Mutex来实现同步,使用Ҏ如下Q?br />
在类中定义一个成员变量:Mutex mutex=new Mutex(false);//q里用false表示此刻q不希望锁定?br />
在用时Q可以这P C#中用is代替Java中instanceof关键字?/p>
C#中typeof和Type.GetType函数{同?/p>
C#中的Ҏ,首先它是一个派生于System.Attribute的类Q而且在类命名的时候,通常都以Attributel尾。定义一个特性就是普通的定义一个类。用特性时Q用一对中括号包含一个该Ҏ定义的实例Q然后放在方法前、类前、字D前卛_。如Q?br />
我们定义了一个RegistryKeyAttribute的特性,然后使用时就可以Q?br />
[RegistryKey(34,"Foo")]//注意在引用时可以省略AttributeQ系l会为其自动d?br />
public int foo; C#中,可以使用名字隐藏(name hiding)技术,该技术主要应用于当一个类实现了某个接口时Q如果我们用该类的一个实例来“?#8221;一下的话,那么应该可以看到被实现的q个接口中的所有内容,Z不让外界看到接口中的内容Q那么可以用该技术。该技术用的具体Ҏ是在实现接口中的Ҏ时去掉public关键字,改用接口名字代替。例如:本来应该是public void run(){}现在改ؓvoid Runnable.run(){}使用q种办法可以解决“同时实现多个接口Ӟ当不同接口中存在同样的函数时Q生的名字模糊问题”Q比如A和B接口都有funҎQ那么在一个类同时实现A和B接口Ӟ可以q样写代码:void A.fun(){...} 在C#中可以定义基于普通数值类型的enumcdQ例?br />
enum Test : int C#中的switch语句中不允许“贯行<fall-through>”Q即当一个case情况满Ӟ如果该case没有break语句Q那么就会自动执行下一个case对应的语句,在C#中把贯行l取消了Q而在java中还是保留了贯行的?/p>
C#中也可以定义q算W重载,对于普通运符重蝲Ӟ相对于一般的函数定义Q我们只需要把“函数?#8221;替换?#8220;operator<某运符>”卛_Q例如:public static String operator+ (String s1,String s2)。比较特D的是定义强制类型{换运符Q它的定义Ş式如下:
销毁线E用Abort?br />
一个典型例子:
class A
{
public static void fun()
{
Console.WriteLine("Another Thread is running!");
}
public static void main()
{
ThreadStart t=new ThreadStart(fun);
Console.WriteLine("Main Thread is running!");
Thread thread=new Thread(t);
thread.Start();
Console.WriteLine("...");
}
}
代码?br />
Monitor.Exit(this);
{
代码?br />
}
mutex.WaitOne();
代码?br />
mutex.Close();
]]>
然后可以检该cȝ该属性是否具有RegistryKeyAttributeҎ了?br />
C#中用特性主要是Zd注释Qƈ把注释的信息捆绑到类上,在运行的时候就可以通过反射的机制来得到q些注释信息了,q点可以cL于Java中的Annotation?/p>
void B.fun(){...}而在使用Ӟ可以q样((A)cȝ一个对?.fun();q样调用的就是对接口A中funҎ的实现?/p>
{
One=1;
Two,
Three
};
public static implicit operator conv-type-out (conv-type-in operand)
public static explicit operator conv-type-out (conv-type-in operand)
q里的implicit?#8220;不需要客L昑ּ的给出,它会自动q行”Qexplicit指的?#8220;客户端必L式的指出需要{换的cd”。例如:
public static implicit operator float (String s)
最后,q需要提醒注意的是,对于q算W重载,必须都定义ؓpublic staticQ这一点必M证?/p>
Student s= p as Student;
Console.WriteLine("p={0}", c==null ? "null" : c.ToString());
cȝ成员包括Q字D;ҎQ属性(字段Q;帔RQ烦引器Q智能数l)Q事Ӟ操作W重载?/p>
C#中对于类中定义的字段Q如果前面不加限定符Q则默认为private?/p>
C#中和Java一P对于字段或方法的定义Q都是在每一个前面都要加限定W!
C#中多了一个internal限定W,表示该成员只在当前编译单元内可见Q根据代码所在的位置Q访问限定符“internal”代表?#8220;public”?#8220;protected”的访问性组合?/p>
C#中调用基cȝ构造函数用base而不是superQ而且调用位置也不同于JavaQ还是承了C++的传l写法,如:
public B(int x) : base(x)
C#中readonly关键字和Java中的final差不多,都是定义帔R用的Q但是它定义的常量可以在构造函数内初始化,而const定义的常量只能在定义时初始化。如果再用static限定Q那么也可以在static块中初始化?/p>
C#中用限定W?#8220;sealed”来禁止一个类z子类Q和Java中的final关键字修C个类时的作用一栗?/p>
C#中用ref和out两个关键字来使得函数参数可以带回q回倹{ref和C++中用“&”定义的引用一P如:
public void change(ref int x,ref int y){
int tmp=x;
x=y;
y=tmp;
}
在调用时也得change(ref x,ref y);但需要注意的是,x和yq两个变量必被事先初始化?/p>
使用outӞ׃必初始化了,使用Ҏ同ref。关键是要区别什么时候用ref什么时候用out。其实刚才在上面丄例子Q一定要用refQ因个函数在处理旉要用到参数已有的值来交换Q如果没有初始|那还交换个什么劲儿啊Q而如果我们只是希望通过函数调用带回来一些信息给我们使用Q也是惛_现多q回|仅仅Z此目的且函数处理中不必利用参数的初始|那么应该用out?/p>
C#中用“params”关键字来使得Ҏ的参C数可变,相当于在Java里定义函数时使用...效果一栗如Q?br /> public int sum(params int[] x)。但必须定义为数l类型。而在Java中这样就行:public int sum(int ... x)
C#中函数覆盖时Q必ȝ关键字new来修饎ͼ否则A.max()和B.max()各调用各自的Q谁也不q涉谁(q里Bz自AQ?/p>
C#中要实现多态,必须在基cd义函数时用关键字virtual修饰Q在子类中覆盖函数时用override修饰。而且被virtual修饰的基cd数还不能是private的,因ؓ它对子类不可见?/p>
C#中定义抽象类或抽象方法,也都是用abstract关键字声明,但是在子cd现时必须用override关键字修饰要实现的抽象函数?/p>
C#中可以用foreach(int tmp in x)来实现类似Java中for(int tmp : x)的功能?/p>
C#中用get和set关键字来得到、设|类的属性,q期间还会用到关键字value。D个例子如下:
protected string zipCode;
public string ZipCode
{
get
{
return zipCode;
}
set
{
zipCode=value;
}
}
q里ZipCode是一个属性名Q可以随便v名字Q但是ؓ了和字段相匹配,我们l它起名?#8220;ZipCode”。在使用时就得这P
Address addr=new Address();
addr.ZipCode="55555";
string zip=addr.ZipCode;
C#中不能够在类中定义对象的时候就用new为其赋|Q!Q!
C#中定义多l数l用int [, ,] x;多维数组得到某一l的长度用x.GetLength(W几l?;查询多维数组的维数用x.Rank;
C#中用int [][] x;来定义二l的“锯状数l?#8221;Q这同Java是一LQ这U锯齿状数组当然包括常规的二l数l了Q但是在Java中ƈ没有对它们进行区分?/p>
================索引?===============
单说来,所谓烦引器是一cȝD的属性,通过它们你就可以像引用数l一样引用自qcR?
声明Ҏ如下(与属性相?Q?
//修饰W cd名称 this [cd名称 参数名]
public type this [int index]
{
get
{
//...
}
set
{
//...
}
}
用例子简单说明:
using System.Collections;
static void Main(string[] args)
{
//调用IntBits.IntBitsҎQ意为将63赋给bits
IntBits bits = new IntBits(63);
//获得索引6的bool|此时 bits[6]调用烦引器"public bool this[int index]"中的GetQgؓTrue
bool peek = bits[6];
Console.WriteLine("bits[6] Value: {0}",peek);
bits[0] = true;
Console.WriteLine();
Console.ReadKey();
}
struct IntBits
{
private int bits;
public IntBits(int initialBitValue)
{
bits = initialBitValue;
Console.WriteLine(bits);
}
//定义索引?
//索引器的“属性名”是thisQ意思是回引cȝ当前实例Q参数列表包含在Ҏ可非括号之内?
public bool this [int index]
{
get
{
return true;
}
set
{
if (value)
{
bits = 100;
}
}
}
备注:
所有烦引器都用this关键词来取代Ҏ名。Class或Struct只允许定义一个烦引器Q而且L命名为this?
索引器允许类或结构的实例按照与数l相同的方式q行索引。烦引器cM于属性,不同之处在于它们的访问器采用参数?
get 讉K器返回倹{set 讉K器分配倹{?
this 关键字用于定义烦引器?
value 关键字用于定义由 set 索引器分配的倹{?
索引器不必根据整数D行烦引,由您军_如何定义特定的查找机制?
索引器可被重载?
索引器可以有多个形参Q例如当讉K二维数组时?
索引器可以用百数g标,而数l只能用整C标:如下列定义一个String下标的烦引器
public int this [string name] {...}
属性和索引?
属性和索引器之间有好些差别Q?
cȝ每一个属性都必须拥有唯一的名Uͼ而类里定义的每一个烦引器都必L有唯一的签名(signatureQ或者参数列表(q样可以实现烦引器重蝲Q?
属性可以是staticQ静态的Q而烦引器则必L实例成员?
为烦引器定义的访问函数可以访问传递给索引器的参数Q而属性访问函数则没有参数?/p>
不能用using指定c,但可以ؓcM用别名:
using alias=class
C#命名规范Q?br /> Ҏ名用第一个字W大写的Pascal规则Q?br /> 变量名用第一个字W小写的camel规则?/p>
公共cdpȝCTS(Common Type System)是在.NET中定义的cd标准Q而且q支持用戯定义新的cd来进行类型的扩展。Q何以.NET为^台的语言都必d立该语言的数据类型到CTScd之间的映。所?NET语言׃nq一cdpȝQ实现各U语a之间的无~的互操作?/p>
装箱(boxing)与开?unboxing)Q?br />
装箱是数值类型{换ؓ引用cdQ此q程不需要显C{换?br />
如int foo=42;object bar=foo;
开就是将引用cd转换为数值类型,此过E必LC{换?br />
如int foo2=(int)bar;
通过装箱与开׃得C#中的一切开h都是对象Q但同时又避免了当所有一切都是真正的对象时对pȝ要求q高?/p>
引用cd都是在堆上分配的?/p>
⑴浅复制Q浅克隆Q?br />
被复制对象的所有变量都含有与原来的对象相同的|而所有的对其他对象的引用仍然指向原来的对象。换a之,复制仅仅复制所考虑的对象,而不复制它所引用的对象。另解:复Ӟ两个或多个相同类型的指针指向相同的内存,也就是它们指向相同的数据Q如果改变其中之一Q其它的也将改变?br />
⑉|复制Q深克隆Q?br />
被复制对象的所有变量都含有与原来的对象相同的|除去那些引用其他对象的变量。那些引用其他对象的变量指向被复制q的新对象,而不再是原有的那些被引用的对象。换a之,深复制把要复制的对象所引用的对象都复制了一遍。另解:深复Ӟ一个指针所指的数据复制l另外一个指针所指的内存Q两个指针有自己的数据,如果改变一个,另外的不受媄响?/p>
.NET框架由基cdBCL(Basic Class Library)和公paq行环境CLR(Common Language Runtime)两部分组成。BCL相当于MFCQ来提供装好的cdQ该cd提供了从文gI/O、数据库到XML、SOAP{各个方面的支持QCLR可以cLJVMQ来提供q行的^台?/p>
?NET框架中,出现了许多新的特性和功能Q这些功能都是通过~译器对能够体现q些功能和特性的代码的编译来完成的,众所周知?NET兼容了很多种语言Q但?NET~译器小lƈ没有为每U语a都设计了_完整的对新特性的~译支持Q他们只实现那些他们觉得对用h有用的功能。但是,C#提供了访问几乎所?NET框架功能的接口?/p>
C#是一U与CLS标准兼容的语aQ用C#~写出来的代码,l过~译Q生成MSIL中间代码写入EXE文gQ在q行时由JITerMSIL代码~译为CPU识别的机器码Q进而执行程序?br />