改進(jìn)c# 代碼的五個(gè)技巧(二)
在本文中,我將向你展示c#編程的5個(gè)最佳實(shí)踐。我從日常編程經(jīng)驗(yàn)中學(xué)到了這些實(shí)踐。我在release模式下測(cè)試了所有的代碼,并在開(kāi)發(fā)環(huán)境穩(wěn)定后進(jìn)行了截屏。我想你會(huì)喜歡這些建議的。
在使用數(shù)據(jù)類型之前選擇它
對(duì)于許多類型,我們寧愿不決定在日常編程生活中使用什么數(shù)據(jù)類型。就在幾個(gè)月前,我也是其中之一。但是當(dāng)我開(kāi)始學(xué)習(xí)編程中的最佳實(shí)踐以提高代碼性能時(shí),我了解到了錯(cuò)誤的數(shù)據(jù)類型是如何影響代碼的。我將展示一個(gè)演示來(lái)證明這個(gè)概念。
static void Main(string[] args)
{
List<Int32> li = new List<int>();
Stopwatch sw =new Stopwatch();
sw.Start();
for (int i = 0; i < 10000; i++)
{
li.Add(i);
}
sw.Stop();
Console.Write("Using Arraylist(Object)" + sw.ElapsedTicks + "\n");
sw.Reset();
sw.Start();
Int32[] a = new Int32[10000];
for (int i = 0; i < 10000; i++)
{
a[i] = i;
}
sw.Stop();
Console.Write("Using Value(Integer Array)" + sw.ElapsedTicks);
Console.ReadLine();
}

在上面的代碼中,首先我使用了一個(gè)list來(lái)存儲(chǔ)1000個(gè)整數(shù)值,在第二次執(zhí)行相同的操作時(shí),我使用了一個(gè)整數(shù)數(shù)組。我的輸出截圖顯示了哪種存儲(chǔ)機(jī)制最適合整數(shù)數(shù)組?,F(xiàn)在,你可能會(huì)想為什么這個(gè)list要花更多的時(shí)間呢?原因是,list以對(duì)象格式存儲(chǔ)數(shù)據(jù),當(dāng)我們首先嘗試存儲(chǔ)值類型時(shí),它將其轉(zhuǎn)換為引用類型,然后再存儲(chǔ)。因此,第一點(diǎn)是始終選擇適當(dāng)?shù)拇鎯?chǔ)機(jī)制以獲得最佳性能。
使用for循環(huán)代替foreach
我現(xiàn)在要解釋一個(gè)非常有趣的事實(shí)。我想你們都熟悉for和foreach循環(huán)?,F(xiàn)在如果我問(wèn)你哪個(gè)更快?嗯…不知道。對(duì)吧?
伙計(jì)們,for循環(huán)比f(wàn)oreach循環(huán)快得多。讓我們看看下面的例子。
List<Int32> Count = new List<int>();
List<Int32> lst1 = new List<Int32>();
List<Int32> lst2 = new List<Int32>();
for (int i = 0; i < 10000; i++)
{
Count.Add(i);
}
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Count.Count; i++)
{
lst1.Add(i);
}
sw.Stop();
Console.Write("For Loop :- " + sw.ElapsedTicks + "\n");
sw.Restart();
foreach (int a in Count)
{
lst2.Add(a);
}
sw.Stop();
Console.Write("Foreach Loop:- " + sw.ElapsedTicks);
Console.ReadLine();

