精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C#開發人員應該知道的13件事情

開發 后端
本文講述了C#開發人員應該了解到的13件事情,希望對C#開發人員有所幫助。

本文講述了C#開發人員應該了解到的13件事情,希望對C#開發人員有所幫助。

 

[[184170]]

1. 開發過程

開發過程是錯誤和缺陷開始的地方。使用工具可以幫助你在發布之后,解決掉一些問題。

編碼標準

遵照編碼標準可以編寫出更多可維護的代碼,特別是在由多個開發人員或團隊編寫和維護的代碼庫中。例如FxCop,StyleCop和ReSharper等,就是常用的實施編碼標準的工具。

開發人員:在壓縮代碼之前,請使用工具仔細檢查是否違反了標準,并且對結果進行分析。使用工具發現的代碼路徑問題,不比你預期的少。

代碼審查

代碼審查和結對編程是任務開發人員審查他人編寫的源代碼的常見做法。通過這些方式希望能夠檢查出作者的錯誤,如編碼錯誤或實現錯誤。

代碼審查是一個很有價值的做法,但是它依賴于人類,易犯錯誤,所以很難擴展。

靜態分析

靜態分析工具會在不運行代碼的情況下分析代碼,在不需要編寫測試用例的情況下,查找違反編碼標準或存在缺陷的問題。它們能有效地找到問題,但你需要選擇出那些能夠定位出有價值問題的工具,找出有價值的問題。C#靜態分析工具包括Coverity,CAT.NET和Visual Studio代碼分析。

動態分析

動態分析工具在運行時分析代碼,幫助你查找缺陷,如安全漏洞,性能和并發問題。它分析運行時環境的上下文中的代碼,因此其有效性受測試工作負載的限制。Visual Studio提供了一些動態分析工具,包括并發可視化器,IntelliTrace和分析工具。

管理人員/團隊領導:利用開發***實踐,以避免常見的陷阱。仔細考慮可用的工具,以確保它們與你的需求和文化兼容。

測試

有許多類型的測試,例如:單元測試,系統集成測試,性能測試,滲透測試。在開發階段,大多數測試由開發人員或測試人員編寫,以驗證應用程序是否滿足其要求。

測試僅在它們運行正確的代碼時有效。在實現功能和測試的同時,保持開發速度是具有挑戰性的。

開發***實踐

投入時間來識別和配置工具,以便找到你關心的代碼問題,無需為開發人員帶來更多的工作。經常自動運行分析工具和測試,以確保開發人員在代碼剛寫完不久,就能定位到問題。

盡快地定位到所有的診斷輸出 - 無論是編譯器警告,標準違例,通過靜態分析識別的缺陷,還是測試失敗。如果新的診斷全部是可忽略的,那么審查所起的作用就增加了,開發人員也不必再為代碼問題煩惱。

采用這些***實踐有助于提高代碼的質量,安全性和可維護性,開發人員的一致性和生產力以及發布的可預測性。

關心 工具 影響
一致性,可維護性 編碼標準,靜態分析,代碼審查 一致的間距,命名和格式化提高了可讀性,并使開發人員更容易編寫和維護代碼。
正確性 代碼審查,靜態分析,動態分析,測試 代碼不僅需要在語法上有效,而且必須按照開發人員的意圖并滿足項目需求。
功能 測試 測試驗證代碼是否滿足要求,如正確性,可擴展性,魯棒性和安全性。
安全 編碼標準,代碼審查,靜態分析,動態分析,測試 安全是一個非常復雜的問題; 任何弱點或缺陷都可能被利用。
開發人員生產力 編碼標準,靜態分析,測試 當他們有工具來識別錯誤時,開發人員更快地實現代碼更改。
釋放可預測性 編碼標準,代碼審查,靜態分析,動態分析,測試 簡化后期活動,盡早解決缺陷和問題,盡可能縮短修復周期。


2. 類型陷阱

C#的一個主要優勢是其靈活的類型系統; 類型安全有助于早期發現錯誤。通過強制實施嚴格的類型規則,編譯器能夠幫助你保持正確的編碼實踐。C#語言和.NET框架提供了豐富的類型集合以適應最常見的需求。大多數開發人員很好地了解常見的類型及其用途,但有一些常見的誤解和誤用。

有關.NET Framework類庫的更多信息可以在MSDN庫中找到。

了解和使用標準接口

某些接口涉及常用的C#特性。例如,IDisposable允許使用常用的資源處理習語,例如“using”關鍵字。理解什么時候使用接口,能夠使你編寫更容易維護的C#代碼。

避免ICloneable - 設計者從來沒有明確拷貝的對象是深拷貝還是淺拷貝。由于沒有正確拷貝對象行為的標準,也就無法有效的使用這樣的接口。

結構

盡量避免寫到結構體。將它們視為不可變的,能夠防止混淆的發生,并且在共享內存的場景(如多線程應用程序)下更安全。相反,在創建結構體時使用初始化對象,如果需要更改值,則創建新的實例。

要了解哪些標準類型/方法是不可變的并返回新值(例如,string,DateTime)和哪些是可變的(List.Enumerator)。

