歡迎來到《小5講堂》
大家好,我是全棧小5。
這是《C#》序列文章,每篇文章將以博主理解的角度展開講解,
特別是針對知識點的概念進(jìn)行敘說,大部分文章將會對這些概念進(jìn)行實際例子驗證,以此達(dá)到加深對知識點的理解和掌握。
溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!
前言
上篇文章已經(jīng)通過封裝方法的形式,實現(xiàn)了倒計時公共代碼的封裝。
通過代碼的封裝,不僅代碼減少了,也提高了代碼的可維護(hù)性,一舉多得,何樂不為。
這也是編程最有魅力的地方,隨著編碼經(jīng)驗的增多以及不停的學(xué)習(xí),就會滿滿理解和領(lǐng)悟一些知識點,理論以及設(shè)計思想。
【C#】當(dāng)重復(fù)使用一段代碼倒計時時,使用普通類和靜態(tài)方法,實現(xiàn)簡單的封裝性、可擴(kuò)展性、可維護(hù)性
優(yōu)化前
優(yōu)化前,是通過在每個窗體添加一段倒計時異步方法代碼,然后窗體界面添加一個label標(biāo)簽用于顯示當(dāng)前實時時間。
界面
代碼
/// <summary>
/// 倒計時
/// </summary>
private void CurrentTime()
{
Task.Run(() =>
{
while (true)
{
lbTime.Text = $"當(dāng)前時間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";
Thread.Sleep(1000);
}
});
}
優(yōu)化后
這次優(yōu)化是通過靜態(tài)類靜態(tài)方法實現(xiàn),并且是使用this進(jìn)行擴(kuò)展。
同時把控件初始化位置以及高寬度大小設(shè)置成獨立的變量成員,可對其進(jìn)行賦值,否則使用默認(rèn)值。
界面
代碼
- 封裝方法
/// <summary>
/// 靜態(tài)類擴(kuò)展方法
/// 對于靜態(tài)類,方法必須是靜態(tài)屬性
/// </summary>
public static class TimeLabelExtend
{
public static int X = 50;
public static int Y = 50;
public static int Width = 179;
public static int Height = 15;
public static void TimeLabel(this Form targetForm)
{
// 擴(kuò)展方法必須在[非泛型][靜態(tài)類]中定義
Label label = new Label();
label.Location = new Point() { X = X, Y = Y };
label.Width = Width;
label.Height = Height;
targetForm.Controls.Add(label);
Task.Run(() => {
while (true)
{
label.Text = $"當(dāng)前時間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";
Thread.Sleep(1000);
}
});
}
}
- 窗體1
private void Test1_Load(object sender, EventArgs e)
{
//TimeLabel.Time(this, 50, 50);
this.TimeLabel();
}
private void button1_Click(object sender, EventArgs e)
{
Test2 test2 = new Test2();
test2.Show();
}
- 窗體2
private void Test2_Load(object sender, EventArgs e)
{
//TimeLabel.Time(this, 50, 50);
this.TimeLabel();
}
常見情況
報錯提示
在窗體異步方法里操作主線程控件時,會提示錯誤,線程間操作無限:從不不是創(chuàng)建控件"lbTime"的線程訪問它。
解決方法
可在構(gòu)造函數(shù)里增加下面代碼
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
public TestTemp()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
屬性作用
CheckForIllegalCrossThreadCalls 可以拆分成 4 個詞:
1.Check:檢查
2.For:為了
3.Illegal:非法的
4.CrossThreadCalls:跨線程調(diào)用
整體意思是:為了檢查跨線程調(diào)用是否非法。
C# 中的 CheckForIllegalCrossThreadCalls 是一個屬性,用于檢查在多線程編程中是否存在潛在的跨線程調(diào)用問題。
它可以幫助開發(fā)人員在開發(fā)過程中更好地處理線程間的通信。
在 C# 中,UI 線程是用于處理用戶界面操作的主線程,而其他操作(如網(wǎng)絡(luò)請求、計算等)通常需要在后臺線程中執(zhí)行。
然而,直接在后臺線程中訪問 UI 控件是不安全的,可能會導(dǎo)致不可預(yù)測的結(jié)果和操作系統(tǒng)錯誤。
CheckForIllegalCrossThreadCalls 屬性的作用是在調(diào)試模式下,檢測程序是否存在不安全的跨線程調(diào)用。
當(dāng)該屬性設(shè)置為 true 時,在出現(xiàn)跨線程調(diào)用時,會引發(fā)一個異常,以提醒開發(fā)人員進(jìn)行相應(yīng)的處理。
當(dāng)屬性設(shè)置為 false 時,不會引發(fā)異常,但仍然可能導(dǎo)致不安全的操作。
這個屬性主要用于幫助開發(fā)人員及時發(fā)現(xiàn)并修復(fù)由于線程之間的錯誤調(diào)用而導(dǎo)致的問題。
它可以提高應(yīng)用程序的穩(wěn)定性和可靠性,避免潛在的線程安全問題。
要注意的是,這個屬性只在調(diào)試模式下起作用,在發(fā)布版本中不會進(jìn)行檢查。
this擴(kuò)展
在 C# 中,this 關(guān)鍵字通常用于指代當(dāng)前對象。而擴(kuò)展方法允許我們向現(xiàn)有類型(包括 .NET 框架中的類型)添加新的方法,而無需修改原始類型的定義。
將 this 作為參數(shù)前綴的方法稱為擴(kuò)展方法,它允許我們在已有的類型上創(chuàng)建新的方法,而不必對原始類型進(jìn)行派生、修改或重新編譯。這使得我們可以將自定義的方法添加到以前不能修改的類中,從而擴(kuò)展其功能。文章來源:http://www.zghlxwxcb.cn/news/detail-803081.html
- 比如上面封裝的代碼
public static void TimeLabel(this Form targetForm)
溫故而知新,不同階段重溫知識點,會有不一樣的認(rèn)識和理解,博主將鞏固一遍知識點,并以實踐方式和大家分享,若能有所幫助和收獲,這將是博主最大的創(chuàng)作動力和榮幸。也期待認(rèn)識更多優(yōu)秀新老博主。文章來源地址http://www.zghlxwxcb.cn/news/detail-803081.html
到了這里,關(guān)于【C#】當(dāng)重復(fù)使用一段代碼倒計時時,使用靜態(tài)類和靜態(tài)方法,實現(xiàn)簡單的this擴(kuò)展方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!