改進(jìn)c# 代碼的五個技巧(一)
親愛的讀者,在這篇文章中,我提供了一些c#編程的最佳實(shí)踐。
你是否在用戶輸入驗(yàn)證中使用異常處理機(jī)制?
如果是,那么你就是那個把你的項(xiàng)目執(zhí)行速度降低了62倍的人。你不相信我嗎?等幾分鐘;我來教你怎么做。但是在這個例子之前,讓我們了解一下在什么地方需要異常處理。
例如,你正在驗(yàn)證用戶的數(shù)據(jù),對于任何無效的輸入,你將引發(fā)一個異常并將其拋出給客戶端,如下所示:
class BusinessLogcCheck
{
public void Check()
{
try
{
//Your validation code is here
}
catch (Exception ex)
{
throw new Exception("My own exception");
}
}
}
親愛的朋友,在下一個示例中,如果你看到輸出屏幕,你將意識到這種做法有多糟糕。讓我們看看下面的代碼。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class Program
{
public static void ThrowTest()
{
throw new Exception("This is exceptopn");
}
public static Boolean Return()
{
return false;
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
try
{
ThrowTest();
}
catch
{
}
sw.Stop();
Console.WriteLine("With Exception " + sw.ElapsedTicks);
sw.Restart();
try
{
Return();
}
catch
{
}
sw.Stop();
Console.WriteLine("With Return " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
這就是你等待的輸出。

我的概念證明非常簡單。在一個函數(shù)中,我拋出了一個異常,在另一個函數(shù)中,我在檢查用戶輸入后返回一個布爾值。我還附上了一個計(jì)算器的屏幕(哈哈..),讓你相信異常處理是如何影響代碼性能的。
因此,我們可以得出這樣一個結(jié)論:“不要為用戶輸入驗(yàn)證引發(fā)異常?!笔褂貌紶柗祷丶夹g(shù)(或類似的技術(shù))來驗(yàn)證業(yè)務(wù)邏輯中的輸入”。因?yàn)楫惓ο蟮拈_銷非常大。
永遠(yuǎn)不要在循環(huán)中實(shí)現(xiàn)try-Catch
是的,它也與異常處理有關(guān)。我重復(fù)“永遠(yuǎn)不要在循環(huán)中執(zhí)行try-catch”。讓我用一個例子來證明。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class Program
{
static void Method1()
{
for (int i = 0; i < 1000; i++)
{
try
{
int value = i * 100;
if (value == -1)
{
throw new Exception();
}
}
catch
{
}
}
}
static void Method2()
{
try
{
for (int i = 0; i < 1000; i++)
{
int value = i * 100;
if (value == -1)
{
throw new Exception();
}
}
}
catch
{
}
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Method1();
sw.Stop();
Console.WriteLine("Within Loop " + sw.ElapsedTicks);
sw.Restart();
Method2();
sw.Stop();
Console.WriteLine("Outside of Loop " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
這是輸出屏幕。

在method1的這個程序中,我在for循環(huán)中實(shí)現(xiàn)了異常處理機(jī)制,而在method2中,我在沒有循環(huán)的情況下實(shí)現(xiàn)了異常處理機(jī)制。我們的輸出窗口表明,如果我們在for循環(huán)外實(shí)現(xiàn)try-catch程序的執(zhí)行速度將比循環(huán)內(nèi)的try-catch快2倍。
同樣,唯一的結(jié)論是“不要在項(xiàng)目的循環(huán)中實(shí)現(xiàn)try-catch。(是的!不僅在for循環(huán)中,而且在任何循環(huán)中。)
你是否瘋狂到要使用new操作符來創(chuàng)建一個整數(shù)變量?
親愛的讀者,不要因?yàn)槲覍懥诉@么長的標(biāo)題而批評我,也不要使用new操作符來創(chuàng)建一個簡單的整數(shù)變量。我知道你會說,如果你使用new操作符創(chuàng)建一個簡單的整數(shù)變量就會被自動設(shè)置為0,不遭受錯誤,如“未賦值的局部變量”,但這真的是需要得到一個自動賦值為0,你的目的是創(chuàng)建一個局部變量來存儲嗎?讓我們看看new操作符是如何降低代碼執(zhí)行的性能的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
int a = new int();
a = 100;
}
sw.Stop();
Console.WriteLine("Using New operator:- " + sw.ElapsedTicks);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
int a;
a = 100;
}
sw.Stop();
Console.WriteLine("Without new operator:- "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
輸出的截圖如下:

new操作符將執(zhí)行速度降低了5倍。我可以否認(rèn)輸出屏幕,但有一件事!!你一次要創(chuàng)建1000個變量;在我們的項(xiàng)目中,我們不會一次創(chuàng)建1000個變量,最多創(chuàng)建2到3個。
好的。你的應(yīng)用程序是web應(yīng)用程序嗎?如果是,那么請檢查任何流行的web應(yīng)用程序的點(diǎn)擊數(shù),我確信它超過1000每天。
同樣,這一行的結(jié)論是“不要瘋狂地使用new操作符來創(chuàng)建整數(shù)變量”。
根據(jù)你的目的選擇最好的集合
我們.net開發(fā)人員非常熟悉c#中的集合以及它們用來存儲值的方法。讓我們看看它們是如何執(zhí)行搜索的。查看搜索整數(shù)的性能。這是我的代碼。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class Program
{
static void Main(string[] args)
{
List<Int32> li = new List<Int32>(1000);
Dictionary<int, int> di = new Dictionary<int, int>(1000);
int[] arr = new int[1000];
int a;
for (int i = 0; i < 1000; i++)
{
li.Add(i);
di.Add(i, i);
arr[i] = i;
}
Stopwatch sw = new Stopwatch();
sw.Start();
a = li[500];
sw.Stop();
Console.WriteLine("From list:- " + sw.ElapsedTicks);
sw.Start();
a = arr[500];
sw.Stop();
Console.WriteLine("From Integer array:- " + sw.ElapsedTicks);
sw.Restart();
a = di[500];
sw.Stop();
Console.WriteLine("From Dictionary:- " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
輸出在這里:

我們可以清楚地看到,在字典的情況下,搜索的性能是最差的,而在list和整數(shù)數(shù)組的情況下,性能非常相似。

方法是好的,但不是所有時候
如果你還記得你剛開始學(xué)習(xí)編程的那幾天,你學(xué)過一個概念,就是總是實(shí)現(xiàn)一個方法來在代碼中實(shí)現(xiàn)好的練習(xí),是的,實(shí)現(xiàn)一個方法來執(zhí)行某些任務(wù)是很好的。方法在編程中有成千上萬的優(yōu)點(diǎn),但是讓我們看看方法是如何降低執(zhí)行性能的。我再次強(qiáng)調(diào),這一點(diǎn)并不是反對方法,而是簡單地展示方法調(diào)用是一種代價高昂的機(jī)制,并提供了在何處實(shí)現(xiàn)方法以及在何處不實(shí)現(xiàn)方法的想法。讓我們看看下面的代碼。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class test
{
public static void Print()
{
Console.WriteLine("I am function from Class");
}
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
test.Print();
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
sw.Restart();
Console.WriteLine("I am single statement within main");
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
Console.ReadLine();
}
}
}
下面是屏幕輸出:

在這里,我想在輸出窗口中打印一條消息,首先,我在一個靜態(tài)函數(shù)中實(shí)現(xiàn)了它,并通過類名調(diào)用它,第二次我只是在主函數(shù)中編寫它??梢?,通過Console.Writeline()非常簡單。輸出屏幕顯示單行執(zhí)行比函數(shù)快9倍。因此,唯一的結(jié)論是“在盲目執(zhí)行某個功能之前,試著了解情況并做出最佳決策”
結(jié)論
謝謝你能容忍我這么長時間。我在我的筆記本電腦上做了上面的測試,我的筆記本電腦有core i3處理器,4GB內(nèi)存和Windows環(huán)境,在程序穩(wěn)定后以釋放模式輸出。如果你使用不同的平臺和不同的輸出,在評論部分有足夠的空間寫評論。
以上就是改進(jìn)c# 代碼的五個技巧(一)的詳細(xì)內(nèi)容,更多關(guān)于改進(jìn)c# 代碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用Directoryinfo類獲得目錄信息和屬性的方法
這篇文章主要介紹了C#使用Directoryinfo類獲得目錄信息和屬性的方法,涉及C#操作目錄的技巧,非常具有實(shí)用價值,需要的朋友可以參考下2015-04-04
C# XML字符串包含特殊字符的處理轉(zhuǎn)換方法小結(jié)
今天用C#輸出XML文件時,發(fā)現(xiàn)報錯,經(jīng)過反復(fù)檢查調(diào)試,發(fā)現(xiàn)是因?yàn)槟程巸?nèi)容含有某些特殊字符,這些特殊字符是在XML里不被允許的2020-07-07
C# BeginInvoke實(shí)現(xiàn)異步編程方式
這篇文章主要介紹了C# BeginInvoke實(shí)現(xiàn)異步編程方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
總結(jié)C#刪除字符串?dāng)?shù)組中空字符串的幾種方法
C#中要如何才能刪除一個字符串?dāng)?shù)組中的空字符串呢?下面的文章會介紹多種方式來實(shí)現(xiàn)清除數(shù)組中的空字符串,以及在.net中將字符串?dāng)?shù)組中字符串為空的元素去除。2016-08-08

