程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

一文说清C#的快捷键

发布于2021-05-30 19:43     阅读(829)     评论(0)     点赞(19)     收藏(3)


图片

 

最近公众号涌入了一批初学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:代码折叠器

  1.     #region MyRegion
  2.     #endregion

2、ctor:构造方法

  1.  public Program ()
  2.  {
  3.  }

3、class:类

  1.     class MyClass
  2.     {
  3.     }

4、cw:控制台输出

 Console.WriteLine();

5、do:do-while循环

  1.     do
  2.     {
  3.     } while (true);

6、for:for循环

  1.     for (int i = 0; i < length; i++)
  2.     {
  3.     }

7、foreach:foreach循环

  1.  foreach (var item in collection)
  2.     {
  3.     }

8、forr:for逆循环

  1.  for (int i = length - 1; i >= 0; i--)
  2.  {
  3.  }

9、lock:锁

  1.  lock (this)
  2.  {
  3.  }

10、mbox:messagebox.show

 System.Windows.Forms.MessageBox.Show("Test");

11、prop:简化属性

 public int MyProperty { getset; }

12、propfull:完整属性

  1.  private int myVar;
  2.  public int MyProperty
  3.  {
  4.   get { return myVar; }
  5.   set { myVar = value; }
  6.  }

13、switch:switch-case

  1.  switch (switch_on)
  2.  {
  3.   default:
  4.  }

14、try:异常捕获

  1.  try
  2.  {
  3.  }
  4.  catch (Exception)
  5.  {
  6.   throw;
  7.  }

15、tryf:带finally的异常捕获

  1.  try
  2.  {
  3.  }
  4.  finally
  5.  {
  6.  }

16、using:using

  1.  using (resource)
  2.  {
  3.  }

17、while:while循环

  1.  while (true)
  2.  {
  3.  }

 

二、探索原理

我们继续研究,看下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类型分为 ExpansionSurroundsWith 及 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了。

图片

 

四、扩展练习二

我们在实际开发中,如果发现有代码是经常要写的,我们不希望每次都从头去写,那就可以使用Snippet,这里以串口通信库为例:

  1.     public class SerialBase
  2.     { 
  3.      #region 对象或属性
  4.         /// <summary>
  5.         /// 定义SerialPort对象
  6.         /// </summary>
  7.         private SerialPort MyCom;
  8.         /// <summary>
  9.         /// 读取超时时间
  10.         /// </summary>
  11.         public int ReadTimeOut { getset; } = 2000;
  12.         /// <summary>
  13.         /// 写入超时时间
  14.         /// </summary>
  15.         public int WriteTimeOut { getset; } = 2000;
  16.         private bool dtrEnable;
  17.         /// <summary>
  18.         /// Dtr使能标志
  19.         /// </summary>
  20.         public bool DtrEnable
  21.         {
  22.             get { return dtrEnable; }
  23.             set
  24.             {
  25.                 this.MyCom.DtrEnable = value;
  26.                 dtrEnable = value;
  27.             }
  28.         }
  29.         private bool rtsEnable;
  30.         /// <summary>
  31.         /// Rts使能标志
  32.         /// </summary>
  33.         public bool RtsEnable
  34.         {
  35.             get { return rtsEnable; }
  36.             set
  37.             {
  38.                 this.MyCom.RtsEnable = value;
  39.                 rtsEnable = value;
  40.             }
  41.         }
  42.         #endregion
  43.         #region 打开关闭串口
  44.         /// <summary>
  45.         /// 打开串口
  46.         /// </summary>
  47.         /// <param name="iBaudRate">波特率</param>
  48.         /// <param name="iPortName">串口号</param>
  49.         /// <param name="iDataBits">数据位</param>
  50.         /// <param name="iParity">校验位</param>
  51.         /// <param name="iStopBits">停止位</param>    
  52.         /// <returns>是否成功</returns>
  53.         public bool Connect(int iBaudRate, string iPortName, int iDataBits, Parity iParity, StopBits iStopBits)
  54.         {
  55.             //串口通信对象实例化
  56.             MyCom = new SerialPort(iPortName, iBaudRate, iParity, iDataBits, iStopBits);
  57.             //如果当前串口是打开的,先关闭一下
  58.             if (MyCom.IsOpen)
  59.             {
  60.                 MyCom.Close();
  61.             }
  62.             //设置超时时间
  63.             MyCom.ReadTimeout = this.ReadTimeOut;
  64.             MyCom.WriteTimeout = this.WriteTimeOut;
  65.             try
  66.             {
  67.                 //打开串口
  68.                 MyCom.Open();
  69.             }
  70.             catch (Exception)
  71.             {
  72.                 return false;
  73.             }
  74.             return true;
  75.         }
  76.         /// <summary>
  77.         /// 关闭串口
  78.         /// </summary>
  79.         public void DisConnect()
  80.         {
  81.             if (MyCom.IsOpen)
  82.             {
  83.                 MyCom.Close();
  84.             }
  85.         }
  86.         #endregion
  87.  }

1、对于串口通信来说,我们可能每次都要编写这些代码,那么我们能不能把这些代码封装成一个Snippet呢?

图片

2、建议仍然采用复制-修改的方式来做,我们从Snippets路径中将tryf.snippet文件拷贝到桌面上,然后修改如下:

3、重命名为serial.snippet,并复制到Snippets文件夹中。

4、测试结果如下:

图片

 

 

公众号:dotNet工控上位机:thinger_swj 后台回复『软件』『文章』,可以获取更多软件和相关原创技术文章。

我们开通了视频号,里面有很多上位机开发常用技能和案例分享,欢迎关注我的视频号。

图片

 



所属网站分类: 技术文章 > 博客

作者:看看电影票

链接:http://www.phpheidong.com/blog/article/86806/3d89df64e782705d81c6/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)