.Net的一些基本知识
ArrayList对象
ArrayList对象在实现的时候是线程安全的,同时支持多个读取进程进行操作,在不修改的情况下。但是如果你使用了枚举器可能会导致多线程不安全问题,因为枚举器不是线程安全的,所以你需要在使用枚举器的时候锁定它。
程序集文件dll/exe和程序集清单Assembly
程序集文件主要包含:
程序集清单
类型元数据
微软中间语言
其他资源。
程序集清单主要包括:
程序集名称
版本信息
区域信息
强名称信息
程序集文件列表
类型引用信息
引用和依赖程序集信息
DllImport属性
DllImport属性是主要是用在导入非托管代码的函数,比如调用c/c++编写的函数在c#,那么你需要用到DllImport属性,很多的WinApi调用都需要这个属性。
DllImport的属性主要有四个:
EntryPoint : 说明该函数是来自哪个dll文件,也就是这个dll的入口函数在哪个文件上。
CharSet:该属性用于控制名字和字符串序列化。.Net framework支持四种模式的CharSet: Auto, Unicode, None, Ansi。不同版本的framework可能默认的CharSet不一样,在Compact版本上是Unicode,而普通版上是Ansi。
CallingConvention:这个属性是指明对dll导出函数采用什么规范,我们知道dll的到处函数有__stdcall, __fastcall, __cdecl, __declspec这几种。那么我们根据对应的dll,通过这个属性来设置。但大多数情况下,wins 下导出的api都是__stdcall规范的,所以framwork设置的默认值是WinApi.这个会在CE和普通版上自动转换。
SetLastError:这个属性用过WinApi的都知道,Wins有一个GetLastWin32Error的API所以这属性跟它对应,如果函数调用失败操作系统会设置一个错误号。在C#语言中默认是false。
Foreach 和 For
大家都知道Foreach是C#语言提供的一个比较方便的关键字用于遍历成员。但是目标对象必须是一个集合对象,如list,array等,当然也可以是你自己实现的对象,不过要继承IEnumerable接口和IEnumerator接口。那么for和foreach差别在哪里呢?
for (int i=0 ; i<array.length; i++)
do something...
for (int i in array)
do something ...
我们知道IEnumerator接口需要实现MoveNext和Current。
public bool MoveNext() // return value check
{
position++;
return (position < _people.Length);
}
public object Current // function call
{
get
{
try {
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
从这两个函数上可以看出使用foreach至少要比for多一次bool的check和一次function call。当我们运算大数据量的时候这个效率就会差很多。
Data Access Application Block for .NET
这个东西是一个类SqlHelper,很好用在用于数据库访问的时候。它封装了对ADO.net的大部分常用操作,免去很多重写的烦恼。
具体的内容看这里
ArrayList对象在实现的时候是线程安全的,同时支持多个读取进程进行操作,在不修改的情况下。但是如果你使用了枚举器可能会导致多线程不安全问题,因为枚举器不是线程安全的,所以你需要在使用枚举器的时候锁定它。
程序集文件dll/exe和程序集清单Assembly
程序集文件主要包含:
程序集清单
类型元数据
微软中间语言
其他资源。
程序集清单主要包括:
程序集名称
版本信息
区域信息
强名称信息
程序集文件列表
类型引用信息
引用和依赖程序集信息
DllImport属性
DllImport属性是主要是用在导入非托管代码的函数,比如调用c/c++编写的函数在c#,那么你需要用到DllImport属性,很多的WinApi调用都需要这个属性。
DllImport的属性主要有四个:
EntryPoint : 说明该函数是来自哪个dll文件,也就是这个dll的入口函数在哪个文件上。
CharSet:该属性用于控制名字和字符串序列化。.Net framework支持四种模式的CharSet: Auto, Unicode, None, Ansi。不同版本的framework可能默认的CharSet不一样,在Compact版本上是Unicode,而普通版上是Ansi。
CallingConvention:这个属性是指明对dll导出函数采用什么规范,我们知道dll的到处函数有__stdcall, __fastcall, __cdecl, __declspec这几种。那么我们根据对应的dll,通过这个属性来设置。但大多数情况下,wins 下导出的api都是__stdcall规范的,所以framwork设置的默认值是WinApi.这个会在CE和普通版上自动转换。
SetLastError:这个属性用过WinApi的都知道,Wins有一个GetLastWin32Error的API所以这属性跟它对应,如果函数调用失败操作系统会设置一个错误号。在C#语言中默认是false。
Foreach 和 For
大家都知道Foreach是C#语言提供的一个比较方便的关键字用于遍历成员。但是目标对象必须是一个集合对象,如list,array等,当然也可以是你自己实现的对象,不过要继承IEnumerable接口和IEnumerator接口。那么for和foreach差别在哪里呢?
for (int i=0 ; i<array.length; i++)
do something...
for (int i in array)
do something ...
我们知道IEnumerator接口需要实现MoveNext和Current。
public bool MoveNext() // return value check
{
position++;
return (position < _people.Length);
}
public object Current // function call
{
get
{
try {
return _people[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
从这两个函数上可以看出使用foreach至少要比for多一次bool的check和一次function call。当我们运算大数据量的时候这个效率就会差很多。
Data Access Application Block for .NET
这个东西是一个类SqlHelper,很好用在用于数据库访问的时候。它封装了对ADO.net的大部分常用操作,免去很多重写的烦恼。
具体的内容看这里
将想法付诸于实践,借此来影响他人是一个人存在的真正价值