C#中方括号[]的语法及作用介绍
1. c#实现.net组件与com组件的互操作
[dllimport("kernel32.dll")]这叫引入kernel32.dll这个动态连接库。
这个动态连接库里面包含了很多windowsapi函数,如果你想使用这面的函数,就需要这么引入。举个例子:
[dllimport("kernel32.dll")]
private static extern void 函数名(参数,[参数]);
函数名就是一个属于kernel32.dll里的一个函数。完了你就可以用那个函数了。
.net组件中使用目前存在的com组件
对于.net来讲,使用com组件就要简单一些。..net提供了大量的类库来方便的实现同com的相互操作,其中很重要的一个名称空间就是:system.runtime.interopservices。通过这个名称空间的名字我们也可以从字面上看出,"互操作服务"。system.runtime.interopservices这个名称空间提供了一系列的类来对com对象进行操作。
需要注意的是,在调用com组件之前,我们需要在.net程序中引用名称空间:system.runtime.interopservices 。因为我们需要使用这个名称空间所提供的一个方法:dllimport。
例子: 内存,硬盘的利用率
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.text;
using system.windows.forms;
using system.runtime.interopservices;
namespace windows.help
{
public partial class systeminfo : form
{
public systeminfo()
{
initializecomponent();
}
[dllimport("kernel32")]
public static extern void getwindowsdirectory(stringbuilder windir, int count);
[dllimport("kernel32")]
public static extern void getsystemdirectory(stringbuilder sysdir, int count);
[dllimport("kernel32")]
public static extern void getsysteminfo(ref cpu_info cpuinfo);
[dllimport("kernel32")]
public static extern void globalmemorystatus(ref memory_info meminfo);
[dllimport("kernel32")]
public static extern void getsystemtime(ref systemtime_info stinfo);
//定义cpu的信息结构
[structlayout(layoutkind.sequential)]
public struct cpu_info
{
public uint dwoemid;
public uint dwpagesize;
public uint lpminimumapplicationaddress;
public uint lpmaximumapplicationaddress;
public uint dwactiveprocessormask;
public uint dwnumberofprocessors;
public uint dwprocessortype;
public uint dwallocationgranularity;
public uint dwprocessorlevel;
public uint dwprocessorrevision;
}
//定义内存的信息结构
[structlayout(layoutkind.sequential)]
public struct memory_info
{
public uint dwlength;
public uint dwmemoryload;
public uint dwtotalphys;
public uint dwavailphys;
public uint dwtotalpagefile;
public uint dwavailpagefile;
public uint dwtotalvirtual;
public uint dwavailvirtual;
}
//定义系统时间的信息结构
[structlayout(layoutkind.sequential)]
public struct systemtime_info
{
public ushort wyear;
public ushort wmonth;
public ushort wdayofweek;
public ushort wday;
public ushort whour;
public ushort wminute;
public ushort wsecond;
public ushort wmilliseconds;
}
private void button1_click(object sender, eventargs e)
{
//调用getwindowsdirectory和getsystemdirectory函数分别取得windows路径和系统路径
const int nchars = 128;
stringbuilder buff = new stringbuilder(nchars);
getwindowsdirectory(buff, nchars);
windowsdirectory.text = "windows路径:" + buff.tostring();
getsystemdirectory(buff, nchars);
systemdirectory.text = " 系统路径:" + buff.tostring();
//调用getsysteminfo函数获取cpu的相关信息
cpu_info cpuinfo;
cpuinfo = new cpu_info();
getsysteminfo(ref cpuinfo);
numberofprocessors.text = "本计算机中有" + cpuinfo.dwnumberofprocessors.tostring() + "个cpu";
processortype.text = "cpu的类型为" + cpuinfo.dwprocessortype.tostring();
processorlevel.text = "cpu等级为" + cpuinfo.dwprocessorlevel.tostring();
oemid.text = "cpu的oem id为" + cpuinfo.dwoemid.tostring();
pagesize.text = "cpu中的页面大小为" + cpuinfo.dwpagesize.tostring();
//调用globalmemorystatus函数获取内存的相关信息
memory_info meminfo;
meminfo = new memory_info();
globalmemorystatus(ref meminfo);
memoryload.text = meminfo.dwmemoryload.tostring() + "%的内存正在使用";
totalphys.text = "物理内存共有" + meminfo.dwtotalphys.tostring() + "字节";
availphys.text = "可使用的物理内存有" + meminfo.dwavailphys.tostring() + "字节";
totalpagefile.text = "交换文件总大小为" + meminfo.dwtotalpagefile.tostring() + "字节";
availpagefile.text = "尚可交换文件大小为" + meminfo.dwavailpagefile.tostring() + "字节";
totalvirtual.text = "总虚拟内存有" + meminfo.dwtotalvirtual.tostring() + "字节";
availvirtual.text = "未用虚拟内存有" + meminfo.dwavailvirtual.tostring() + "字节";
//调用getsystemtime函数获取系统时间信息
systemtime_info stinfo;
stinfo = new systemtime_info();
getsystemtime(ref stinfo);
date.text = stinfo.wyear.tostring() + "年" + stinfo.wmonth.tostring() + "月" + stinfo.wday.tostring() + "日";
time.text = (stinfo.whour + 8).tostring() + "点" + stinfo.wminute.tostring() + "分" + stinfo.wsecond.tostring() + "秒";
}
private void button2_click(object sender, eventargs e)
{
this.close();
}
}
}
2. 数组、索引器中的应用
type 类型。
array 数组。
indexexpr 索引表达式。
备注
数组类型是一种后跟 [] 的类型:
int[] fib; // fib is of type int[], "array of int"
fib = new int[100]; // create a 100-element int array
若要访问数组的一个元素,则用方括号括起所需元素的索引:
fib[0] = fib[1] = 1;
for( int i=2; i <100; ++i ) fib[i] = fib[i-1] + fib[i-2];
如果数组索引超出范围,则会引发异常。
不能重载数组索引运算符;但类型可以定义包含一个或多个参数的索引器和属性。索引器参数括在方括号中(就像数组索引一样),但索引器参数可声明为任何类型(与数组索引不同,数组索引必须为整数)。
例如,.net framework 定义一个哈希表类型,该类型将键和任意类型的值关联在一起。
collections.hashtable h = new collections.hashtable();
h["a"] = 123; // note: using a string as the index
3. 方括号用于指定属性
attribute(allowmultiple=true)]
public class attr {
}
可使用方括号来索引指针后面的存储位置(请参见 a.2 指针类型):
unsafe fixed ( int* p = fib ) // p points to fib from earlier example
{
p[0] = p[1] = 1;
for( int i=2; i <100; ++i ) p[i] = p[i-1] + p[i-2];
}
不执行边界检查。
[toolboxitem(false)]表示不在ide工具箱的控件集合中显示。
[parsechildren(true)]
它是用来告诉解析器 页面声明语法中位于 指定标签内的内容(子标签)是否是看作该控件的属性还是当作一个子控件的标签。
true 这里true 是当作子标签的意思。 toolboxdata 的意思是当你将这个控件从tool box 中拖放到webform中时在aspx文件的
html代码中添加的对该控件的定义。这里的控件是 : kj_gridview {0}是控件的标记的前缀
就是你托这个控件到页面上 时候 他就自动添加<{0}:div runat=server> 这个{0}是你定义的
1、[standardparameter(“processid“)]
2、[system.web.services.webmethod(enablesession=true)]
3、[guid(“d301882e-46d1-4e83-bf15-67028b94a68d“)]
4、[category(“drp“)]
5、[dbdefineattribute(“banks.xml“)]
[serializable]
6、[designerserializationvisibility(designerserializationvisibility.content)]
这些是类或方法的属性
这个在大型的软件开发中是很有用的,如项目中要用到的一个模块是通用的,我们就可以将其单独抽出来做成控件,这个时候类或是方法的属性就有用了
加上这些后使控件类在使用的时候就会有相应的列项提示等等