VS 裡的 ==, 與 Object.Equals 是不同的.
來個程式碼吧, 這樣比較好解釋.
object a1 = 1;
object a2 = 1;
Console.WriteLine(string.Format("object a1==a2 {0}", a1 == a2));//false
Console.WriteLine(string.Format("object a1.Equals(a2) {0}", a1.Equals(a2)));//true
Console.WriteLine();
object s1 = "s1";
object s2 = "s1";
Console.WriteLine(string.Format("object s1==s2 {0}", s1 == s2));//true
Console.WriteLine(string.Format("object s1.Equals(s2) {0}", s1.Equals(s2)));//true
Console.WriteLine();
object r1 = new List<string>();
object r2 = new List<string>();
Console.WriteLine(string.Format("List<string> r1==r2 {0}", r1 == r2));//false
Console.WriteLine(string.Format("List<string> r1.Equals(r2) {0}", r1.Equals(r2)));//false
Console.ReadKey();
py3939 發表在 痞客邦 留言(1) 人氣(4,530)
使用過如泛型 List 的人都知道, 當我有數值要排序的時候很簡單, 因為這是泛型具備的功能. 可是當自訂的 Class 要怎樣做呢?
其實很簡單, 只要繼承自 IComparable, 外加實做 CompareTo Method 就可以了. 看看 List.Sort 的說明及其多型就知道了.
這個方法會使用型別 T 的預設比較子 Comparer<T>.Default,以判斷清單項目的順序。 Comparer<T>.Default 屬性會檢查型別 T 是否實作 IComparable<T> 泛型介面,並使用該實作 (如果可用的話)。 如果不是,則 Comparer<T>.Default 會檢查型別 T 是否實作 IComparable 介面。 如果型別 T 不實作這兩種介面,則 Comparer<T>.Default 會擲回 InvalidOperationException。
List.Sort () 使用預設比較子來排序在整個 List 中的項目。
List.Sort (泛型 Comparison) 使用指定的 System.Comparison 來排序在整個 List 中的項目。
List.Sort (泛型 IComparer) 使用指定的比較子來排序在整個 List 中的元素。
py3939 發表在 痞客邦 留言(0) 人氣(5,532)
http://msdn.microsoft.com/zh-tw/library/yz2be5wk.aspx
Boxing 和 Unboxing
Boxing 處理是將實值型別轉換成 object 型別,或是任何由這個實值型別實作的介面型別。 當 CLR Box 處理實值型別時,它會將值包裝在 System.Object 中,並儲存在 Managed 堆積上。 Unbox 處理則會從物件擷取實值型別。 Boxing 是隱含的;unboxing 是明確的。 boxing 和 unboxing 的概念是 C# 型別系統統一檢視的基礎,其中可將任何型別的值視為物件。
在下列範例中,會以「Box」處理整數變數 i,然後將此變數指派給物件 o。
int i = 123;
// The following line boxes i.
object o = i;
物件 o 接著即可經 Unbox 處理,並指派給整數變數 i:
o = 123;
i = (int)o; // unboxing
py3939 發表在 痞客邦 留言(0) 人氣(831)
StringBuilder
String 或 StringBuilder 物件之串連作業的效能是根據記憶體的配置頻率而定。String 串連作業永遠都會配置記憶體,而 StringBuilder 串連作業只有在 StringBuilder 物件緩衝區太小而無法容納新資料時,才會配置記憶體。因此,如果要串連固定數目的 String 物件,最好使用 String 類別的串連作業。在這種情況下,編譯器 (Compiler) 甚至可能將個別的串連作業結合成一個單一作業。如果要串連任意數目的字串 (例如,如果迴圈串連任意數目的使用者輸入字串),則對於串連作業來說最好使用 StringBuilder 物件。
屬性
Capacity 取得或設定由目前執行個體配置的記憶體可以包含的最大字元數。
Length 取得或設定目前 StringBuilder 物件的長度。
方法
Append 多載。 將指定物件的字串表示附加至這個執行個體的尾端。
AppendFormat 多載。 將格式化的字串 (其中包含零或更多的格式規格) 附加至這個執行個體。每一個格式規格會由對應之物件引數的字串表示所取代。
EnsureCapacity 請確定這個 StringBuilder 其執行個體的容量至少是某一指定的值。
Insert 多載。 在指定的字元位置上將指定物件的字串表示插入這個執行個體。
Remove 從這個執行個體移除指定的字元範圍。
ToString 多載。 覆寫。 將 StringBuilder 的值轉換為 String。
StringBuilder串接字串的迷思
http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/12/15/stringbuilder-for-static-string-concate.aspx
StringBuilder被拿來串接靜態變數=4152ms
string 直接指定靜態值=6ms
@"..."=7ms
StringBuilder與String的字串相接效能大車拼
http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/09/07/article-stringbuilder-vs-string.aspx
py3939 發表在 痞客邦 留言(0) 人氣(836)
List
表示可以依照索引存取的強型別物件清單。 提供搜尋、排序和管理清單的方法。
建構函式
List<T>() 其為空白執行個體且具有預設的初始容量。
List<T>(IEnumerable<T>) 從指定之集合複製的元素,且具有容納複製之元素數目的足夠容量。
List<T>(Int32) 這個執行個體是空白且可具有指定的初始容量。
屬性
Capacity 在不需要調整大小之下,取得或設定內部資料結構可以保存的元素總數。
Capacity 是需要調整大小前 List<T> 可以存放的元素數目。Count 則是 List<T> 中實際含有的元素數目。
Capacity 永遠大於或等於 Count。 加入元素時,如果 Count 超過 Capacity,則會先藉由自動重新配置內部陣列而增加容量,然後再複製舊元素並加入新元素。
可以透過呼叫 TrimExcess 方法或明確地設定 Capacity 屬性的方式來降低容量。 當明確地設定 Capacity 的值時,也會重新配置內部陣列以容納指定的容量,並且會複製所有元素。
http://msdn.microsoft.com/zh-tw/library/y52x03h2.aspx
方法
Add 將物件加入至 List<T> 的結尾。
AddRange 將特定集合的元素加入至 List<T> 的結尾。
BinarySearch(T) 使用預設的比較子 (Comparer) 並傳回元素以零起始的索引,來搜尋元素之整個排序的 List<T>。 必須已經依照比較子實作排序過,否則結果會不正確。這個方法為 O(log n) 運算。
BinarySearch(T, IComparer<T>) 使用指定的比較子並傳回元素以零起始的索引,來搜尋元素之整個排序的 List<T>。
Clear 將所有元素從 List<T> 移除。
Contains 判斷某元素是否在 List<T> 中。 這個方法是 O(n) 運算。
CopyTo(T[]) 將整個 List<T> 複製到相容的一維陣列,從目標陣列的開頭開始。
Find 搜尋符合指定之述詞所定義的條件之元素,並傳回整個 List<T> 內第一個相符的項目。
IndexOf 多載。 傳回 List 或其中一部分中值的第一個項目之以零起始的索引。
Insert 將項目插入 List 中指定的索引處。
InsertRange 將集合的元素插入至位於指定索引的 List 中。
Remove 從 List 移除特定物件的第一個相符項目。
RemoveAt 移除 List 中指定之索引處的項目。
Sort 多載。 排序 List 或其中一部分中的元素。
ToArray 將 List 的元素複製到新的陣列。
TrimExcess 將容量設為 List 中項目的實際數目,如果該數目小於臨界值。
py3939 發表在 痞客邦 留言(0) 人氣(14,204)
沒想到要在 C# 中使用, Thread Pool 這麼簡單.
如下簡單範例, 當然實際的程式不可能這樣, 但這是一個好入門概念.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadPoo
{
class ThreadPool1
{
static void Main(string[] args)
{
System.Threading.WaitCallback waitCallback = new WaitCallback(MyThreadWork);
ThreadPool.QueueUserWorkItem(waitCallback, "First");
ThreadPool.QueueUserWorkItem(waitCallback, "Second");
ThreadPool.QueueUserWorkItem(waitCallback, "Third");
Console.WriteLine("Main thread exits.");
Console.ReadKey();
}
static void MyThreadWork(object state)
{
Console.WriteLine("Begin of {0}", (string)state);
Thread.Sleep(5000);
Console.WriteLine("End of {0}", (string)state);
}
}
}
py3939 發表在 痞客邦 留言(0) 人氣(7,793)
C# function 執行失敗時, 重複執行.
一般當我寫一個 function, 當這個 function 執行失敗, 我們希望可以再執行幾次, 看是否可以成功, 這是蠻常見的情況, 舉一個 ftp List() function程式的例子就有這樣的需求, 因為 List() 其實是下一個 LIST 的 command, 如下 :
public ArrayList List() { Connect(); OpenDataSocket(); try { SendCommand("LIST"); } catch (Exception ex) { log.Warn(MethodBase.GetCurrentMethod() + ex.Message); throw ex; } ReadResponse(); return list; } |
py3939 發表在 痞客邦 留言(0) 人氣(2,628)
在解說 DBConcurrencyException 之前有一些觀念必須先說清楚, 所以就先講一些必要的觀念, 最後在說明主題.
1.使用 DataAdapter.Update 時,DataAdapter 會分析已進行的變更,並執行適當的命令 (INSERT、UPDATE 或 DELETE), 詳細的MSDN文章說明參考 : 以 DataAdapter 更新資料來源. 一般的程式這樣就夠用了.
程式範例如下 :
py3939 發表在 痞客邦 留言(0) 人氣(592)
NMock 詳細的說明可以上官方網站詳讀. 簡單的說NMock 是一個 .NET 的動態 mock 物件, 當我們的測試標的與其他 class 有關聯時, 提供一種模擬技術, 方便於我們可以單獨測試此一標的 class.
舉一個學生成績系統為例 : 有兩個人正在進行此系統開發.
Jack 負責 TotalSummary class, 此 class 有一個 Sum method, 會傳回所指定的同學 ID 所有科目的成績總和.
Alan 負責主程式, 進行到計算出第一名的同學是誰 GetTop1 method, GetTop1 實做的方式是依據每位同學的 ID 當作輸入值, 呼叫 TotalSummary.Sum() 取的總分來判斷出第一名的同學.
py3939 發表在 痞客邦 留言(0) 人氣(293)