1. using(MyClass obj = new MyClass()) { // code here } 只要MyClass支持IDisposable接口,那么程序执行到闭花括号时,会自动调用MyClass.Dispose()方法撤销对象 using作为语句,用于定义一个范围,在此范围的末尾将释放对象. 2. System.Diagnostics.Stopwatch提供一组方法和属性,可用于准确地测量运行时间 3. c#不支持不定长数组,可以用list的ToArray方法转换 4. Environment.ProcessorCount可以获得机器处理器个数 5. 224.0.0.0 到 239.255.255.255间的ip用于多组发送,255ip如192.168.100.255用于同子网广播 6. BitConverter可以做byte[]和其他类型的格式转换,Encoding可以做string等和byte[]的编码转换 7. Buffer.BlockCopy可以用于byte数组拷贝 8. 计算MD5:MD5 md5 = new MD5CryptoServiceProvider(); md5.ComputeHash(filestream);再将返回的字节数组转成16进制字符串就ok了。 9. ip和端口完全相同时才能连接成功,如果本机启动时监听的地址不是127.0.0.1而是外部IP,那么连接127.0.0.1时会报目标机器积极拒绝,只有连接外部地址,才能连接成功. netstat -n命令可以查看已绑定的ip和端口 10.程序中同时有2.0和4.0的dll时,在app.conf的startup节点增加一个属性,就可以兼容了。 同时在程序发布时,还需要发布*.exe.config文件,该文件就是app.conf的内容,看样子,c#的配置文件是外挂方式,而非内嵌。 11.tasklist /m命令可以在控制台列出程序加载的所有dll信息 tasklist /m | more 12.控件的dock属性设置为fill时,如果和其他控件(例如dock=top或left)有重叠,将控件设为最顶层可以解决 13.vc2012调用gdal需要链接C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86\odbccp32.lib和C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86\odbc32.lib两个odbc库 14.ComponentDocumentDesigner和ComponentDesigner的区别:前者用于控制继承类的design页面,后者用于在应用这个组件时控制右键菜单。 ParentControlDesigner和ComponentDesigner的区别:前者放到form上可显示组件UI,后者没有组件UI,只能在最下面显示一个图标,像backgroundworker那种无界面组件的UI图标。 15.oracle查询空间索引的sql:select * from user_sdo_index_info t 16.(float[])Convert.ChangeType(nData, typeof(float[]))可用于将泛型T[] nData转换为指定类型float[]。 17.usercontrol在设计模式下,即DesignMode==true时(组件被用于vs设计窗口里时),application.startuppath是ide程序所在目录,不是代码所在目录。设计属性时需要注意区分。 18.[EditorBrowsable(EditorBrowsableState.Never)]可以使属性不出现在IDE的编码上下文提示列表里,但直接写的话仍然可以正常访问,[Browsable(false)]使属性不出现在属性窗口。 19.等待多个子线程结束可以使用ManualResetEvent数组和WaitHandle.WaitAll(manualEvents)方法,参见msdn中“WaitHandle..::.WaitAll 方法 (array 20.Marshal.PtrToStringAnsi可将string转的IntPtr再反转成string。 21.wcf寄宿到windows服务时,服务需要以“本地系统”的方式启动,否则会报http无法注册的问题,也不能写windows事件日志。在topshelf中是调用RunAsLocalSystem。 22.GDAL运行报错安全透明方法尝试通过方法“”调用本机代码失败,解决这个问题,可以在编译时将csharp目录下的AssemblyInfo.cs文件的#if (CLR4)定义去掉。 23.等待线程结束可以用Thread.join()方法 24.线程互斥方法有lock,monitor,ManualResetEvent,AutoResetEvent,EventWaitHandle,Semaphore、Mutex等。 ManualResetEvent在一次set()释放后所有等待该信号的线程都继续;AutoResetEvent在一次set()释放后只有一个等待线程继续,需要再次set()才能释放另一个等待线程。 25.Interlocked类提供多线程原子操作。 26.unsafe环境下指针可以直接强转成IntPtr. fixed (byte* pSource = source) { IntPtr p = (IntPtr)pSource; } 27.在有些IIS7+IE10上,FormsAuthentication.SetAuthCookie方式可能会无法保存用户凭证。导致登录失败。 28.jquery扩展事件: $.extend($.fn.layout.methods, { isVisible: function (jq, params) { var panels = $.data(jq[0], 'layout').panels; var pp = panels[params]; if (!pp) { return false; } if (pp.length) { return pp.panel('panel').is(':visible'); } else { return false; } } }); 29.如果没有使用windows事件机制,而在windows事件中出现莫名其妙的错误,怎么都找不出原因;可以看看是不是缺少dll。 30.ajax和后台服务通信时,如果参数太多或字符串太长,会导致超过MaxRequestStringLength,可以尝试改用type:'POST'的方式提交数据,默认是'GET' 31.nuget删除包命令:nuget delete 包ID 包版本 -ApiKey develop2 -Source http://192.168.100.75:8000/ 安装特定版本的包:nuget install iTelluro.GlobeEngine -version 2.5.2014.063009 -source http://192.168.100.77/nugetserver/nuget 32. void SwapIfGreater where(泛型类型约束)关键字,可以指定模板类型T必须具备某些条件 33.c++获得cpu内核数代码: SYSTEM_INFO info; GetSystemInfo(&info); DWORD dwNum = info.dwNumberOfProcessors;
34.c#默认函数调用方式是__stdcall,因此被调用的c++ dll中回调函数声明最好也是__stdcall形式,声明语法是typedef int (__stdcall *SearchHitCallback)(int id, void* arg); 不改c++的回调函数声明的话,也可以在c#委托函数前加约束[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 35.GetNextFeature返回的Feature对象必须显式Dispose,否则会有内存泄露。Dispose后,先前通过GetGeometryRef获取的Geometry指针已被释放,也不可再用。 36.c#中char类型是两个字节,每个char代表一个unicode字符,string类型默认是unicode编码。c++中char类型是一个字节。 37. dllimport c++的dll时,如果c++定义中函数参数类型是向外传值的指针,那么c#定义使用ref即可,例如char* write(int* size); -> IntPtr write(ref int size); |