最近涌入了一批初學C#的PLC工程師們,有很多人想知道C#有哪些快捷鍵。今天這篇文章不僅告訴你有哪些快捷鍵,還會告訴你怎么做自己的快捷鍵。
每個C#初學者都應該經歷過這樣的情形:一次偶然的機會,看到別人只輸入prop,然后就快速地寫出了完整的屬性代碼,感到很神奇。然后,我們厚着臉皮問別人,別人會告訴你,輸入prop,接着連續按兩個Tab,就可以實現,你嘗試了,發現確實好用。
在后面的學習過程中,我們慢慢發現for、foreach、switch也都有類似的功能。
然后,可能你就會想,究竟有多少這種快捷語法呢?
你可能也只是想想而已,沒有太去深究,直到遇到了我們,今天咱們就把這個事兒弄明白。
一、揭開面紗
我們打開Visual Studio,創建一個簡單的控制台項目,然后在菜單欄中的工具中,找到代碼片段管理器,語言我們選擇CSharp,然后選擇Visual C#,我們看到了這些東西:
我們似乎有點明白了,這些快捷代碼有個專業術語叫做代碼片段,英文名稱CodeSnippet。我們看到了我們熟悉的prop、propfull、switch,也看到了一些我們不太熟悉的面孔:ctor、propg、iterindex、interator,總共大概有40個左右,下面我們對一些目前開發中,常用的CodeSnippet做一下說明:
1、#region:代碼折疊器
#region MyRegion
#endregion
2、ctor:構造方法
public Program ()
{
}
3、class:類
class MyClass
{
}
4、cw:控制台輸出
Console.WriteLine();
5、do:do-while循環
do
{
} while (true);
6、for:for循環
for (int i = 0; i < length; i++)
{
}
7、foreach:foreach循環
foreach (var item in collection)
{
}
8、forr:for逆循環
for (int i = length - 1; i >= 0; i--)
{
}
9、lock:鎖
lock (this)
{
}
10、mbox:messagebox.show
System.Windows.Forms.MessageBox.Show("Test");
11、prop:簡化屬性
public int MyProperty { get; set; }
12、propfull:完整屬性
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
13、switch:switch-case
switch (switch_on)
{
default:
}
14、try:異常捕獲
try
{
}
catch (Exception)
{
throw;
}
15、tryf:帶finally的異常捕獲
try
{
}
finally
{
}
16、using:using
using (resource)
{
}
17、while:while循環
while (true)
{
}
二、探索原理
我們繼續研究,看下Code Snippet是怎么實現的。
其實Code Snippet只是一個 文件,只不過包含了一些只有 Visual Studio 才認識的元素,這些元素就定義了如何去替我們補全代碼,我們仍然通過菜單欄中的工具中,找到代碼片段管理器,語言我們選擇CSharp,然后選擇Visual C#,在上面的這個圖中,我們看到了位置這一欄,它指向的是一個文件路徑。
1、我們打開這個文件對應的文件夾,發現其實每個快捷代碼都對應一個文件。
2、我們打開一個比較熟悉的for循環對應的文件——for.snippet,默認會用Visual Studio打開,我們可以看到使用的是xml文件的格式,全部展開如下圖所示:
3、整個snippet文件由2個節點組成,分別是Header和Snippet,其中Header主要是一個聲明;Snippet包含具體代碼的形式和內容。
4、Header部分主要包含標題、快捷鍵、說明、作者和Snippet類型相關信息。
Snippet類型分為 Expansion、SurroundsWith 及 Refactoring(只能在重構過程中使用)。
Expansion:允許將代碼段插入到光標處。
SurroundsWith:允許將此代碼段放置在一段選定的代碼周圍。比如我們寫完一段代碼后,發現忘記加 try...catch... 了,這個時候可以選中需要包裹在 try...catch... 中的代碼,然后調用 Code Snippet。
5、Snippet部分是重點內容,從結構上來看,主要包括Declarations和Code兩個部分,Declarations,顧名思義就是聲明變量,而Code就是核心代碼,Code中會應用到Declarations中聲明的一些變量。這個有點像早期西門子S7-300PLC的SCL語言,需要先定義變量,然后后面才能用。
三、擴展練習一
當我們已經知道Snippet的原理之后,我們就可以制作自己的Code Snippet了。
大家可能發現了,自帶的關於異常捕獲的有try和tryf兩個,但是這兩個都無法表示try-catch-finally的邏輯,所以,我們可以先做一個try-catch-finally的Code Snippet。
1、建議還是使用復制-修改的方式來做,我們從Snippets路徑中將try.snippet文件拷貝到桌面上,然后修改如下:
2、修改好之后,直接保存並重命名為trycf.snippet
3、復制該文件到Snippets路徑中4、測試結果:在代碼編輯器中 CTRL+KL+S,就可以呼出 snippet,我們可以看到有trycf了。
4、測試結果:在代碼編輯器中 CTRL+KL+S,就可以呼出 snippet,我們可以看到有trycf了。
四、擴展練習二
我們在實際開發中,如果發現有代碼是經常要寫的,我們不希望每次都從頭去寫,那就可以使用Snippet,這里以串口通信庫為例:
public class SerialBase
{
#region 對象或屬性
/// <summary>
/// 定義SerialPort對象
/// </summary>
private SerialPort MyCom;
/// <summary>
/// 讀取超時時間
/// </summary>
public int ReadTimeOut { get; set; } = 2000;
/// <summary>
/// 寫入超時時間
/// </summary>
public int WriteTimeOut { get; set; } = 2000;
private bool dtrEnable;
/// <summary>
/// Dtr使能標志
/// </summary>
public bool DtrEnable
{
get { return dtrEnable; }
set
{
this.MyCom.DtrEnable = value;
dtrEnable = value;
}
}
private bool rtsEnable;
/// <summary>
/// Rts使能標志
/// </summary>
public bool RtsEnable
{
get { return rtsEnable; }
set
{
this.MyCom.RtsEnable = value;
rtsEnable = value;
}
}
#endregion
#region 打開關閉串口
/// <summary>
/// 打開串口
/// </summary>
/// <param name="iBaudRate">波特率</param>
/// <param name="iPortName">串口號</param>
/// <param name="iDataBits">數據位</param>
/// <param name="iParity">校驗位</param>
/// <param name="iStopBits">停止位</param>
/// <returns>是否成功</returns>
public bool Connect(int iBaudRate, string iPortName, int iDataBits, Parity iParity, StopBits iStopBits)
{
//串口通信對象實例化
MyCom = new SerialPort(iPortName, iBaudRate, iParity, iDataBits, iStopBits);
//如果當前串口是打開的,先關閉一下
if (MyCom.IsOpen)
{
MyCom.Close();
}
//設置超時時間
MyCom.ReadTimeout = this.ReadTimeOut;
MyCom.WriteTimeout = this.WriteTimeOut;
try
{
//打開串口
MyCom.Open();
}
catch (Exception)
{
return false;
}
return true;
}
/// <summary>
/// 關閉串口
/// </summary>
public void DisConnect()
{
if (MyCom.IsOpen)
{
MyCom.Close();
}
}
#endregion
}
1、對於串口通信來說,我們可能每次都要編寫這些代碼,那么我們能不能把這些代碼封裝成一個Snippet呢?
2、建議仍然采用復制-修改的方式來做,我們從Snippets路徑中將tryf.snippet文件拷貝到桌面上,然后修改如下:
3、重命名為serial.snippet,並復制到Snippets文件夾中。
4、測試結果如下:
我們開通了視頻號,里面有很多上位機開發常用技能和案例分享,歡迎關注我的視頻號。