Category - C#/.Net

2017-06-06 10:56:58    262    0    0

基本概念:

首先总所周知、在C#反射机制中、
最基础的反射用法之一,
就是使用字符串的方式,
获得指定的程序集下的具体类、
并调用指定的方法、或者函数。

那么、可想而知、
我们的C#、java、objective-c中、
如果非常灵活的设计、可以做非常有趣的事情。

那么、在不使用正儿八经的“机器学习”和“人工智能”技术的前提下,
我们能做到多么智能的交互呢?

有趣的思路:

在C# 和 java 等语言中、
我们是可以用字符串指定具体程序集的方法(C#)、
具体包名下的类的方法(java)。
那么、整个程序可以只留一个文本输入模块儿、
可以直接让用户输入字符串、调用不同的方法。

但是、 具体的方法调用字符、在各种语言中、都相对复杂。
让用户输入而且要保证准确的话。实在为难用户。

那么、前期就要解决几大问题:
1、如何让用户录入信息简单
2、如何便捷
3、如何让功能丰富、灵活

解决思路
1、
首先解决简单的问题、
可以把我们的功能方法们、的调用字符、
使用枚举、或者 key value、或者数组等等方式
把复杂的调用字符 标记成 简单的字符

比如 C#中 我们天气查询服务类 是“HaoYueList.weatherHelp.weatherServer”类下的
“getweather”方法

那么我们可以用 “天气”两个字代表这些复杂字符串。
当用户输入“天气”、或者其他简单标记的 单字 单词 即可调用方法。

然后可以支持模糊查询。
遇到多个结果的询问用户。

比如用户输入“查”字、
然后模糊查询、
再询问用户

您是需要以下的哪种服务:
查物流
查天气
查星座运势

2 、
用户输入、我们可以使用 百度语音识别、等第三方的语音识别服务。
来吧用户直接说错词语、来转换成字符串。
代替文字输入。
达到输入上的便捷。

那么、再交互、提示上、使用语音读给用户。

加上我们的模糊查询、和语音询问用户。
变得便捷。

3、
使用类似插件化、组件化、等开发方式。
并在方法上标记好、方法自己的方法简化单词名称。
动态加载方法、和简化单词名称。
能够动态加载功能、

2018-06-04 11:33:39    189    0    0

预处理命令

  1. #if
  2. #else
  3. #elif
  4. #endif
  5. #define
  6. #undef
  7. #warning
  8. #error
  9. #line
  10. #region
  11. #endregion
  12. #pragma
  13. #pragma warning
  14. #pragma checksum

参考 msdn 文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives/

if

  1. //如果在调试环境下
  2. #if DEBUG
  3. Console.WriteLine("Debug version");
  4. #endif
  5. //判断框架版本
  6. //如果在.net 4.7版本下
  7. #if NET47
  8. Console.WriteLine("Debug version");
  9. #endif

目标框架 :符号
.NET Framework :NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472

.NET Standard: NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0

.NET 核心 :NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1

  1. #define VC7
  2. //...
  3. //#elif #else 的使用
  4. #if debug
  5. Console.Writeline("Debug build");
  6. #elif VC7
  7. Console.Writeline("Visual Studio 7");
  8. #endif
2018-02-06 15:47:50    92    0    0

BackgroundWorker 顾名思义 就是后台工作 后台运行的意思

现在我写一个用法示例

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ComponentModel;
  6. using System.Threading;
  7. namespace t1
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. System.ComponentModel.BackgroundWorker worker = new BackgroundWorker();
  14. worker.DoWork += delegate (object sender, DoWorkEventArgs e)
  15. {
  16. Thread.Sleep(5000);
  17. Console.WriteLine("后台三秒执行完成");
  18. };
  19. worker.RunWorkerAsync();
  20. Console.WriteLine("主函数执行完毕");
  21. Console.ReadLine();
  22. }
  23. }
  24. }

输出结果是

  1. 主函数执行完毕
  2. 后台三秒执行完成

说明延迟操作是成功了的。

------下面认真的话 你就输了----------

那么我们继续喜闻乐见的探究一下、
BackgroundWorker 是交给程序本身在运行、还是交给系统托管的

我们去掉最后的Console.ReadLine();即程序主流程执行完、控制台应用程序就结束。

然后我们在中间的delegate里的sleep后面 加入写入文件操作的代码
等待在控制台程序输出完成并终止命令窗之后、看是否有文件写入

  1. using System;
  2. using System.Collections.Gener
