搜索
bottom↓
回复: 18

C# 如何实现代码复用

[复制链接]

出0入0汤圆

发表于 2015-3-7 13:40:41 | 显示全部楼层 |阅读模式
现在学习c#,正在做一个串口通信软件,有些地方要用到非常相似的代码,c中可以用定义一个函数的方式来解决,请问坛子里的诸位大神,C#中怎么能实现像C中那样的代码复用呢?
代码如下
  1. private void textVariable1_KeyDown(object sender, KeyEventArgs e)
  2.         {
  3.             if (e.Key == Key.Enter)
  4.             {
  5.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable1.Text)))
  6.                 {
  7.                     byteTXD[1] = 0x01;
  8.                     byteTXD[2] = (byte)(int.Parse(textVariable1.Text) >> 8);
  9.                     byteTXD[3] = (byte)(int.Parse(textVariable1.Text) & 0xFF);
  10.                     foreach (byte i in byteTXD)
  11.                     {
  12.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  13.                     }
  14.                     textBoxTXDed.Text += '\n';
  15.                     textBoxTXDed.Text += DateTime.Now.ToString();
  16.                     textBoxTXDed.Text += '\n';
  17.                     textBoxTXDed.ScrollToEnd();
  18.                     Comm.Write(byteTXD, 0, 5);
  19.                 }
  20.                 else
  21.                 {
  22.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  23.                     textBoxRXD.ScrollToEnd();
  24.                 }
  25.             }
  26.         }

  27.         private void textVariable2_KeyDown(object sender, KeyEventArgs e)
  28.         {
  29.             if (e.Key == Key.Enter)
  30.             {
  31.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable2.Text)))
  32.                 {
  33.                     byteTXD[1] = 0x02;
  34.                     byteTXD[2] = (byte)(int.Parse(textVariable2.Text) >> 8);
  35.                     byteTXD[3] = (byte)(int.Parse(textVariable2.Text) & 0xFF);
  36.                     foreach (byte i in byteTXD)
  37.                     {
  38.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  39.                     }
  40.                     textBoxTXDed.Text += '\n';
  41.                     textBoxTXDed.Text += DateTime.Now.ToString();
  42.                     textBoxTXDed.Text += '\n';
  43.                     textBoxTXDed.ScrollToEnd();
  44.                     Comm.Write(byteTXD, 0, 5);
  45.                 }
  46.                 else
  47.                 {
  48.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  49.                     textBoxRXD.ScrollToEnd();
  50.                 }
  51.             }
  52.         }

  53.         private void textVariable3_KeyDown(object sender, KeyEventArgs e)
  54.         {
  55.             if (e.Key == Key.Enter)
  56.             {
  57.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable3.Text)))
  58.                 {
  59.                     byteTXD[1] = 0x03;
  60.                     byteTXD[2] = (byte)(int.Parse(textVariable3.Text) >> 8);
  61.                     byteTXD[3] = (byte)(int.Parse(textVariable3.Text) & 0xFF);
  62.                     foreach (byte i in byteTXD)
  63.                     {
  64.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  65.                     }
  66.                     textBoxTXDed.Text += '\n';
  67.                     textBoxTXDed.Text += DateTime.Now.ToString();
  68.                     textBoxTXDed.Text += '\n';
  69.                     textBoxTXDed.ScrollToEnd();
  70.                     Comm.Write(byteTXD, 0, 5);
  71.                 }
  72.                 else
  73.                 {
  74.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  75.                     textBoxRXD.ScrollToEnd();
  76.                 }
  77.             }
  78.         }

  79.         private void textVariable4_KeyDown(object sender, KeyEventArgs e)
  80.         {
  81.             if (e.Key == Key.Enter)
  82.             {
  83.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable4.Text)))
  84.                 {
  85.                     byteTXD[1] = 0x04;
  86.                     byteTXD[2] = (byte)(int.Parse(textVariable4.Text) >> 8);
  87.                     byteTXD[3] = (byte)(int.Parse(textVariable4.Text) & 0xFF);
  88.                     foreach (byte i in byteTXD)
  89.                     {
  90.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  91.                     }
  92.                     textBoxTXDed.Text += '\n';
  93.                     textBoxTXDed.Text += DateTime.Now.ToString();
  94.                     textBoxTXDed.Text += '\n';
  95.                     textBoxTXDed.ScrollToEnd();
  96.                     Comm.Write(byteTXD, 0, 5);
  97.                 }
  98.                 else
  99.                 {
  100.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  101.                     textBoxRXD.ScrollToEnd();
  102.                 }
  103.             }
  104.         }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2015-3-7 13:41:27 | 显示全部楼层
先自己顶一下

出0入0汤圆

发表于 2015-3-7 13:45:12 | 显示全部楼层
c#中就没有函数了么

出0入0汤圆

 楼主| 发表于 2015-3-7 13:58:26 | 显示全部楼层