不要擔(dān)心,我已經(jīng)在發(fā)布模式下測(cè)試了這個(gè)示例,這個(gè)屏幕截圖是在幾次測(cè)試運(yùn)行后拍攝的。
選擇何時(shí)使用類,何時(shí)使用結(jié)構(gòu)體
接受這樣一個(gè)事實(shí),即基本理解了c#中的結(jié)構(gòu)體和類,或者至少理解了最喜歡的編程語(yǔ)言中的結(jié)構(gòu)體和類(如果它們存在的話)。好吧,如果你在想“很久以前我學(xué)過(guò)結(jié)構(gòu)體,但在日常編碼生活中從未使用過(guò)它”,那么你就是那95%從未測(cè)量過(guò)類和結(jié)構(gòu)體性能的開(kāi)發(fā)人員中的一員。別擔(dān)心;在寫這篇文章之前,我也沒(méi)有。
那么類呢?是的,我們時(shí)不時(shí)地在日常項(xiàng)目開(kāi)發(fā)中實(shí)現(xiàn)一個(gè)類。
現(xiàn)在我的問(wèn)題是“哪個(gè)更快,類還是結(jié)構(gòu)體”?我猜你會(huì)想“從未測(cè)試過(guò)”。好的,我們來(lái)測(cè)試一下。看看下面的代碼。
namespace BlogProject
{
struct MyStructure
{
public string Name;
public string Surname;
}
class MyClass
{
public string Name;
public string Surname;
}
class Program
{
static void Main(string[] args)
{
MyStructure[] objStruct = new MyStructure[1000];
MyClass[] objClass = new MyClass[1000];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
objStruct[i] = newMyStructure();
objStruct[i].Name = "Sourav";
objStruct[i].Surname = "Kayal";
}
sw.Stop();
Console.WriteLine("For Structure:- " + sw.ElapsedTicks);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
objClass[i] = newMyClass();
objClass[i].Name = "Sourav";
objClass[i].Surname = "Kayal";
}
sw.Stop();
Console.WriteLine("For Class:- " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
輸出結(jié)果如下:

現(xiàn)在很明顯,結(jié)構(gòu)體要比類快得多。同樣,我在發(fā)布模式下測(cè)試了這段代碼,并獲得了至少20個(gè)輸出,以使程序達(dá)到穩(wěn)定的位置。
現(xiàn)在最大的問(wèn)題是“為什么結(jié)構(gòu)體比類快?”
正如我們所知,結(jié)構(gòu)體變量是值類型,值(或結(jié)構(gòu)體變量)存儲(chǔ)在一個(gè)位置。
類對(duì)象是引用類型。如果是對(duì)象類型,則創(chuàng)建引用,并將值存儲(chǔ)在內(nèi)存的其他位置。基本上,值存儲(chǔ)在一個(gè)可管理的堆中,指針創(chuàng)建在堆棧中。以這種方式在內(nèi)存中實(shí)現(xiàn)一個(gè)對(duì)象,通常要比結(jié)構(gòu)體變量花費(fèi)更多的時(shí)間。
始終使用Stringbuilder進(jìn)行字符串連接操作
這一點(diǎn)對(duì)開(kāi)發(fā)人員來(lái)說(shuō)非常關(guān)鍵。在進(jìn)行大量字符串拼接操作時(shí),請(qǐng)使用StringBuilder代替String。為了演示它對(duì)代碼性能的影響,我準(zhǔn)備了以下示例代碼。我在for循環(huán)中執(zhí)行了500次字符串拼接操作。
public classTest
{
public static string Name { get; set; }
public static string surname;
}
class Program
{
static void Main(string[] args)
{
string First = "A";
StringBuilder sb = new StringBuilder("A");
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 500; i++)
{
First = First + "A";
}
st.Stop();
Console.WriteLine("Using String :-" + st.ElapsedTicks);
st.Restart();
for (int i = 0; i < 500; i++)
{
sb.Append("A");
}
st.Stop();
Console.WriteLine("Using Stringbuilder :-" + st.ElapsedTicks);
Console.ReadLine();
}
}
這是輸出:

選擇分配類數(shù)據(jù)成員的最佳方式
在為類變量賦值之前,我建議你現(xiàn)在查看以下代碼和輸出屏幕。
namespace Test
{
public class Test
{
public staticstring Name { get; set; }
public staticString surname;
}
class Program
{
static void Main(string[] args)
{
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 100; i++)
{
Test.Name = "Value";
}
st.Stop();
Console.WriteLine("Using Property: " + st.ElapsedTicks);
st.Restart();
for (int i = 0; i < 100; i++)
{
Test.surname = "Value";
}
st.Stop();
Console.WriteLine("Direct Assign: " + st.ElapsedTicks);
Console.ReadLine();
}
}
}

是的,我們的輸出屏幕是說(shuō),使用屬性分配數(shù)據(jù)成員比直接分配要慢得多。
以上就是改進(jìn)c# 代碼的五個(gè)技巧(二)的詳細(xì)內(nèi)容,更多關(guān)于改進(jìn)c# 代碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類,實(shí)例分析了C#抓取及分析網(wǎng)頁(yè)中文本及連接的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果
這篇文章主要介紹了WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
C# 實(shí)現(xiàn)在控制臺(tái)上換行輸出與不換行輸出
這篇文章主要介紹了C# 實(shí)現(xiàn)在控制臺(tái)上換行輸出與不換行輸出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
C#根據(jù)前臺(tái)傳入實(shí)體名稱實(shí)現(xiàn)動(dòng)態(tài)查詢數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了C#如何根據(jù)前臺(tái)傳入實(shí)體名稱實(shí)現(xiàn)動(dòng)態(tài)查詢數(shù)據(jù)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04
關(guān)于C#調(diào)用C++dll傳指針釋放內(nèi)存問(wèn)題
這篇文章主要介紹了關(guān)于C#調(diào)用C++dll傳指針釋放內(nèi)存問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Datagridview使用技巧(9)Datagridview的右鍵菜單
這篇文章主要為大家詳細(xì)介紹了Datagridview使用技巧,Datagridview的右鍵菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
C#實(shí)現(xiàn)的UDP收發(fā)請(qǐng)求工具類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的UDP收發(fā)請(qǐng)求工具類,結(jié)合具體實(shí)例形式分析了C#針對(duì)UDP請(qǐng)求的監(jiān)聽(tīng)、接收、發(fā)送等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06

