编程杂记

本文主要用于记录一些小知识点,至于为何要这么做,这里可能没说的那么详细,欢迎大家补充!另外这篇文章会一直追加下去,什么时候有了新的东西都会加入。

首先给出一句很经典的话:任何一件有几率发生的事情,最后一定会发生!

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();
a.js, b.js

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 }
View Code

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函数。

....

未完待发现!

原文地址:https://www.cnblogs.com/Juvy/p/2818754.html