云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > Microsoft C#编码规范

Microsoft C#编码规范

  • 62 次阅读
  • 3 次下载
  • 2025/5/4 23:55:49

Page 45

?一定不要锁定短暂存在的对象。锁定短暂存在的对象会延长在P/Invoke调用时内存缓冲区的生存期。锁定会阻止垃圾回收器重新分配托管堆内对象内存,或者是托管委托的地址。然而,锁定长期存在的对象是可以接受的,因为其是在应用程序初始化期间创建的,相较于短暂存在对象,它们并不会被移动。长期锁定短暂存在的对象代价非常高昂,因为内存压缩经常发生在第0代的垃圾回收时,垃圾回收器不能重新分配被锁定的对象。这样会造成低效的内存管理,极大的降低性能表现。更多复制和锁定请参考http://msdn.microsoft.com/en-us/library/23acw07k.aspx。

?一定请在P/Invoke签名中将CharSet设为CharSet.Auto,SetLastError设为true。举例,

// C# sample:

[DllImport(\, CharSet = CharSet.Auto, SetLastError = true)] publicstaticexternSafeFileMappingHandle OpenFileMapping(

FileMapAccess dwDesiredAccess, bool bInheritHandle, string lpName);

?您应该将非托管资源封装进SafeHandle类。SafeHandle类已经在可终结类型章节中进行了讨论。比如,文件映射句柄被封装成如下代码:

///

/// Represents a wrapper class for a file mapping handle. ///

[SuppressUnmanagedCodeSecurity,

HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]

internalsealedclassSafeFileMappingHandle : SafeHandleZeroOrMinusOneIsInvalid {

[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] private SafeFileMappingHandle() : base(true) { }

[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] public SafeFileMappingHandle(IntPtr handle, bool ownsHandle) : base(ownsHandle) {

base.SetHandle(handle); }

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success),

? 2016 Microsoft Corporation. All rights reserved.

Page 46

DllImport(\, CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)]

privatestaticexternbool CloseHandle(IntPtr handle);

protectedoverridebool ReleaseHandle() {

return CloseHandle(base.handle); } }

?您应该在调用会设置Win32最后错误代码的 P/Invoked 函数失败时,抛出Win32Exception 异常。如果函数使用了非托管资源,请在finally块内释放资源。

// C# sample:

SafeFileMappingHandle hMapFile = null; try {

// Try to open the named file mapping.

hMapFile = NativeMethod.OpenFileMapping( FileMapAccess.FILE_MAP_READ, // Read access

false, // Do not inherit the name FULL_MAP_NAME // File mapping name );

if(hMapFile.IsInvalid) {

thrownewWin32Exception(); }

... } finally {

if(hMapFile != null) {

// Close the file mapping object. hMapFile.Close(); hMapFile = null; } }

? 2016 Microsoft Corporation. All rights reserved.

搜索更多关于: Microsoft C#编码规范 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

Page 45 ?一定不要锁定短暂存在的对象。锁定短暂存在的对象会延长在P/Invoke调用时内存缓冲区的生存期。锁定会阻止垃圾回收器重新分配托管堆内对象内存,或者是托管委托的地址。然而,锁定长期存在的对象是可以接受的,因为其是在应用程序初始化期间创建的,相较于短暂存在对象,它们并不会被移动。长期锁定短暂存在的对象代价非常高昂,因为内存压缩经常发生在第0代的垃圾回收时,垃圾回收器不能重新分配被锁定的对象。这样会造成低效的内存管理,极大的降低性能表现。更多复制和锁定请参考http://msdn.microsoft.com/en-us/library/23acw07k.aspx。 ?一定请在P/Invoke签名中将CharSet设为CharSet.Auto,SetLastError设为true。举例, // C# sample:

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com