当前位置: 移动技术网 > IT编程>开发语言>c# > 10个C#程序员经常用到的实用代码片段

10个C#程序员经常用到的实用代码片段

2019年07月18日  | 移动技术网IT编程  | 我要评论

1 读取操作系统和clr的版本

operatingsystem os = system.environment.osversion; 
console.writeline(“platform: {0}”, os.platform); 
console.writeline(“service pack: {0}”, os.servicepack); 
console.writeline(“version: {0}”, os.version); 
console.writeline(“versionstring: {0}”, os.versionstring); 
console.writeline(“clr version: {0}”, system.environment.version); 

在我的windows 7系统中,输出以下信息

platform: win32nt
service pack:
version: 6.1.7600.0
versionstring: microsoft windows nt 6.1.7600.0
clr version: 4.0.21006.1

2 读取cpu数量,内存容量

可以通过windows management instrumentation (wmi)提供的接口读取所需要的信息。

private static uint32 countphysicalprocessors() 
{ 
   managementobjectsearcher objects = new managementobjectsearcher( 
    “select * from win32_computersystem”); 
   managementobjectcollection coll = objects.get(); 
   foreach(managementobject obj in coll) 
  { 
    return (uint32)obj[“numberofprocessors”]; 
  } 
  return 0; 
} 
private static uint64 countphysicalmemory() 
{ 
  managementobjectsearcher objects =new managementobjectsearcher( 
   “select * from win32_physicalmemory”); 
  managementobjectcollection coll = objects.get(); 
  uint64 total = 0; 
  foreach (managementobject obj in coll) 
  { 
    total += (uint64)obj[“capacity”]; 
  } 
  return total; 
} 

请添加对程序集system.management的引用,确保代码可以正确编译。

