C#中句柄的问题,到现在还不是很明白,谁能用比较通俗的语言说一下,谢谢!
3个回答
展开全部
句柄(HANDLE)不是C#中的概念,而是win32 API中的。
C#中常通过DllImport的的方式获取窗体或其它对象的句柄。
句柄可以理解为用于标识内存中的一个“资源”,这些资源如:文件(file)、内存块(block of memory)、菜单(menu)、控件(control)、窗体(window)等等。操作系统通过句柄来定位核心对象和系统资源。
有些人会认为句柄就是指针,其实句柄与C/C++中的指针是完全不同的两个概念。句柄仅仅是一个32位整数,在WIN32中用于管理某个系统或进程的对象,可以理解为对象的“索引”(相当于公民的身份证(ID)一样,一个身份证标识唯一一个对象),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“指向对象的地址”。
而指针则要相对直观一些,它直接对应着一个数据在内存中的地址,得到了指针就可以自由地修改该地址中的数据。Windows系统为了安全起见,并不希望普通程序轻易修改其内部数据结构,所以Windows给每个使用GlobalAlloc等函数声明的内存区域注册登记一个句柄,平时你只是在调用API函数时利用这个句柄间接访问某个内存区域。
C#中常通过DllImport的的方式获取窗体或其它对象的句柄。
句柄可以理解为用于标识内存中的一个“资源”,这些资源如:文件(file)、内存块(block of memory)、菜单(menu)、控件(control)、窗体(window)等等。操作系统通过句柄来定位核心对象和系统资源。
有些人会认为句柄就是指针,其实句柄与C/C++中的指针是完全不同的两个概念。句柄仅仅是一个32位整数,在WIN32中用于管理某个系统或进程的对象,可以理解为对象的“索引”(相当于公民的身份证(ID)一样,一个身份证标识唯一一个对象),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“指向对象的地址”。
而指针则要相对直观一些,它直接对应着一个数据在内存中的地址,得到了指针就可以自由地修改该地址中的数据。Windows系统为了安全起见,并不希望普通程序轻易修改其内部数据结构,所以Windows给每个使用GlobalAlloc等函数声明的内存区域注册登记一个句柄,平时你只是在调用API函数时利用这个句柄间接访问某个内存区域。
展开全部
句柄是Windows系统中的一个概念,是一种唯一标识的机制,这么给你举个例子吧。
你去超市时,携带有东西,就需要把东西寄存在超市,这时,服务员会给你一个号牌,把你的包放在里面,购物结束时,你把号牌还给服务员,取回你的包。
这个“号牌”就和句柄有非常相似的地方:
1,它用来唯一标识你的物品;句柄用来唯一标识一个被装入内存的“资源”,任何相对独立的东西被装入内存时,都会被分配一个句柄;
2,你不需要关心这个“号牌”的值究竟是多少,你只需要将它交还服务员,服务员会替你找到你的包;同理,你不需要关心系统给你分配的“句柄”究竟是多少,你只需要把它保存下来,需要时,将“句柄”传给需要的函数,系统就会替你找到句柄标识的“资源”;
3,不同的时候去超市,服务员给你分配的“号牌”是不同的;同理,不同的时候运行同一个程序,系统分配的“句柄”也是不同的(当然,也有一些例外,系统每次都会在固定的位置装载一些自身的特定程序,比如“桌面”,类似于超市的“内部专柜”);
4,在你不用“号牌”的时候,你需要将它交还服务员,也就是“释放”,以供别人使用;同理,在不再使用句柄的时候,需要调用CloseHandle关闭打开的句柄,当然,在C#中不用担心这个问题,这个过程会自动完成;
5,扩展一点说,“句柄”在数值上等于“资源”被装入内存的始地址,前面已经说过,它的值是多少,并没有多大的意义,只是方便你理解。这一点也和“号牌”很相似,号牌在数值上等于柜子的开始位置。
你去超市时,携带有东西,就需要把东西寄存在超市,这时,服务员会给你一个号牌,把你的包放在里面,购物结束时,你把号牌还给服务员,取回你的包。
这个“号牌”就和句柄有非常相似的地方:
1,它用来唯一标识你的物品;句柄用来唯一标识一个被装入内存的“资源”,任何相对独立的东西被装入内存时,都会被分配一个句柄;
2,你不需要关心这个“号牌”的值究竟是多少,你只需要将它交还服务员,服务员会替你找到你的包;同理,你不需要关心系统给你分配的“句柄”究竟是多少,你只需要把它保存下来,需要时,将“句柄”传给需要的函数,系统就会替你找到句柄标识的“资源”;
3,不同的时候去超市,服务员给你分配的“号牌”是不同的;同理,不同的时候运行同一个程序,系统分配的“句柄”也是不同的(当然,也有一些例外,系统每次都会在固定的位置装载一些自身的特定程序,比如“桌面”,类似于超市的“内部专柜”);
4,在你不用“号牌”的时候,你需要将它交还服务员,也就是“释放”,以供别人使用;同理,在不再使用句柄的时候,需要调用CloseHandle关闭打开的句柄,当然,在C#中不用担心这个问题,这个过程会自动完成;
5,扩展一点说,“句柄”在数值上等于“资源”被装入内存的始地址,前面已经说过,它的值是多少,并没有多大的意义,只是方便你理解。这一点也和“号牌”很相似,号牌在数值上等于柜子的开始位置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个人总得需要一个简单一点的名字,方便别人称呼啊,一个地方也总得有个地址方便大家说啊,多吧
你就这样理解好了
你就这样理解好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询