字符串

字符串可以為null,因此在適當時,使用起來很方便。等價(s.Length == 0)可能會拋出一個NullReferenceException,但是String.IsNullOrEmpty(s)和String.IsNullOrWhitespace(s)函數能夠優雅地處理null。

標記枚舉

枚舉類型和常量值是能表露出自己含義的標識符,用于替換魔術數字,以便使得代碼更加可讀。

如果你發現需要創建枚舉的集合,標記枚舉可能是一個更簡單的選擇:

[Flag]
public enum Tag {
  None   =0x0,
  Tip    =0x1,
  Example=0x2
}

這使你能夠輕松地為代碼段添加多個標簽:

snippet.Tag = Tag.Tip | Tag.Example

這可以改善數據封裝,因為你不必擔心通過Tag property getter暴露內部集合。

等價比較

有兩種類型的等價:

  1. 引用相等,這意味著兩個引用,引用了同一個對象。
  2. 值平等,這意味著兩個不同的對象是等值的。

此外,C#提供了多種方法來測試等價。最常見的方法是使用:

  • ==和!=運算符
  • 繼承自Object的虛擬Equals方法
  • 靜態Object.Equals方法
  • IEquatable接口的Equals方法
  • 靜態Object.ReferenceEquals方法

可能難以知道預期的是引用相等還是值相等。如果你重寫Equals,不要忘記IEquatable <T>,GetHashCode(),如MSDN中所述。

注意無類型容器對重載的影響。考慮比較“myArrayList [0] == myString”。數組列表元素是編譯時類型“對象”,因此使用引用等價。C#編譯器會警告你這個潛在錯誤,但是有許多類似的情況,編譯器不會對意外的引用相等發出警告。

 

3. 類陷阱

封裝你的數據

類負責正確地管理數據。出于性能原因,它們通常緩存部分結果或者對其內部數據的一致性做出假設。數據公開訪問會影響你緩存或做出假設的能力,對性能,安全性和并發性都有潛在影響。例如,暴露可變成員,如通用集合和數組,允許用戶在你不知情的情況下修改這些結構。

屬性

屬性使你能夠精確控制用戶如何與你的對象進行交互,除了你通過訪問修改器控制的之外。具體來說,屬性使你能夠控制讀取和寫入時發生的情況。

屬性使你能夠建立穩定的API,同時重寫getter和setter中的數據訪問邏輯,或提供數據綁定源。

不要也不要讓屬性獲取器拋出異常,避免修改對象狀態。這樣就意味著需要一種方法而不是屬性獲取器。

有關屬性的詳細信息,請參閱MSDN的屬性設計主題:http : //msdn.microsoft.com/en-us/library/ms229006(v=vs.120).aspx

仔細的使用getters,因為它有副作用。開發者認為成員訪問是一個微不足道的操作,所以他們經常忘記在代碼審查期間考慮帶來的副作用。

對象初始化

你可以在創建表達式時,對新創建的對象設置屬性。使用特定值來創建Class Cde 對象,并用到Foo和Bar屬性:

new C {Foo=blah, Bar=blam}

你還可以使用特定的屬性名稱,創建匿名類型的實例:

var myAwesomeObject = new {Name=”Foo”, Size=10};

初始化會在構造主體運行之前執行,確保在進入構造器之前字段已經初始化了。因為構造函數還沒有運行,所以字段初始化器不能以任何方式引用“this”。

過度指定輸入參數

為了幫助防止特定方法的過度使用,請嘗試采用方法所需的最小特定類型。例如,考慮一個迭代List <Bar>的方法:

public void Foo(List<Bar> bars)  {
  foreach(var b in bars)
  {
    // do something with the bar...
  }
}

 對于其他的IEnumerable <Bar>集合,這段代碼能夠很好地運行,但是通過為參數指定List <Bar>,你就需要集合必須是一個List。選擇參數的最小特定類型(IEnumerable <T>,ICollection <T>等),以確保方法的***有用性

 

4. 泛型

泛型是一種十分有效的方式,來定義與類型無關的結構體和確保類型安全的算法。

使用諸如List <T>之類的泛型集合,而不是無類型的集合如ArrayList,能夠提高類型的安全性和性能。

當實現泛型類型時,可以使用“default”關鍵字來獲取那種無法硬編碼到實現中的默認值。具體來說就是,數字類型的默認值為0; 引用和可空值類型的默認值為null。

T t = default(T);

 

5. 類型轉化

有兩種類型的conversions轉化。顯式轉換必須由開發人員調用,隱式轉換由編譯器基于上下文來應用。

Cast 描述
Tree tree =(Tree)obj; 如果obj是tree類型時,請使用這個。如果obj不是Tree類型,將產生一個InvalidCast異常。
Tree tree = obj as Tree; 當你無法確定obj是否是Tree類型時,請使用這個。如果obj不是Tree類型,將會給Tree分配一個空值。在必要時,請使用這種轉換方式,因為它需要對返回值進行條件處理。這些額外的代碼可能產生更多的錯誤,使得代碼更難以讀取和調試。

