學(xué)習(xí)和使用C#這么久,也有了些可以跟大家分享的經(jīng)驗(yàn)和教訓(xùn),這里分享下幾個(gè)關(guān)于C#開(kāi)發(fā)的小技巧:
1. 輸出變量的名稱。
需求:有時(shí)候我們?cè)跍y(cè)試或平時(shí)練習(xí)的時(shí)候可能想把變量的值和它自身的名稱一起輸入到屏幕或者其他地方,而不是自己在代碼中寫變量名。如:
var A = 10;
Console.WriteLine("Var Name:A,Value:{0}", A);
實(shí)現(xiàn):實(shí)現(xiàn)這個(gè)功能有兩種方式。讀者不妨也思考一下有沒(méi)有其他更好的方式實(shí)現(xiàn)這個(gè)功能。
a. 我首先給出通過(guò)匿名類型和反射的實(shí)現(xiàn)方式。
{
public static string GetVariableName<T>(this T obj)
{
System.Reflection.PropertyInfo[] objGetTypeGetProperties = obj.GetType().GetProperties();
if (objGetTypeGetProperties.Length == 1)
return objGetTypeGetProperties[0].Name;
else
throw new ArgumentException("object must contain one property");
}
}
//調(diào)用方式,我們通過(guò)匿名類型構(gòu)造對(duì)象,然后通過(guò)反射獲取它內(nèi)部屬性
static void main()
{
string testVar1 = "testName";
Console.WriteLine(new { testVar1 }.GetVariableName());
int testVar2 = 12345;
Console.WriteLine(new { testVar2 }.GetVariableName());
}
b. 通過(guò).NET 3 中的Lamda表達(dá)式這里給出另外一個(gè)更加方便的實(shí)現(xiàn)方式。
{
Console.WriteLine("{0}={1}",
((MemberExpression)expression.Body).Member.Name,
expression.Compile()());
}
static void main()
{
string testVar1 = "testName";
WriteName(() => testVar1);
}
2. 字符串轉(zhuǎn)換為基本類型
需求:在日常編程中,我們經(jīng)常要在文件或用戶輸入界面中將一些字符串變量轉(zhuǎn)換為常用類型,當(dāng)然我們可以用System.Convert類來(lái)完成這項(xiàng)工作,但如果有大量轉(zhuǎn)換工作進(jìn)行的時(shí)候,這種代碼看起來(lái)很不方便,這時(shí)候我們可以通過(guò).net的一些新的特性來(lái)很方便的完成這項(xiàng)工作
實(shí)現(xiàn):通過(guò)擴(kuò)展方法,反射和泛型可以很方便完成這項(xiàng)工作。
{
static T? To<T>(this string parse)
where T : struct
{
Type t = typeof(T);
if (t == typeof(int))
{
int i;
if (int.TryParse(parse, out i))
return (T)(object)i;
return null;
}
if (t == typeof(double))
{
double i;
if (double.TryParse(parse, out i))
return (T)(object)i;
return null;
}
//添加其他類型的轉(zhuǎn)換代碼,如DateTime,Enum,etc;
throw new NotSupportedException(string.Format("類型:{0}轉(zhuǎn)換不支持",t.Name));
}
}
//使用函數(shù)
static void main()
{
int? a="111".To<int>();
double? b="111.111".To<double>();
int? c="bad".To<int>();
}
不過(guò)這個(gè)轉(zhuǎn)換代碼中由于有兩個(gè)類型轉(zhuǎn)換才能通過(guò)編譯,所以看起來(lái)仍然沒(méi)那么舒服,希望大家能有更好的方式實(shí)現(xiàn)。
3. WinForm編程中線程安全調(diào)用組件。
需求:在.net 1.0的時(shí)候在其他線程中操作Win Form 主線程組件時(shí)候是可以直接操作的,但這也帶來(lái)了潛在的風(fēng)險(xiǎn)。于是在2.0以后跨線程操作你需要通過(guò)BeginInvoke來(lái)完成該項(xiàng)操作,但這也讓代碼看起來(lái)很拖沓,有時(shí)用戶可能僅僅只需要在線程某項(xiàng)操作完成后僅僅更新窗口中的某個(gè)組件,如進(jìn)度條而已,卻需要另外寫一個(gè)函數(shù)去實(shí)現(xiàn)。
實(shí)現(xiàn): 拖過(guò)擴(kuò)展函數(shù)和匿名方法可以很方便的完成窗口線程和其他線程之間的交互工作。下面給出了一個(gè)簡(jiǎn)單的實(shí)現(xiàn),當(dāng)然,如果你需要更安全的調(diào)用,還需要添加一些檢測(cè),如IsHandleCreated檢測(cè),另外如果你需要傳遞參數(shù),你可能需要另外定義一個(gè)委托.
{
public delegate void InvokeHandler();
public static void SafeInvoke(this Control control, InvokeHandler handler)
{
if (control.InvokeRequired)
{
control.Invoke(handler);
}
else
{
handler();
}
}
}
//在form中當(dāng)用戶在非form線程中需要操作form中組件對(duì)象時(shí),調(diào)用如下
public form:Form
{
public form()
{
Thread t=new Thread(t1);
t.start();
}
void t1()
{
Thread.Sleep(1000);
this.SafeInvoke(() => this.textBox1.Text = "Hello world");
}
}
上面只是平時(shí)碰到或者從別人那里學(xué)到的一些小的編程技巧,希望能對(duì)其他人也有所幫助。有機(jī)會(huì)的話希望能把我更多的自認(rèn)為好的總結(jié)發(fā)出來(lái)。
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】