最近忙着学习ASP.net(C#),对于其中的一些基础知识的学习感悟,觉得很有意思,也想和大家分享一下。
学习.framework的时候,请注意以下几个基本概念:
1、什么是值类型数据,什么是引用类型数据?
2、将以下数据类型分类(值类型或者引用类型)
数值,数组,类,接口,枚举,结构
3、什么是装箱,什么是拆箱?在就用时,我们应该尽量注意一些什么?
4、下面的代码片段有几次装箱几次拆箱,分别是在什么在方?
int i=10;
object o=i;
Console.Write("{0}",(int)o);
5、
string m_str1="hello";
string m_str2="hello";
m_str1.Euqels(m_str2);返回true还是false;
最近学习的东西太多了,而且在实际的应用与理论上差的好远,有时候明明知道这样做效率不高,也明明知道这样做可能会出问题,可在开发的过程中,还中保留一些基础的方法与概念,让效率差了好多。
以上的这些基本概念在实际的应用中可以很多程度上避免一些奇怪的问题,一在定程度上也可以提高新效率,也可以知道如何把代码优化。
新的知识点: 代理与指针及因回调函数。 看了好几本书讨论代理(delegate) 1、有些书上说它与C++的函数指针很相近,可惜很难理解它是怎样工作的。 2、又有书上说它是一种数据结构,也就是类似于class一样的东西。而实际上也确实如此。 分析这样的例子: public class Sample {
delegate void Clacuate(int m_num1,int m_num2);
public static void Main() { Clacuate m_cla = new Clacuate(Sum); m_cla(1,2); }
static void Sum(int m_num1,int m_num2) { Console.WriteLine("{0}",m_num1+m_num2); } } 在ILDASM里的结果: .method public hidebysig static void Main() cil managed { .entrypoint // Code size 22 (0x16) .maxstack 3 .locals init ([0] class Sample/Clacuate m_cla) IL_0000: ldnull IL_0001: ldftn void Sample:m_um(int32, int32) IL_0007: newobj instance void Sample/Clacuate::.ctor(object, native int) IL_000c: stloc.0 IL_000d: ldloc.0 IL_000e: ldc.i4.1 IL_000f: ldc.i4.2 IL_0010: callvirt instance void Sample/Clacuate::Invoke(int32, int32) IL_0015: ret } // end of method Sample::Main
可以看到,.locals init ([0] class Sample/Clacuate m_cla) 代理的实际工作方式,在IL里是以类的方式处理的,所以我们有这样的代码: Clacuate m_cla = new Clacuate(Sum); 这样的语法不就是对引用类型的数据吗? 因此,我们可以把代理分在引用类型数据上。
关于回调函数(windows平台下的重要方法)。 而实际上IL里也采用了这一方法,只是它用的有些隐避。 上面的例子,如果我的实现函数Sum不在同一个类里,而是在其它的类中实现,那么,程序在编译sample类时,就不知道代理的实现函数是什么,它只能通过代理在决定在编译时函数的引用是否正确。 因此也有书上说代理就是一种函数的申明(而真正的函数定义可能在其它类里,也有可能在其它程序集里)。 如果在事件上加载了代理(实际上代理就是为了与事件一同工作的)。那么就构成了widows平台下,典型的回调结构。
文章来源:http://computer.mblogger.cn/wucountry/posts/48124.aspx
|
请发表评论