類型轉化時,經常會遇到以下兩種情形:

  1. 表達式的運行時類型比編譯器能推斷出的類型更加具體。轉換指示編譯器將表達式當做更具體的類型來處理。如果你的假設不正確,編譯器將拋出異常的代碼。例如,從對象到字符串的轉換。
  2. 轉換指示編譯器會生成關聯表達式的值的代碼,如果沒有生成,則會拋出異常。例如,從double到integer的轉換。

兩種類型轉換都是很危險的。***種類型的轉換提出了一個問題,“為什么開發人員知道,而編譯器不知道?”如果在這種情況下,嘗試更改程序,以便編譯器可以成功地推導出正確的類型。如果你認為一個對象的運行時類型可能比編譯時類型更具體,那么你可以使用“is”或“as”運算符。

第二種類型轉換引發了一個問題,“為什么操作是在開始的地方執行的,而不是在目標數據類型?”如果你需要一個int類型的結果,使用int比double更有意義。

有關其他想法,請參閱:http//blogs.msdn.com/b/ericlippert/archive/tags/cast+operator/

在顯式轉換是正確的操作情況下,通過使用適當的運算符來提高可讀性,調試能力和可測試性。

 

6. 異常

異常不是條件

異常通常不應用于控制程序流; 它們代表的是,在運行時你可能無法恢復的意外情況。如果你預期你應該處理的情況,主動檢查情況,而不是等待異常發生。

要將格式不正確的字符串正常轉換為數字,請使用TryParse()方法; 而不是拋出異常,它返回一個布爾值,指示解析是否成功。

使用異常處理范圍

在catch內部寫代碼,并且仔細處理成程序塊。已執行過的代碼已經不存在這些異常。例如:

Frobber originalFrobber = null;
try {
  originalFrobber = this.GetCurrentFrobber();
  this.UseTemporaryFrobber();
  this.frobSomeBlobs();
}
finally {
  this.ResetFrobber(originalFrobber);
}

如果GetCurrentFrobber()拋出異常,那么當finally block被執行時,originalFrobber仍然為null; 

明智的處理異常

只捕獲你準備處理的特定異常,并且只針對特定代碼段。除非你的意圖只是簡單的記錄并重新拋出異常。某些例外可能使應用程序處于一種狀態,那么就需要避免處理所有異常或根類異常的實例。***是在沒有進一步損壞的情況下應用已經崩潰,而不是試圖恢復并造成損害。你的恢復嘗試可能會在不經意間使事情更糟。

處理致命異常有一些細微差別,特別是關于finally block執行時,如何影響異常安全和調試器。有關詳情,請參閱:http : //incrediblejourneysintotheknown.blogspot.com/2009/02/fatal-exceptions-and-why-vbnet-has.html

使用***級異常處理,來安全到處理程序的意外情況并公開信息以幫助調試問題。請謹慎使用catch塊來解決本可以安全處理的特定情況,為無法預料的異常預留***級的處理。

如果你捕獲到一個異常,那么就需要采取一些措施來處理。不計其它后果地處理當前異常只會使問題難以識別和調試。

對于公開了工作API的代碼來說,將異常包含于自定義異常中,是特別有用的。異常是方法的可見接口的一部分,應該與參數和返回值一起被控制。可能導致更多異常的方法,是不應該被使用在可維護解決方案中的。

拋出和重新拋出異常

當你希望在更深層次處理一個捕獲到的異常時,維護原始異常狀態和堆棧對于調試有極大的幫助。需要仔細地平衡,調試和安全注意事項。

簡單的重新拋出異常也是一個好選擇:

throw;

或者在新的throw中使用異常作為InnerException:

throw new CustomException(...,ex);

不要顯式地重新拋出捕獲的異常,如下所示:

throw e;

這將復位異常狀態到當前行,并且阻止調試。

一些異常發生在代碼的上下文之外。對于這些情況,你可能需要添加事件的處理程序,如ThreadException或UnhandledException,而不是使用catch塊。例如,表單處理程序線程的上下文中引發的Windows窗體異常。

數據完整性

異常不得影響數據模型的完整性。你需要確保你的對象處于一致的狀態 - 不會違反類實現所做的任何假設。否則,通過“恢復”,你只能使你的代碼變得混亂,之后還會導致進一步的損害。

 

7. 事件

事件和代理相互協助,當事件發生時,為類提供了一種方法來通知用戶。事件類似于委托類型的字段; 當創建對象時,它們將自動初始化為null。

事件的值是一個多級代理。也就是一個可以依次調用其他代理的代理。你可以為事件分配委托; 可以通過+ =和 - =等操作符操作事件。

注意競逐條件

如果事件在線程之間共享,則有可能在你檢查null之后并且在調用它之前,另一個線程將刪除所有參數 – 就會拋出NullReferenceException異常。

標準解決方案是創建事件的本地副本,用于測試和調用。你仍然需要小心,在其他線程中刪除的任何參數,在他們的委托被意外調用時會正常運行。你還可以實施鎖定,以一種能夠避免問題的方式為操作排隊列。