2018-01-08 16:02:28    109    0    0
  1. private void btn_send_Click(object sender, EventArgs e)
  2. {
  3. var emailAcount = ConfigurationManager.AppSettings["EmailAcount"];
  4. var emailPassword = ConfigurationManager.AppSettings["EmailPassword"];
  5. var reciver = txt_Reciver.Text;
  6. var content = rtxt_Content.Text;
  7. MailMessage message = new MailMessage();
  8. //设置发件人,发件人需要与设置的邮件发送服务器的邮箱一致
  9. MailAddress fromAddr = new MailAddress("qwe123@qq.com");
  10. message.From = fromAddr;
  11. //设置收件人,可添加多个,添加方法与下面的一样
  12. message.To.Add(reciver);
  13. //设置抄送人
  14. message.CC.Add("qwe123@163.com");
  15. //设置邮件标题
  16. message.Subject = "Test";
  17. //设置邮件内容
  18. message.Body = content;
  19. //设置邮件发送服务器,服务器根据你使用的邮箱而不同,可以到相应的 邮箱管理后台查看,下面是QQ的
  20. SmtpClient client = new SmtpClient("smtp.qq.com", 25);
  21. //设置发送人的邮箱账号和密码
  22. client.Cre
2017-11-30 17:10:39    205    0    0

首先准备一个计算时间差的代码

  1. DateTime date1 = DateTime.Now;
  2. /*
  3. * 要处理的内容 A
  4. */
  5. DateTime date2 = DateTime.Now;
  6. DateTime date3 = DateTime.Now;
  7. /*
  8. * 要处理的内容 B
  9. */
  10. DateTime date4 = DateTime.Now;
  11. TimeSpan timeSpan1 = date2 - date1;
  12. TimeSpan timeSpan2 = date4 - date3;
  13. Console.WriteLine("A的运算需要了" + (timeSpan1).TotalMilliseconds + "毫秒");
  14. Console.WriteLine("B的运算需要了" + (timeSpan2).TotalMilliseconds + "毫秒");
  15. Console.WriteLine("两次运行的时间差" + (timeSpan1 - timeSpan2).TotalMilliseconds+ "毫秒");
  16. Console.ReadLine();

首先直接运行得出时间差计算过程本身的时间消耗、
我这台办公室电脑,Debug模式下运行
得到的 平均值是 0.3毫秒~0.4毫秒

心理先有个数。

然后接下来放入需要测试的代码

1、数据类型计算速度差异

1.1 整形和双精度浮点型 100万次加法 速度对比

  1. DateTime date1 = DateTime.Now;
  2. /*
  3. * 要处理的内容 A
  4. */
  5. int i1 = 1;
  6. for (long i = 0; i < 1000000; i++)
  7. {
  8. i1 += i1;
  9. }
  10. DateTim
2017-11-04 15:55:53    141    0    0
  1. string sPath = Environment.GetEnvironmentVariable("Path");
  2. foreach(var l in sPath.Split(';'))
  3. Console.WriteLine(l);
2017-09-17 18:11:10    445    0    0
  1. #region Chrome书签结构实体类
  2. public class GoogleChrome_BookMarkALLModel
  3. {
  4. public string checksum { get; set; }
  5. public GoogleChrome_BookMark_roots roots { get; set; }
  6. public string version { get; set; }
  7. }
  8. public class GoogleChrome_BookMark_roots
  9. {
  10. public GoogleChrome_BookMark_bookmark_bar_other_synced bookmark_bar { get; set; }
  11. public GoogleChrome_BookMark_bookmark_bar_other_synced other { get; set; }
  12. public GoogleChrome_BookMark_bookmark_bar_other_synced synced { get; set; }
  13. }
  14. public class GoogleChrome_BookMark_bookmark_bar_other_synced
  15. {
  16. public string date_added { get; set; }
  17. public string date_modified { get; set; }
  18. public string id { get; set; }
  19. public string name { get; set; }
  20. public string type { get; set; }
  21. public List<GoogleChrome_BookMark_children> children { get; set; }
  22. }
  23. public class GoogleChrome_BookMark_ch
2017-08-31 14:55:28    511    0    0

使用mysql/mariaDB

当你升级了项目的EntityFramework版本

导致在VS中生成实体类的时候 提示
您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架

不要着急

这时候请检查这两个 是否是最新 不是最新的话就去官网重新下载安装
mysql-for-visualstudio
mysql-connector-net

然后 在VS的NuGet中去重新安装
MySql.Data.Entity.EF6 组件

然后在你config中的里
应该有名为MySql.Data.MySqlClient的东西了

然后现在你就可以愉快的生成mysql的EF实体类了、
如果还是那样提示的话、
重新生成一次解决方案就好。

2017-01-11 16:35:43    117    0    0

加密 方式

  1. public string Encrypt(string toEncrypt, string key, string iv)
  2. {
  3. byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
  4. byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
  5. byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
  6. RijndaelManaged rDel = new RijndaelManaged();
  7. rDel.Key = keyArray;
  8. rDel.IV = ivArray;
  9. rDel.Mode = CipherMode.CBC;
  10. rDel.Padding = PaddingMode.PKCS7;
  11. ICryptoTransform cTransform = rDel.CreateEncryptor();
  12. byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  13. return Convert.ToBase64String(resultArray, 0, resultArray.Length);
  14. }
  15. public string Decrypt(string toDecrypt, string key, string iv)
  16. {
  17. byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
2017-06-12 13:58:42    130    0    0
  1. //引入语音合成名称空间
  2. using System.Speech.Synthesis;
  3. class A
  4. {
  5. void test1()
  6. {
  7. //实例化 并指定字符串 播放合成读音
  8. SpeechSynthesizer sp = new SpeechSynthesizer();
  9. sp.Speak("中国");
  10. }
  11. }
2/3