console.writeline(“machine: {0}”, environment.machinename); 
console.writeline(“# of processors (logical): {0}”, environment.processorcount); 
console.writeline(“# of processors (physical): {0}” countphysicalprocessors()); 
console.writeline(“ram installed: {0:n0} bytes”, countphysicalmemory()); 
console.writeline(“is os 64-bit? {0}”,  environment.is64bitoperatingsystem); 
console.writeline(“is process 64-bit? {0}”, environment.is64bitprocess); 
console.writeline(“little-endian: {0}”, bitconverter.islittleendian); 
foreach (screen screen in system.windows.forms.screen.allscreens) 
{ 
   console.writeline(“screen {0}”, screen.devicename); 
   console.writeline(“\tprimary {0}”, screen.primary); 
   console.writeline(“\tbounds: {0}”, screen.bounds); 
   console.writeline(“\tworking area: {0}”,screen.workingarea); 
   console.writeline(“\tbitsperpixel: {0}”,screen.bitsperpixel); 
} 

3 读取注册表键值对

using (registrykey keyrun = registry.localmachine.opensubkey(@”software\microsoft\windows\currentversion\run”)) 
{ 
  foreach (string valuename in keyrun.getvaluenames()) 
  { 
   console.writeline(“name: {0}\tvalue: {1}”, valuename, keyrun.getvalue(valuename)); 
  } 
} 

请添加命名空间microsoft.win32,以确保上面的代码可以编译。

4 启动,停止windows服务

这项api提供的实用功能常常用来管理应用程序中的服务,而不必到控制面板的管理服务中进行操作。

servicecontroller controller = new servicecontroller(“e-m-power”);   
controller.start();   
if (controller.canpauseandcontinue)   
{   
  controller.pause();   
  controller.continue();   
}   
controller.stop(); 

.net提供的api中,可以实现一句话安装与卸载服务

if (args[0] == "/i") 
{ 
    managedinstallerclass.installhelper(new string[] { assembly.getexecutingassembly().location }); 
} 
else if (args[0] == "/u") 
{ 
  managedinstallerclass.installhelper(new string[] { "/u", assembly.getexecutingassembly().location }); 
} 

如代码所示,给应用程序传入i或u参数,以表示是卸载或是安装程序。

5 验证程序是否有strong name (p/invoke)

比如在程序中,为了验证程序集是否有签名,可调用如下方法

[dllimport("mscoree.dll", charset=charset.unicode)] 
static extern bool strongnamesignatureverificationex(string wszfilepath, bool fforceverification, ref bool pfwasverified); 
 
bool notforced = false; 
bool verified = strongnamesignatureverificationex(assembly, false, ref notforced); 
console.writeline("verified: {0}\nforced: {1}", verified, !notforced); 

这个功能常用在软件保护方法,可用来验证签名的组件。即使你的签名被人去掉,或是所有程序集的签名都被去除,只要程序中有这一项调用代码,则可以停止程序运行。

6 响应系统配置项的变更

比如我们锁定系统后,如果qq没有退出,则它会显示了忙碌状态。

请添加命名空间microsoft.win32,然后对注册下面的事件。

. displaysettingschanged (包含changing) 显示设置

. installedfontschanged 字体变化

. palettechanged

. powermodechanged 电源状态

. sessionended (用户正在登出或是会话结束)

. sessionswitch (变更当前用户)

. timechanged 时间改变

. userpreferencechanged (用户偏号 包含changing)

我们的erp系统,会监测系统时间是否改变,如果将时间调整后erp许可文件之外的范围,会导致erp软件不可用。

7 运用windows7的新特性

windows7系统引入一些新特性,比如打开文件对话框,状态栏可显示当前任务的进度。

microsoft.windowsapicodepack.dialogs.commonopenfiledialog ofd = new microsoft.windowsapicodepack.dialogs.commonopenfiledialog(); 
ofd.addtomostrecentlyusedlist = true; 
ofd.isfolderpicker = true; 
ofd.allownonfilesystemitems = true; 
ofd.showdialog(); 

用这样的方法打开对话框,与bcl自带类库中的openfiledialog功能更多一些。不过只限于windows 7系统中,所以要调用这段代码,还要检查操作系统的版本要大于6,并且添加对程序集windows api code pack for microsoft®.net framework的引用。

8 检查程序对内存的消耗

用下面的方法,可以检查.net给程序分配的内存数量

long available = gc.gettotalmemory(false); 
console.writeline(“before allocations: {0:n0}”, available); 
int allocsize = 40000000; 
byte[] bigarray = new byte[allocsize]; 
available = gc.gettotalmemory(false); 
console.writeline(“after allocations: {0:n0}”, available); 

在我的系统中,它运行的结果如下所示

before allocations: 651,064
after allocations: 40,690,080

使用下面的方法,可以检查当前应用程序占用的内存

process proc = process.getcurrentprocess(); 
console.writeline(“process info: “+environment.newline+ 
“private memory size: {0:n0}”+environment.newline + 
“virtual memory size: {1:n0}” + environment.newline + 
“working set size: {2:n0}” + environment.newline + 
“paged memory size: {3:n0}” + environment.newline + 
“paged system memory size: {4:n0}” + environment.newline + 
 “non-paged system memory size: {5:n0}” + environment.newline, 
proc.privatememorysize64,  proc.virtualmemorysize64, proc.workingset64, proc.pagedmemorysize64, proc.pagedsystemmemorysize64, proc.nonpagedsystemmemorysize64 ); 

9 使用记秒表检查程序运行时间

如果你担忧某些代码非常耗费时间,可以用stopwatch来检查这段代码消耗的时间,如下面的代码所示

system.diagnostics.stopwatch timer = new system.diagnostics.stopwatch(); 
timer.start(); 
decimal total = 0; 
int limit = 1000000; 
for (int i = 0; i < limit; ++i) 
{ 
   total = total + (decimal)math.sqrt(i); 
} 
timer.stop(); 
console.writeline(“sum of sqrts: {0}”,total); 
console.writeline(“elapsed milliseconds: {0}”, 
timer.elapsedmilliseconds); 
console.writeline(“elapsed time: {0}”, timer.elapsed); 

现在已经有专门的工具来检测程序的运行时间,可以细化到每个方法,比如dotnetperformance软件。

以上面的代码为例子,您需要直接修改源代码,如果是用来测试程序,则有些不方便。请参考下面的例子。

class autostopwatch : system.diagnostics.stopwatch, idisposable 
{ 
  public autostopwatch() 
  { 
    start(); 
  } 
  public void dispose() 
  { 
    stop(); 
    console.writeline(“elapsed: {0}”, this.elapsed); 
  } 
} 

借助于using语法,像下面的代码所示,可以检查一段代码的运行时间,并打印在控制台上。

using (new autostopwatch()) 
{ 
  decimal total2 = 0; 
  int limit2 = 1000000; 
  for (int i = 0; i < limit2; ++i) 
  { 
    total2 = total2 + (decimal)math.sqrt(i); 
  } 
} 

10 使用光标

当程序正在后台运行保存或是册除操作时,应当将光标状态修改为忙碌。可使用下面的技巧。

class autowaitcursor : idisposable 
{ 
private control _target; 
private cursor _prevcursor = cursors.default; 
public autowaitcursor(control control) 
{ 
  if (control == null) 
  { 
   throw new argumentnullexception(“control”); 
  } 
  _target = control; 
  _prevcursor = _target.cursor; 
  _target.cursor = cursors.waitcursor; 
} 
public void dispose() 
{ 
  _target.cursor = _prevcursor; 
} 
} 

用法如下所示,这个写法,是为了预料到程序可能会抛出异常

using (new autowaitcursor(this)) 
{ 
... 
throw new exception(); 
} 

如代码所示,即使抛出异常,光标也可以恢复到之间的状态。

c#程序员经常用到的10个实用代码片段已经和大家一起分享了,希望大家都能成为一个合格的c#程序员,努力吧,童鞋。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网