本文主要用于记录一些小知识点,至于为何要这么做,这里可能没说的那么详细,欢迎大家补充!另外这篇文章会一直追加下去,什么时候有了新的东西都会加入。
首先给出一句很经典的话:任何一件有几率发生的事情,最后一定会发生!
1、【ASP.NET】在调用ComboBox.Items.Add()方法的时候,尽量使用传递string类型的值,即ComboBox.Items.Add(obj.ToString()),否则如果直接调用ComboBox.Items.Add(obj),后台会在每次Add的时候执行两次obj.ToString();
2、【ASP.NET】如果确定对象会被装箱的时候,最好手动执行装箱操作,或者手动将对象转换成指定类型,如:int i = 100; Console.WriteLine("{0}", i);,最好写成:Console.WriteLine("{0}", i.ToString());
3、【ALL】在执行每一个方法的时候,想想要调用的方法是否有可能调用当前方法,如果存在这种情况,就会出现死循环。如:在写数据库日志的时候,需要先创建数据库帮助类,但是在创建数据库帮助类的过程中可能会出现异常,出现异常的时候也会写数据库日志,这样就死循环了。
4、【ASP.NET】当确定Object.GetHashCode()会被调用的时候,可以在事先调用并缓存,可以适当的提高调用Object.GetHashCode()的性能。
5、【VS2008】关于VS2008的一个很诡异的问题,直接启动VS2008,然后通过StartPage的历史项目列表中打开项目,任意点击保存按钮需要5-10秒时间,(不管什么时候,不管是否修改了文件,只要点击了保存按钮,或者按Ctrl+S组合键,都会卡死很长时间)这个问题烦恼了我很长时间,各种搜索,各种查资料,baidu,google,bing几乎用尽,还是没找到答案,后来发现如果不通过StartPage的项目列表中打开项目,而是直接在资源管理器中找到解决方案文件(.sln文件),则不会出现上面保存慢的问题。
6、【ASP.NET】、可以通过HttpContext.Current.Request.UserAgent对象来判断当前客户端所请求的浏览器的版本,如果如果包含MSIE6,在说明是IE6。
7、【ASP.NET】、在通过C#代码获取Excel中的WorkSheet对象的时候,可以调用ExcelApp.Sheets.get_Item(index)方法,其中index是从1开始计数的。
8、【ASP.NET】、在通过C#代码获取Excel中的Range的值的时候,可以调用(object[,])range.Value2方法,对于返回的object[,]对象中的索引都是从1开始计数的。
9、【NodeJS】、在进行方法传递的时候,私有字段会形成闭包而别且可以被调用,而通过this.XXX定义的公共字段则无法被调用,例如事先准备好下面的两个js文件,然后在命令行中调用执行:node b.js,会打印:name: a, this.Name: undefind
1 a.js: 2 var name = 'a'; 3 this.Name = 'A'; 4 this.show = function(){ 5 console.log('name: ' + name + ', this.Name: ' + this.Name); 6 } 7 8 b.js 9 var a = require('a.js') 10 this.show = a.show; 11 this.show();
10、【ASP.NET/JS】URL编码: JS: encodeURIComponent(key) + "=" + encodeURIComponent(value) .NET: HttpUtility.Encode(key) + "=" + HttpUtility.Encode(value) ;URL解码: JS: decodeURIComponent .NET: HttpUtility.Decode。
11、【ASP.NET】、.NET中跨AppDomain进行参数/对象传递,可以调用:
获取值:AppDomain(.CurrentDomain).GetData("arg");
设置值:AppDomain(.CurrentDomain).SetData("arg", value);
类似每个AppDomain中都有一个Dictionary<string, object>的对象,所以和容易看出"arg"即为字典的键名了。
12、【ASP.NET】、C#静态构造函数永远只会被调用一次,如果在静态构造函数中执行完成之前,调用该类的静态对象获得值都为对象的默认值(值类型的默认值为0,引用类型的默认值为null);
13、【ASP.NET】、C#通过yield关键字来构建枚举器的时候,通过调用yield return XXX来返回一个枚举值;通过yield break的方式来跳出枚举器(循环),简单代码如下:
1 private List<string> _List; 2 private IEnumerable<string> GetEnumertor() 3 { 4 Console.WriteLine("GetEnumertor"); 5 if (this._List == null) yield break; 6 foreach (var str in this._List) yield return str; 7 }
14、【ASP.NET】、在自己建立一个Thread t,来异步执行一个方法的时候,当方法执行完毕后,该线程的ThreadState会被设置为Stopped。
15、【ASP.NET】、来自两个不同AppDomain的Type是无法比较他们之间的关系的,即使这两种类型所代表的类存在继承关系!
16、【ASP.NET】、类型“Microsoft.Office.Interop.Excel.ApplicationClass”未定义构造函数无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口。解决方法:将引用的DLL:Microsoft.Office.Interop.Excel;的嵌入互操作类型改为false,就可以了.
17、【ASP.NET】、同一个程序集中的类型的连个实例可能不相等,类型对象有“RuntimeType”和“ReflectionType”之分,比如你通过直接引用的方式,得到一个dll文件中的某个类的类型(Type实例),这个类型实例是一个RuntimeType, 这个实例是包含类型方法表信息的,即类型的元数据信息被加载到了内存中,然后你在紧接着上面的代码中(其实就是为了保证在同一个AppDomain中)通过下面的方式可以得到Assembly中的所有的Type对象数组:
var arr1 = Assembly.ReflectionOnlyLoadFrom(assemblyFileFullName).GetTypes();[返回ReflectionType]
var arr2 =Assembly.LoadFile(Path.GetFullPath(assemblyFileFullName)).GetTypes();[返回RuntimeType]
var arr3 =Assembly.Load(File.ReadAllBytes(assemblyFileFullName)).GetTypes();[返回ReflectionType]
还有一种方式: 调用一个新的AppDomain.Load(File.ReadAllBytes(assemblyFileFullName))[返回RuntimeType]
上面几种方式返回的都是一个Type对象数组,而且数组长度,Type(.FullName)都完全一样,但是你会发现(arr1[0] == arr[1])的值为false。
18、【ASP.NET】、关闭Windows进程(包括它的所有AppDomain),可以调用System.Environment.Exit()方法,Exit是终止进程最得体的方式,因为它首先调用托管堆上的所有对象的Finalize方法,然后释放有CLR持有的所有非托管COM对象,最后Exit调用Win32的ExitProcess函数。
....
未完待发现!