這麼多年,學習及工作中積累了一些零零碎碎的小筆記及技巧(C#),重溫和匯總一下。
1. 類別轉換時,如果你未能確定數值有效,使用TryParse 比 Parse 要更安全, TryParse 不會引發異常。 2. ?同?? 1) 數據類型? 表示該類型變量可被賦為Null 例如: int 類型的默認值為0,int? 默認為 null int i; //默認為0 int? i ; //默認為null 2) ?? 如果變量為null 時,默認的值 例如: int j; int? i; j= i ?? 10 ; //j 為 10 3. readonly 與 const 的使用 1) readonly 是運行時常量 2)const 是編譯時常量,它是 static的,因此不能 寫為 static const int constval=100; 3)const 效率相對高。
4. 數值類型 與 引用類型的 相等 1)對于數值類型,如果兩者的值相等,則返回 true 2)對於引用類型,如果指向同一個對象(地址)則返回 true; 3)對於 string 類型,則例外,它是判斷值相等。
5. using 是 try{…} finally{ xx.Dispose();} 的語法魔棒,最后會將對象自動 Dispose() 6. 大多數情況下 用 foreach 代替 for , 因為語法更簡單,以及自動帶 dispose. 但是 如果遍歷的過程中對自身變量進行增刪除操作時,則不能用 foreach. 7. 儘量使用泛型集合List 代替非泛型集合ArrayList,ArrayList的元素是 object ,存在 裝箱拆箱的性能損耗。 8. Linq 中的延遲求值和主動求值 例如:
List<int> list = new LIst<int>(){0,1,2,3,4,5,6,7};
var temp1 = form c in list where c> 5
select c;
var temp2 = (from c in list where c > 5
select c).ToList<int>();
list[0] = 11;
foreach (var item in temp1)
{
console.writeline(item.tostring());
}
foreach(var item in temp2)
{
console.writeline(item.tostring());
}
9. IEnumerable 與 IQueryable 的區別 1)IEnumerable 相對適合于 Linq to object,對本地集合進行查詢,排序等,可以用自定義主法。 2)IQueryable 相對適合于Linq to sql , 對遠端資料進行查詢等操作。不可以用自定義方法。 10. 委派 委派有兩個要點。第一委派是方法指針;第二委派是一個類。 例子:
delegate int AddHandler(int i,int j );
delegate int PrintHandler(string msg);
static void Main(stirng[] args)
{
AddHandler add = Add;
PrintHandler print = Print;
print(add(1,2).ToString());
}
static int Add(int i,int j)
{
return i+j;
}
static void Print(string msg)
{
console.writeline(msg);
}
注:上面的 委派定義 delegate 也可以直接用 Action,Fun 代替
static void Main(string[] args)
{
Func<int,int,int> add = Add;
Actoin<String> print =Print;
print(add(1,2).ToString());
}
另: 一個Action委派加 并行的例子
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadSafeCollectionDemo
{
class Program
{
static void Main(string[] args)
{
ConcurrentBag<string> bag = new ConcurrentBag<string>();
Console.WriteLine($"当前包的元素个数【{bag.Count}】,是否为空【{bag.IsEmpty}】");
Task task1 = Task.Run(() =>
{
bag.Add("北洛");
bag.Add("云无月");
});
Task task2 = Task.Run(() =>
{
bag.Add("岑缨");
bag.Add("姬轩辕");
});
Task.WaitAll(task1, task2);
bag.Add("岑缨");
Console.WriteLine($"当前包的元素个数【{bag.Count}】,是否为空【{bag.IsEmpty}】");
Action action = new Action(() =>
{
string element;
while (bag.TryTake(out element))
{
Console.WriteLine($"取出元素:【{element}】,当前线程编号:【{Thread.CurrentThread.ManagedThreadId}】");
}
});
Parallel.Invoke(action, action);
string result;
if (bag.TryPeek(out result))
{
Console.WriteLine($"包存在元素:【{result}】");
}
else
{
Console.WriteLine("包当前没有元素");
}
Console.WriteLine($"当前包的元素个数【{bag.Count}】,是否为空【{bag.IsEmpty}】");
Console.ReadLine();
}
}
}
(未完,,,待續)
|