jacky_yhy 发表于 2015-3-7 13:45
c#中就没有函数了么

惭愧,还不知道该怎么写啊

出0入0汤圆

发表于 2015-3-7 14:00:39 | 显示全部楼层
本帖最后由 哼嘿哈嘿哈 于 2015-3-7 14:47 编辑
  1. 大致理解了一下题主的意思,我也是初学不久  前段时间学会了这种方式。你可以借鉴一下。
  2. 在四个文本框的按键事件中全部都调用此函数即可
  3. private void textVariable_KeyDown(object sender, KeyEventArgs e)
  4.         {
  5.             TextBox textVariable = (TextBox) sender;        姑且认为你的textVariable属性就是TextBox吧
  6.                        
  7.                         if (e.Key == Key.Enter)
  8.             {
  9.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable.Text)))
  10.                 {
  11.                     byte by = null;
  12.                                         switch(textVariable.Name)        //此处也可以使用textVariable.Tag或者其他之类的属性
  13.                                         {
  14.                                                 case "textVariable1":
  15.                                                         by = 0x01;
  16.                                                         break;
  17.                                                 case "textVariable2":
  18.                                                         by = 0x02;
  19.                                                         break;
  20.                                                 case "textVariable3":
  21.                                                         by = 0x03;
  22.                                                         break;
  23.                                                 case "textVariable4":
  24.                                                         by = 0x04;
  25.                                                         break;
  26.                                                 default:
  27.                                                         by = xx;       
  28.                                                         break;
  29.                                         }
  30.                                        
  31.                                         byteTXD[1] = by;
  32.                     byteTXD[2] = (byte)(int.Parse(textVariable.Text) >> 8);
  33.                     byteTXD[3] = (byte)(int.Parse(textVariable.Text) & 0xFF);
  34.                     foreach (byte i in byteTXD)
  35.                     {
  36.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  37.                     }
  38.                     textBoxTXDed.Text += '\n';
  39.                     textBoxTXDed.Text += DateTime.Now.ToString();
  40.                     textBoxTXDed.Text += '\n';
  41.                     textBoxTXDed.ScrollToEnd();
  42.                     Comm.Write(byteTXD, 0, 5);
  43.                 }
  44.                 else
  45.                 {
  46.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  47.                     textBoxRXD.ScrollToEnd();
  48.                 }
  49.             }
  50.         }
复制代码

出0入0汤圆

 楼主| 发表于 2015-3-7 14:08:47 | 显示全部楼层

谢谢5楼,我刚才用了一个笨方法,测试能用,但是感觉你的方法比我的要好,我用的方法如下
  1. private void textVariable1_KeyDown(object sender, KeyEventArgs e)
  2.         {
  3.             TextBox textVariable = textVariable1;
  4.             textVariable_KeyDown(sender, e, textVariable);
  5.             /*----------------------------------------------------------------------
  6.             if (e.Key == Key.Enter)
  7.             {
  8.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable1.Text)))
  9.                 {
  10.                     byteTXD[1] = 0x01;
  11.                     byteTXD[2] = (byte)(int.Parse(textVariable1.Text) >> 8);
  12.                     byteTXD[3] = (byte)(int.Parse(textVariable1.Text) & 0xFF);
  13.                     foreach (byte i in byteTXD)
  14.                     {
  15.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  16.                     }
  17.                     textBoxTXDed.Text += '\n';
  18.                     textBoxTXDed.Text += DateTime.Now.ToString();
  19.                     textBoxTXDed.Text += '\n';
  20.                     textBoxTXDed.ScrollToEnd();
  21.                     Comm.Write(byteTXD, 0, 5);
  22.                 }
  23.                 else
  24.                 {
  25.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  26.                     textBoxRXD.ScrollToEnd();
  27.                 }
  28.             }
  29.             ----------------------------------------------------------------------*/
  30.         }

  31.         private void textVariable2_KeyDown(object sender, KeyEventArgs e)
  32.         {
  33.             TextBox textVariable = textVariable2;
  34.             textVariable_KeyDown(sender, e, textVariable);
  35.         }

  36.         private void textVariable3_KeyDown(object sender, KeyEventArgs e)
  37.         {
  38.             TextBox textVariable = textVariable3;
  39.             textVariable_KeyDown(sender, e, textVariable);
  40.         }

  41.         private void textVariable4_KeyDown(object sender, KeyEventArgs e)
  42.         {
  43.             TextBox textVariable = textVariable4;
  44.             textVariable_KeyDown(sender, e, textVariable);
  45.         }

  46.         private void textVariable_KeyDown(object sender, KeyEventArgs e,TextBox textVariable)
  47.         {
  48.             if (e.Key == Key.Enter)
  49.             {
  50.                 if (Comm.IsOpen && (!String.IsNullOrWhiteSpace(textVariable.Text)))
  51.                 {
  52.                     if (textVariable == textVariable4)
  53.                         byteTXD[1] = 0x04;
  54.                     else if (textVariable == textVariable3)
  55.                         byteTXD[1] = 0x03;
  56.                     else if (textVariable == textVariable2)
  57.                         byteTXD[1] = 0x02;
  58.                     else if (textVariable == textVariable1)
  59.                         byteTXD[1] = 0x01;
  60.                     else
  61.                         byteTXD[1] = 0x00;
  62.                     byteTXD[2] = (byte)(int.Parse(textVariable.Text) >> 8);
  63.                     byteTXD[3] = (byte)(int.Parse(textVariable.Text) & 0xFF);
  64.                     foreach (byte i in byteTXD)
  65.                     {
  66.                         textBoxTXDed.Text += "0x" + i.ToString("X2") + ",";
  67.                     }
  68.                     textBoxTXDed.Text += '\n';
  69.                     textBoxTXDed.Text += DateTime.Now.ToString();
  70.                     textBoxTXDed.Text += '\n';
  71.                     textBoxTXDed.ScrollToEnd();
  72.                     Comm.Write(byteTXD, 0, 5);
  73.                 }
  74.                 else
  75.                 {
  76.                     StateMessage.Text += "串口没有打开或没有发送数据!" + '\n';
  77.                     textBoxRXD.ScrollToEnd();
  78.                 }
  79.             }
  80.         }
