欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中方括号[]的语法及作用介绍

程序员文章站 2023-12-18 18:52:52
1. c#实现.net组件与com组件的互操作 [dllimport("kernel32.dll")]这叫引入kernel32.dll这个动态连接库。这个动态连接库里面包...

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)]

这些是类或方法的属性
这个在大型的软件开发中是很有用的,如项目中要用到的一个模块是通用的,我们就可以将其单独抽出来做成控件,这个时候类或是方法的属性就有用了
加上这些后使控件类在使用的时候就会有相应的列项提示等等

上一篇:

下一篇: