10個C#法式員常常用到的適用代碼片斷。本站提示廣大學習愛好者:(10個C#法式員常常用到的適用代碼片斷)文章只能為提供參考,不一定能成為您想要的結果。以下是10個C#法式員常常用到的適用代碼片斷正文
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#法式員,盡力吧,童鞋。