复制代码

出0入0汤圆

发表于 2015-3-7 14:21:42 | 显示全部楼层
NEXEN1106 发表于 2015-3-7 14:08
谢谢5楼,我刚才用了一个笨方法,测试能用,但是感觉你的方法比我的要好,我用的方法如下
...

还是C语言先入为主的原因 我也是搞单片机的 刚开始确实不习惯这种面向对象的方法。弄的C#写出来还像C语言。做的多了,就会有疑问然后就会想办法突破了。加油!

出0入0汤圆

 楼主| 发表于 2015-3-7 14:27:50 | 显示全部楼层
哼嘿哈嘿哈 发表于 2015-3-7 14:21
还是C语言先入为主的原因 我也是搞单片机的 刚开始确实不习惯这种面向对象的方法。弄的C#写出来还像C语言 ...

嗯,现在感觉自己的代码确实特别像c的,努力学习中

出0入0汤圆

 楼主| 发表于 2015-3-7 14:35:00 | 显示全部楼层
刚才用5楼的代码测试了一下,好用。switch部分的case值加上“”双引号就可以了。谢谢5楼哼嘿哈嘿哈。

出0入0汤圆

发表于 2015-3-7 14:45:35 | 显示全部楼层
NEXEN1106 发表于 2015-3-7 14:35
刚才用5楼的代码测试了一下,好用。switch部分的case值加上“”双引号就可以了。谢谢5楼哼嘿哈嘿哈。 ...

果然是漏写了。。。。我改正一下

出0入0汤圆

发表于 2015-3-7 15:50:27 | 显示全部楼层
C#里有继承,override,虚函数啥的,比C会好用吧..

出0入0汤圆

 楼主| 发表于 2015-3-7 16:06:05 | 显示全部楼层
windingway 发表于 2015-3-7 15:50
C#里有继承,override,虚函数啥的,比C会好用吧..

可是现在还没学会啊

出0入0汤圆

发表于 2015-3-7 16:08:47 | 显示全部楼层
接口,或者静态函数

出0入18汤圆

发表于 2015-3-7 16:41:32 | 显示全部楼层
C# 的 class 会比 C 的 函数 结构上好很多!

出0入0汤圆

发表于 2015-3-7 17:18:35 | 显示全部楼层
请教楼主,C#和C++是神马关系?

出0入0汤圆

发表于 2015-3-7 18:07:33 | 显示全部楼层
本帖最后由 cddx 于 2015-3-7 18:10 编辑

我帮回一下吧,C#和C++都是面向对象的语言,但C#是微软基于.NET平台开发的面向对象的开发语言,而C++一种是较早出现的面向对象的语言,他们的语法结构大部分都采用了C的语法结构,但其思想是面向对象的。

出0入0汤圆

发表于 2015-3-7 18:18:48 | 显示全部楼层
讲真,没看懂LZ的代码复用在哪里。。。
一般不都是提一个函数出来,然后传参数进去吗?
顺便C#自由度跟高,LZ的很多代码完全可以更奔放一些的。
而且类似于一个按钮只做一两句话这样的东西,完全可以在定义这个按钮的时候(一般在VS自动生成的文件里)直接一句话搞定,不需要单独拎出来写。

出0入0汤圆

发表于 2015-3-7 19:50:16 | 显示全部楼层
直接写个类啊

出0入0汤圆

发表于 2015-3-7 20:01:01 | 显示全部楼层
也是一样函数,或常用的自己封装成一个类,不会可以到网上找找很多例子的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表