??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
1Q概念:对于树中的每个节点nQ其左子节点中保存的所有数值都于n保存的数|叛_节点保存的数值都大于n保存的数倹{?/p>
2Q二叉查找树可以实现更ؓ优越的查找性能Q主要实现方式有数组和链表结构,相比较而言Q链表实现更为容易,因ؓ数组实现删除和添加功能需要移动数l元素(如填补删除空位等Q?/p>
今天下午在打印问题搞定后用C#实现了一下,比java版本比较有趣的用C#的delegate来代曉K历二叉树时的visitҎQ这样一来可以在遍历时对节点q行你所惌的Q何操作。我们知道C#的delegate是类型化的函数指针,而C++的函数指针可以模仿动态语a的闭包或者匿名函数。这里也有这L味道?br>
代码如下Q只实现了整数型的,节点定义Q?br>
可以看到QC#的delegate机制非常有趣Q如果在java中恐怕需要用inner class来实C?br>
问:
打扰一下,请问MarshalByRefObject中的"Marshal"应该怎样理解Q?/span>
回复Q?/span>
按照package的意思理?/span>—?/span>当一个对象需要长途跋涉到另一个环境中Ӟ需要将?/span>marshal成一个可以传输的形态(比如?/span>.NET Remoting中对象将被打包成一?/span>serializable?/span>ObjRef实例—?/span>q个ByRef是?/span>ObjRefq种形态)Q同理,当打包以后传输到目标地点Q还要执?/span>unmarshal的操作将其还原ؓ内存中的对象。:Q?/span>
问:
谢谢Q?/span>
MarshalByRefObject是不是可以这L解:对被引用的对象进?/span>Marshal。如果按?/span>package的意思理解,?/span>package的过E是怎样的?
MSDN上这栯Q?/span>
MarshalByRefObject是通过使用代理交换消息来跨应用E序域边界进行通讯的对象的基类.
MarshalByRefObject对象在本地应用程序域的边界内可直接访问。远E应用程序域中的应用E序首次讉KMarshalByRefObjectӞ会向该远E应用程序传?/span>代理。对该代理后面的调用封送回ȝ在本地应用程序域中的对象?/span>
?/span>Marshal中,上面所说的代理是什么?有什么用Q?/span>
MSDN上还讲到Q?/span>
当跨应用E序域边界用类型时Q类型必L?/span>MarshalByRefObjectl承的,而且׃对象的成员在创徏它们的应用程序域之外无法使用Q所?/span>不得复制对象的状?/span>?/span>
既然对象的状态不能传递过去,那传递这个对象又有何意义Q?/span>
W一ơ去理解MarshalByRefObjectQ有的问题可能提的比较肤,h指点?/span>
回复Q?/span>
MarshalByRefObject是所有可以在AppDomain边界外部讉K的对象的基类Q重心不?/span>marshalQ而是objectQ即object that could be marshaled by referenceQ也是可以通过RefQ实际上?/span>ObjRef对象Q的机制q行?/span>?/span>?/span>Q?/span>MSDN中文版对marshal一词的译Q的对象。封送的行ؓ是由代理来做的,q里说的代理是我文章中讲过?/span>.NET Remoting的真实代理(?/span>RemotingProxyQ。真实代理不是有一?/span>Invoke()Ҏ吗?当你透过对一?/span>MBRO的透明代理讉K该对象的ҎӞ透明代理把Z堆栈的方法调用{换ؓҎ调用消息Q?/span>IMethodCallMessageQƈ转发l真实代理(?/span>Remoting的场合中也即RemotingProxyQ,?/span>RemotingProxy的Q务就是把对象送ƈq同Ҏ调用消息一赯{发给q程应用E序域;到达目的C后的操作cMQ远E应用程序域中的监听方当收到发来的方法调用消息时Q先取出送好?/span>ObjRefQ这个对象里面保存着发来调用的那个对象!Q,其l封Q?/span>unmarshalQؓ本地的对象,q获得其透明代理Q然后就可以把方法调用消息在转换回基于堆栈的调用发送给q个对象?/span>
对象是在本地l护的,但是Ҏ可以在远E调用。你比如说一?/span>web应用E序Q你是通过本地的浏览器q程讉Kq个应用E序Q但是应用程序的状态不会由你的览器负责(所以你只是在访问这个应用程序提供给你的功能而已Q你q没于拥有应用程序本w,包括其所有数据)Q你只是发送一个个的请求,服务器告诉你处理的结果。在Remoting?
也是一P当你获得一个远E对象的时候,你实际上只拥有对q个对象的一个远E引用,虽然你可以调用它的方法,但实际上q些操作都是发生在远E的Q就是前?
讲过的过E)Q你只是传入了一些参敎ͼ得到了一个结果,但对象的状态还是在q程l护的(换句话说Q对象本w也是对象的所有状态ƈ没有被往q传递,传递的
只是传入传出的参?/span>—?/span>当然Q如果参数是一?/span>MBRO的话Q还是传递对象被送的引用Q?/span>
也许应该l你准备一个好理解的例?/span>…?/span>你就会豁然开朗了。:Q?/span>
问:
我这L理解对不对?
一般的对象与从MarshalByRefObjectl承的对象区别是Q?/span>
一般的对象只能在本地应用程序域之内被引用,?/span>MarshalByRefObject对象可以跨越应用E序域边界被引用Q甚臌q程引用?/span>
回复Q?/span>
Exactly! 当对象跨?/span>AppDomain边界的时候,实际上只是它的一个引用(ObjRefQ。你比如说吧Q?/span>
public class LocalObject
{
public void CallRemoteObject(MarshalByRefObject mbro)
{
Console.WriteLine(mbro.ToString());
}
}
l过q样的一番扩展,我们对一个资源的 CRUD 操作可以通过同一?URI 完成了。需要注意的是REST的核心就是资源(resourcesQ这个概c我们所说的webservice是一U徏立在http协议上的q程调用Q而REST是把远E调用抽象成对远E资源的CRUD的操作,正好可以用HTTP的PUT GET POST DELETE来对应,而不是重新发明一个协议(比如soapQ简单对象访问协议)。REST与AJAX的流行,甚至q至设计模式的兴P都充分说明一个现象,在成熟的应用的基上创新而非扩展出复杂所谓“创新性”架构在软g行业是更为可靠?/p>
实战体验REST可以从IBM Developer的这文章开始?a >跨越边界QRest On Rails》。这文章是在Rails1.2发布之前出来的,有些地方已经可以修改的更l,我把我的l习q程记录下,q添加了C#调用REST风格web service的例子?/p>
首先Q你的机器上需要安装rails1.2Qƈ且假设你对rails有基本的了解Q徏立一个应用叫service,命o行执行:
rails自动帮你生成应用的基本结构和基础代码Q然后编辑config下面的database.yml讄数据库,q徏立数据service_developmentQ我用的是mysql数据库?/p>
利用rails1.2新的scaffold命oQ?/p>
q个命o自动生成ActiveRecord,Controller以及ViewQ在\app\models下可以发现自动生成的Model——person.rb。打开service\db\migrate下面?01_create_people.rbQ编辑如下:
· 对于所?/span>simple-typesQ?/span>默认值是其所有位都置零的位模式所形成的?/span>Q?/span>
o 对于sbyte?/span>byte?/span>short?/span>ushort?/span>int?/span>uint?/span>long?/span>ulongQ?/span>默认gؓ0?/span>
o 对于charQ?/span>默认gؓ'\x0000'?/span>
o
对于floatQ?/span>默认gؓ
o 对于doubleQ?/span>默认gؓ0.0d?/span>
o
对于decimalQ?/span>默认gؓ
o 对于boolQ?/span>默认gؓfalse?/span>
· 对于enum-typeEQ?/span>默认gؓ0?/span>
· 对于struct-typeQ?/span>默认值是通过所有值类型字D设|ؓ它们的默认倹{将所有引用类型字D设|ؓnull而生的倹{?/span>
3.C#中有所谓的单类型概念(simple typeQ,cM于java的基本类型,但又不同QC#的简单类型本质上都是l构cdQ预定义集合的结构类型)Q所以还是值类型,?span class="Codefragment">System.ValueTypel承而来。C#的简单类型包括:保留?/span> | 化名的类?/span> |
sbyte | System.SByte |
byte | System.Byte |
short | System.Int16 |
ushort | System.UInt16 |
int | System.Int32 |
uint | System.UInt32 |
long | System.Int64 |
ulong | System.UInt64 |
char | System.Char |
float | System.Single |
double | System.Double |
bool | System.Boolean |
decimal | System.Decimal |
1.引用cd是类cd、接口类型、数l类型或委托cd?/span>
2.cȝ型:包括预定义的cȝ型和用户通过class关键字的自定义类cd
3.对象cdQ?/span>
objectcȝ型是所有其他类型的最l基cR?/span>C# 中的每种cd都是直接或间接从objectcȝ型派生的?/span>
关键?/span>object只是预定义类System.Object的别名?/span>
4.stringcd:cȝ?/span> | 说明 |
System.Object | 所有其他类型的最l基cR?/span> |
System.String | C# 语言的字W串cd?/span> |
System.ValueType | 所有值类型的基类?/span> |
System.Enum | 所有枚丄型的基类?/span> |
System.Array | 所有数l类型的基类?/span> |
System.Delegate | 所有委托类型的基类?/span> |
System.Exception | 所有异常类型的基类?/span> |
sealed class T_Box: System.ValueType
{
T value;
public T_Box(T t) {
value = t;
}
}