public event EventHandler SomethingHappened;
private void OnSomethingHappened() {
  // The event is null until somebody hooks up to it
  // Create our own copy of the event to protect against another thread removing our subscribers
  EventHandler handler = SomethingHappened;
  if (handler != null)
    handler(this,new EventArgs());
}

更多關于時間和競逐的信息,請參閱:http : //blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx

 

8. 屬性

屬性提供了一種方法,用于將組件,類和屬性的元數據與其屬性的信息一起輸入。它們通常用于向代碼用戶提供信息,如代碼調試器,測試框架和應用程序。你可以定義自己使用的屬性,也可以使用表中列出的預定義屬性。

屬性 使用 目的
Debugger顯示 調試器 調試器顯示格式
InternalsVisibleTo 會員訪問 能將內部成員暴露給特定的其他類。使用它,測試例程可以訪問受保護的成員。
默認值 屬性 指定屬性的默認值。

小心使用DebuggerStepThrough屬性,如果應用了這個屬性,會導致很難在方法中找到bug,因為你不能單步執行或打斷它們!

 

9. 調試

調試是任何開發工作中重要的組成部分。除了提供對運行時環境的常規不透明方面的可見性之外,調試器可以進入運行時環境,同時調試器還會導致應用程序的在沒有調試器的情況下,獲的不同的結果。

使異常堆棧可見

要查看當前框架的異常狀態,可以在Visual Studio Watch窗口中添加表達式“$ exception”。此變量包含當前異常狀態,類似于你在catch塊中看到的情況,除非你可以在調試器中看到異常狀態,否則就不必在代碼中實際捕獲異常。

注意訪問器中的副作用

如果你所使用的屬性有副作用,請考慮是否應使用屬性或調試器設置,來防止調試器自動調用getter。例如,你的類可能具有這些屬性:

private int remainingAccesses = 10;
private string meteredData;
public string MeteredData
{
  get
  {
    if (remainingAccesses-- > 0)
      return meteredData;
    return null;
  }
}

***次在調試器中查看此對象時,remainingAccesses將顯示為值10,MeteredData顯示為null。如果你將鼠標懸停在remainingAccesses上,你會看到它的值現在是9。調試器顯示的屬性值已經改變了對象的狀態。

 

10. 優化

早做計劃,經常衡量,然后優化

在設計期間設置合理的性能目標。在開發期間,專注于正確性而不是細微優化。經常根據目標衡量你的效果。如果你沒有達到目標,則應該花費時間來優化程序。

始終采用最合適的工具,在具有可重復性和盡可能接近用戶所經歷的實際條件的情況下,對性能進行經驗性測量。

由于CLR優化,有時效率低下的代碼實際上比高效的代碼運行速度更快。例如,CLR優化覆蓋了整個數組的循環,以避免隱式的單元范圍檢查。開發人員通常在循環數組之前計算長度:

int[] a_val = int[4000];
int len = a_val.Length;
for (int i = 0; i < len; i++)
    a_val[i] = i;

通過將長度放在變量中,CLR可能無法識別模式,并將跳過優化。手動優化違反了直覺,會導致性能較差。

構建字符串

如果你要做很多字符串連接,應該使用System.Text.StringBuilder對象,這樣可以避免構建許多臨時字符串對象。

對集合使用批處理操作

如果需要創建和填充已知大小的集合,請在創建集合時保留空間,以避免由于重復重新分配而導致的性能和資源問題。你可以使用AddRange方法(如List <T>中的方法)進一步提高性能:

Persons.AddRange(listBox.Items);

 

11. 資源管理

垃圾回收器能夠自動清理內存。即使如此,所有一次性資源,也必須妥善處理 - 特別是那些不由垃圾收集器管理的資源。

資源管理問題的常見來源
內存碎片 如果沒有足夠大的連續塊的虛擬地址空間,分配將失敗。
過程限制 進程通常訪問系統可用的內存和資源的嚴格子集。
資源泄漏 垃圾回收器只管理內存。其他資源需要由應用程序正確管理。
資源困境 依賴于垃圾收集器和終結器的資源在不再使用時,不會變得立即可用。事實上,它們可能永遠不可用。

使用try / finally塊來確保資源正確釋放,或讓你的類實現IDisposable,并利用更清潔和更安全的using語句。

using (StreamReader reader=new StreamReader(file)) 
{ 
 //your code here

避免代碼中使用垃圾收集器

盡量不要通過調用GC.Collect()干擾垃圾收集器,而應該將重點放在正確釋放或處置資源。當測量性能時,如果你能夠正確的評估影響,在小心的讓垃圾收集器運行。

避免編寫終結器

不同于***的錯誤認知,你的類不需要一個Finalizer,僅僅是因為它實現IDisposable!你可以實現IDisposable以使你的類能夠在任何所有的復合實例上調用Dispose,但是終結器只應在直接擁有非托管資源的類上實現。

Finalizer主要用于調用interop API,來處理Win32句柄,SafeHandle更容易處理。

你不能推測你的終結器 - 它總是在終結器線程上運行 - 可以安全地與其他對象交互。那些其他對象本身可能已經完成了。

 

12. 并發

并發和多線程編程是一件很復雜和困難的事情。在向應用程序添加并發之前,請確保你真正了解自己正在做什么 - 有很多細微之處需要了解!

多線程應用程序非常難以推理,并且容易受到諸如通常不影響單線程應用程序的競爭條件和死鎖等問題的影響。鑒于這些風險,你應該***才考慮多線程。如果你必須使用多個線程,請盡量通過不在線程之間共享內存來最小化同步的需要。如果必須同步線程,請使用***級別的同步機制。

***級別,這些機制包括:

  • Async-await/Task Parallel Library/Lazy<T>
  • Lock/monitor/AutoResetEvent
  • Interlocked/Semaphore
  • Volatile fields and explicit barriers

C#/ .NET中并發的復雜性很難就在這里解釋清楚。如果你想要或需要開發一個利用并發的應用程序,請查看詳細的文檔,如O'Reilly的“Concurrency in C# Cookbook”。

使用volatile

將字段標記為“易變”是高級功能,即使專家也經常誤解。C#編譯器將確保訪問字段具有獲取和釋放語義; 這不同于確保對該字段的所有訪問都處于鎖定狀態。如果你不知道什么是獲取和釋放語義,以及它們如何影響CPU級優化,則應避免使用volatile字段。相反,應該使用較高級別的工具,如任務并行庫或CancellationToken類型。

利用線程安全的內置方法

標準庫類型通常提供方便線程安全訪問對象的方法。例如,Dictionary.TryGetValue()。使用這些方法通常使你的代碼更清潔,你不需要擔心如TOCTTOU or TOCTOU場景等數據競爭的情況。

不要鎖定“this”,字符串或其他常見的公共對象

當實現在多線程上下文中使用的類時,要非常小心使用鎖。鎖定此字符串或其他公共對象,會阻止封裝鎖定狀態,并可能導致死鎖。你需要防止其他代碼鎖定你的實現上正在使用的對象; 最安全的做法是使用一個私人的對象成員。

 

13. 避免常見錯誤

引用null

不適當的使用null,是編碼缺陷的常見來源,可能會導致程序崩潰和其它意外行為。如果你嘗試訪問一個空引用,以為它是一個對象的有效引用一樣 - 例如,通過訪問一個屬性或方法,運行時將拋出一NullReferenceException異常。

靜態和動態分析工具可以幫助你在發布代碼之前識別潛在的NullReferenceException異常。在C#中,空引用通常由尚未引用對象的變量引起。對于空值類型和引用類型來說,Null是一個有效值。例如,Nullable <Int>,空委托,取消訂閱事件,會在“as”轉換,以及在許多其他情況下失敗。

每個空引用異常是都一個錯誤。不應該去捕獲NullReferenceException,而應該嘗試在使用它們之前測試對象是否為null。這也使得代碼更容易被最小化try / catch塊讀取。

從數據庫表中讀取數據時,請確保,缺失值可以表示為DBNull對象,而不是空引用。不要指望它們表現的像潛在的空引用。

將十進制值替換為二進制數

浮點數和雙精度表示二進制有理數,不是小數有理數,在存儲十進制值時必須使用二進制的近似值。從十進制的角度來看,這些二進制近似具有不一致的舍入和精度 - 有時導致算術運算的意外結果。因為浮點運算通常在硬件中執行,硬件條件可能會不可預測地加劇這些差異。

當小數精度非常重要時,使用十進制,就像財務計算等情況。

修改結構

一個常見的錯誤情況是忘記結構體是值類型的,這就意味著它們被復制了并且通過值來進行傳遞。假設你有這樣的代碼:

struct P { public int x; public int y; }
void M() {
   P p = whatever;
   …
   p.x = something;
   …
   N(p);

有一天,維護者決定將代碼重構為:

void M() {
   P p = whatever;
   Helper(p);
   N(p);
}
void Helper(P p) { 
   …
   p.x = something;

現在當在M()中調用N(p)時,p具有錯誤的值。調用助手(p)傳遞p的副本,而不是p的引用,因此Helper()中執行的變化將丟失。相反,Helper會返回修改的p的副本。

意外的算術

C#編譯器保護你出現常量的算術溢出,但不一定是計算值。

忽略保存返回值

與結構體不同,類是引用類型,方法可以修改引用的對象。然而,不是所有的對象方法都實際修改了引用的對象,一些會返回一個新對象。當開發人員調用后者時,他們需要記住將返回值賦給變量,以便使用修改后的對象。在代碼審查期間,這種類型的問題通常在會被發現。一些對象,如字符串,是不可變的,所以方法從不修改這些對象。即使如此,開發人員也會通常忘記。

例如,考慮string.Replace():

string label = “My name is Aloysius”;
label.Replace(“Aloysius”, “secret”);

 代碼打印“我的名稱是Aloysius”,因為Replace方法不修改字符串。

不要使迭代器/枚舉器變得無效

不要在迭代時修改集合。

List<Int> myItems = new List<Int>{20,25,9,14,50};
foreach(int item in myItems)
{
    if (item < 10)
    {
        myItems.Remove(item);
        // iterator is now invalid!
        // you’ll get an exception on the next iteration

如果你運行這個代碼,一旦循環到集合中的下一個項目時。你會收到一個異常拋出。

正確的解決方案,是使用第二個列表來保存你要刪除的項目,然后在刪除時迭代該列表:

List<Int> myItems = new List<Int>{20,25,9,14,50};
List<Int> toRemove = new List<Int>();
foreach(int item in myItems)
{
   if (item < 10)
   {
        toRemove.Add(item);         
   }
}
foreach(int item in toRemove)
{

或者如果你使用C#3.0或更高版本,你可以使用List <T> .RemoveAll。

就像這樣:

myInts.RemoveAll(item => (item < 10));

屬性名稱錯誤

在實現屬性時,請注意屬性名稱不同于類中使用的數據成員。在訪問屬性時,容易意外使用相同的名稱,并導致出現***遞歸的情況。

// The following code will trigger infinite recursion
private string name;
public string Name
{
    get
    {
        return Name;  // should reference “name” instead.

當重命名間接屬性時要小心。例如,WPF中的數據綁定,會將屬性名稱指定為字符串。如果不小心更改該屬性名稱,你將會無意中創建了一個編譯器無法防護的問題。

以上就是所有C#開發人員應該知道的13件事情。

原文鏈接:https://dzone.com/refcardz/csharp

責任編輯:張燕妮 來源: 開源中國社區
相關推薦

2013-01-10 10:10:11

Web開發Web工具

2020-01-06 17:45:13

GitJavaScriptCSS

2015-07-28 16:38:56

App移動開發

2011-12-29 09:15:19

開發

2009-09-10 14:18:03

PHP庫

2020-04-29 08:28:11

React開發代碼

2017-10-11 13:20:56

Linux命令工程師

2020-01-27 16:28:57

開發命令遠程服務器

2023-04-07 16:11:56

前端開發

2020-07-06 07:48:42

開發成功技巧

2023-10-26 16:56:24

2022-12-16 08:14:00

2009-01-11 10:18:46

腳本語言F#Groovy

2023-03-08 15:13:32

Git工具開發

2022-04-30 08:58:00

SpringJava開發

2013-01-28 10:25:46

開發人員設計技巧

2011-07-10 15:18:11

開發

2024-06-04 14:31:16

2023-07-11 16:45:32

VS Code開發技巧

2024-06-03 10:35:41

點贊
收藏

51CTO技術棧公眾號

91在线视频| 免费看污视频的网站| 91麻豆精品激情在线观看最新| 亚洲成人1区2区| 青青成人在线| a天堂在线视频| 99伊人成综合| www.亚洲成人| a视频免费观看| 成人国产一区二区三区精品麻豆| 一区二区三区在线看| 欧美精品一区二区三区四区五区| 国产精品无码AV| 国产精品女主播一区二区三区| 少妇高潮 亚洲精品| 美女伦理水蜜桃4| yy6080久久伦理一区二区| 亚洲一区中文在线| 亚洲开发第一视频在线播放| 日本激情视频网站| 韩国一区二区在线观看| 91精品国产91久久久| 污软件在线观看| 激情五月综合| 日韩精品在线播放| 美国黄色一级视频| 国产精品欧美一区二区三区不卡 | av电影天堂一区二区在线观看| 国产精品视频免费在线| av大片在线免费观看| 亚洲成人一区| 最近日韩中文字幕中文| 日本高清www| 精品按摩偷拍| 精品国产乱码久久久久久久| 天美一区二区三区| 黑人一区二区三区| 91官网在线观看| 国产又黄又猛视频| www.精品| 日韩欧美高清视频| 熟女少妇在线视频播放| 菠萝蜜视频在线观看www入口| 亚洲女人****多毛耸耸8| 亚洲精品在线免费| 视频三区在线| 中文字幕在线观看一区| 中文视频一区视频二区视频三区| av在线电影网| 国产人成一区二区三区影院| 精品国产91亚洲一区二区三区www| 亚洲av无码乱码国产精品| 国产一区二区福利| 51成人做爰www免费看网站| 91在线你懂的| 久久99精品国产麻豆婷婷| 成人h视频在线观看播放| 中文字幕永久免费视频| 日韩av二区在线播放| 人九九综合九九宗合| 久草视频一区二区| 蜜桃视频在线观看一区| 91精品久久久久久久久久久久久久 | 亚洲欧洲一区| 国产69久久精品成人| 色av性av丰满av| 三级成人在线视频| 成人高h视频在线| av中文在线观看| 成人午夜精品一区二区三区| 精品亚洲一区二区三区四区五区高| 天堂v视频永久在线播放| 久久久久久日产精品| 亚洲精品免费在线看| 久久黄色美女电影| 亚洲伊人色欲综合网| 亚洲精品无码久久久久久| 亚洲四虎影院| 欧美一区二区免费视频| 在线xxxxx| av中文一区| 色中色综合影院手机版在线观看| 伊人久久综合视频| 麻豆精品久久久| 国产传媒一区二区三区| 国产日产精品久久久久久婷婷| 亚洲欧洲国产日本综合| a级黄色一级片| 国内自拍亚洲| 亚洲精品国产综合久久| 久久午夜精品视频| 亚洲日产国产精品| 国产精品丝袜视频| 黄色三级网站在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 蜜臀av性久久久久蜜臀av| 亚洲淫成人影院| 欧美一区二区福利在线| 最近日本中文字幕| 68国产成人综合久久精品| 欧美亚州一区二区三区| 国产人妖一区二区| 久久精品亚洲精品国产欧美| 国产91porn| 69堂精品视频在线播放| 亚洲国产精品高清久久久| 中文乱码字幕高清一区二区| 国产一区二区三区久久| 51精品国产人成在线观看| 国产系列电影在线播放网址| 亚洲一卡二卡三卡四卡五卡| 午夜精品中文字幕| 国产一区二区亚洲| 欧美一级成年大片在线观看| 午夜精品久久久久久久96蜜桃| 国产亚洲精久久久久久| 黄色大片中文字幕| 免费一级欧美在线大片| 色偷偷综合社区| 无码人妻精品一区二区三区9厂| 成人午夜av影视| 特级黄色录像片| 国产成人久久精品麻豆二区| 亚洲精品视频中文字幕| 日本一区二区欧美| 国产成人啪免费观看软件| 一区不卡视频| 99欧美精品| 亚洲色图欧美制服丝袜另类第一页| 精品在线视频免费| 国产成人在线视频网址| 福利在线小视频| 成人免费91| 久久九九有精品国产23| 一级特黄色大片| 国产精品少妇自拍| 国产91色在线观看| 成人女性视频| 国产精品欧美日韩| 香蕉视频在线播放| 欧美另类videos死尸| 夫妇露脸对白88av| 精品一区二区在线免费观看| 五月天亚洲综合小说网| 成人四虎影院| 久久精品国产一区二区电影| 国产精品久久久久久久久久久久久久久久| 国产精品免费视频一区| 亚洲精品20p| 亚洲精品久久| 成人欧美一区二区三区视频 | 亚洲欧美自偷自拍| 婷婷国产v国产偷v亚洲高清| 国产精品久久不卡| 久久这里只有| 亚洲欧美丝袜| 欧美a级大片在线| 久久久久久国产精品| 日本免费不卡视频| 精品久久久免费| 中文字幕被公侵犯的漂亮人妻| 噜噜噜久久亚洲精品国产品小说| 日韩久久久久久久久久久久久| 朝桐光一区二区| 最新国产精品亚洲| 国产成人久久精品77777综合| 一区二区激情小说| yjizz视频| 麻豆成人在线| 一区二区高清视频| 欧美三级一区| 97人人模人人爽人人喊中文字| 精品人妻一区二区三区蜜桃| 亚洲精品成人悠悠色影视| 国产xxxx视频| 久久性色av| 国产又粗又大又爽的视频| 精品福利网址导航| 国产精品久久久久久久久久久久 | 亚洲精品国产精品乱码不卡| 天天亚洲美女在线视频| 国产无遮挡在线观看| 国产99久久久久久免费看农村| 日韩欧美国产综合在线| 欧美精品一区二区三区精品| 91精品国产一区二区三区动漫| 极品在线视频| 久久精品夜夜夜夜夜久久| 日本黄色大片视频| 欧美日韩色一区| 日本中文字幕网| 国产精品无人区| 亚洲一区二区三区黄色| 奇米777欧美一区二区| 欧美国产日韩激情| 成人系列视频| 久久久久久亚洲精品不卡4k岛国 | 天堂蜜桃一区二区三区 | 18视频在线观看网站| 亚洲精品在线视频| 国内老熟妇对白xxxxhd| 日本韩国欧美在线| 日韩av无码中文字幕| 国产精品乱人伦| 色欲av无码一区二区三区| 国产寡妇亲子伦一区二区| 国产成人精品无码播放| 亚洲精选在线| 欧洲金发美女大战黑人| 成人精品中文字幕| 精品欧美国产一区二区三区不卡| 99er精品视频| 国产精品久久久久久一区二区| 俺来也官网欧美久久精品| 久久精品国产欧美亚洲人人爽 | 最新国产精品拍自在线播放| 日中文字幕在线| 亚洲精品一区二区三区在线观看| 中文字幕av无码一区二区三区| 婷婷国产v国产偷v亚洲高清| 国产小视频在线观看免费| 国产精品国产三级国产| 中文字幕免费视频| 久久日韩粉嫩一区二区三区| 成人免费看片载| 国产美女在线精品| jizz18女人| 美女国产一区二区三区| 日本成人中文字幕在线| 午夜在线视频一区二区区别 | 亚洲女同志freevdieo| 国语自产偷拍精品视频偷| 天使と恶魔の榨精在线播放| 久久婷婷国产麻豆91天堂| 91xxx在线观看| 正在播放亚洲1区| 川上优的av在线一区二区| 亚洲欧美日韩网| 日本一级在线观看| 亚洲欧美日韩一区二区三区在线| 五月婷婷狠狠干| 日韩大片免费观看视频播放| 五月天婷婷激情网| 亚洲伦理中文字幕| 国产在线观看高清视频| 亚洲三级av在线| youjizz在线播放| 深夜福利国产精品| 成人免费网址| 欧美美最猛性xxxxxx| 国产盗摄一区二区| 992tv成人免费影院| 亚洲精品**中文毛片| 国产成人精品av在线| 天然素人一区二区视频| 国产美女91呻吟求| 九九99久久精品在免费线bt| 99国产超薄丝袜足j在线观看 | 亚洲精品乱码久久久久久按摩观| 污视频在线免费| 亚洲色图17p| 久久99精品久久久久久野外| 美女福利精品视频| а√在线中文网新版地址在线| 国内精品一区二区三区| 国产精品一区二区av影院萌芽| 国产精品久久久久9999| 国产精品777777在线播放| 国产精品二区在线观看| 蜜桃精品wwwmitaows| 亚洲一区二区三区午夜| 欧美日韩hd| 国内外成人激情视频| 日av在线不卡| 国产裸体视频网站| 久久色在线视频| 免费看特级毛片| 欧美日韩免费在线| 一区二区三区黄色片| 精品国产一区二区三区久久影院| 青春有你2免费观看完整版在线播放高清 | 国产情侣久久久久aⅴ免费| 26uuu色噜噜精品一区| 青青草华人在线视频| 一区二区三区在线播| 人妻丰满熟妇av无码区| 欧美精品 日韩| 凸凹人妻人人澡人人添| x99av成人免费| 婷婷电影在线观看| 91亚洲va在线va天堂va国 | 成人黄色91| 久久福利电影| 一个色综合网| 蜜臀视频一区二区三区| 丰满放荡岳乱妇91ww| 国产极品视频在线观看| 精品福利视频导航| 91久久精品国产91性色69 | 国产一区在线观| 婷婷综合伊人| 黄色片视频在线播放| 成人夜色视频网站在线观看| 你懂得视频在线观看| 欧美日韩国产一区二区| 精品国产亚洲av麻豆| 中文字幕久久久| 欧美a级在线观看| av日韩中文字幕| 99久久激情| av免费网站观看| 91丨porny丨国产入口| 精品国产乱码久久久久久鸭王1 | 欧美777四色影视在线 | 国产成人精品一区二区三区视频| 精品欧美一区二区久久久伦 | 97激碰免费视频| 欧美1区2区3| 99热都是精品| 久久精品久久综合| 国产91丝袜美女在线播放| 精品久久久久久久久中文字幕 | 中文字幕巨乱亚洲| 国产免费av一区| 亚洲精品成人久久电影| 久草在线资源站资源站| 99久久精品久久久久久ai换脸| 久久在线视频免费观看| 8x8x最新地址| 国产色综合久久| 亚洲av无码精品一区二区| 日韩精品高清在线| 天堂网在线最新版www中文网| 韩日午夜在线资源一区二区| 国产精品www.| 免费看91视频| 亚洲午夜羞羞片| 少妇一区二区三区四区| 久久免费精品视频| 美女网站色精品尤物极品姐弟| 日韩一级性生活片| www.色综合.com| 在线观看 中文字幕| 日韩精品极品视频| 桃花岛tv亚洲品质| 日韩高清国产一区在线观看| 日韩精品视频网站| 天美传媒免费在线观看| 在线综合亚洲欧美在线视频| 黄色在线视频网站| 4444kk亚洲人成电影在线| 在线国产精品一区| 国产精品jizz| 欧洲中文字幕精品| 日本在线人成| 91传媒在线免费观看| 99国产精品自拍| 色哟哟精品观看| 8v天堂国产在线一区二区| 直接在线观看的三级网址| 国产精品.com| 一区二区三区福利| 性欧美精品男男| 在线综合亚洲欧美在线视频| 91丝袜在线| 日本成人三级| 国内久久婷婷综合| 国产一级大片在线观看| 精品一区电影国产| 国产成人精选| youjizz.com在线观看| 2021中文字幕一区亚洲| 一级黄色片免费看| 久久久伊人日本| 欧洲杯足球赛直播| 真实乱偷全部视频| 一本色道久久加勒比精品| 日本在线免费| 久久精品国产综合精品| 日韩成人一区二区三区在线观看| 91精品少妇一区二区三区蜜桃臀| 精品蜜桃在线看| 国产日韩另类视频一区| 国产又粗又长又爽视频| 91免费在线视频观看| 国产女人高潮的av毛片| 欧美亚洲另类制服自拍| 婷婷综合激情| 99久久久久久久久久| 欧美男男青年gay1069videost| 国产白浆在线免费观看| 中文字幕人成一区| 91蜜桃在线观看| 国产成人三级一区二区在线观看一| 4388成人网| 在线精品视频在线观看高清| 久久久久久国产精品无码| 日韩欧美国产高清| 日韩高清不卡| 春日野结衣av|