- .NET Framework : 4.7.2
- IDE : Visual Studio Community 2019
- OS : Windows 10 x64
- typesetting : Markdown
博文起因
当初我学习Dictionary的时候,老师讲了很多属性、方法,关于怎么遍历、查找和初始化,但是迷惑于它的实际用处,整天初始化、创建和查找,解决一些在理想世界中才能出现的问题,很是没有动力。
应用背景
在串口编程中,有几个参数必须需要配置,比如串口号、波特率,数据位等。为了工作的快捷,人们会提出将配置参数保存为一个文件,在下次程序启动时,自动提取出配置参数进行配置的需求。我是用的XML文件保存配置参数。
XML文件
<?xml version="1.0" encoding="utf-8"?>
<portConfigure>
<PortName>COM4</PortName><!--???-->
<BaudRate>115200</BaudRate><!--460800 256000 128000 115200 57600 38400 28800 19200 9600 4800 1200-->
<DataBits>8</DataBits> <!--8 7 6 5-->
<StopBits>1</StopBits> <!--1 1.5 2-->
<Parity>None</Parity> <!--None Odd Even Mark Space-->
</portConfigure>
思考
问题出现了。PortName端口号、BaudRate波特率、DataBits数据位,直接读取XML中数据就可以交给C#进行赋值,但是StopBits停止位和Parity校验位在XML保存的数据是为了让人能够轻易看懂,然而直接将其交给C#进行赋值,程序就会报类型不匹配的错误。于是乎,作为桥梁的字典Dictionary就需要出现了。
XML文件中的参数作为字典的键,赋值的时,通过键(人易识别的数据)找到对应的值(类型匹配的机器数据)进行赋值,就可以解决类型不匹配的问题了。
code
using System;
using System.Collections.Generic;
using System.Xml;
using System.IO.Ports;
namespace ConsoleApp5
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("正在读取上次保存的配置参数");
string xmlFileName = "portArgsFile.xml";
XmlDocument xml = new XmlDocument();
// 打开现有的一个xml文件
xml.Load(xmlFileName);
// 获得xml的根节点
XmlElement portConfigure = xml.DocumentElement;
// 参数字典
var parityDictionary = new Dictionary<String, Parity>() {
{ "Even",Parity.Even},
{ "Mark",Parity.Mark},
{ "None",Parity.None},
{ "Odd",Parity.Odd},
{ "Space",Parity.Space}
};
var stopBitsDictionary = new Dictionary<String, StopBits>() {
{ "1",StopBits.One},
{ "1.5",StopBits.OnePointFive},
{ "2",StopBits.Two}
};
// 从xml文件中读取数据
// 端口号
string portName = portConfigure.SelectSingleNode("PortName").InnerText;
// 波特率
int baudRate = Convert.ToInt32(portConfigure.SelectSingleNode("BaudRate").InnerText);
// 校验位
Parity parity = parityDictionary[portConfigure.SelectSingleNode("Parity").InnerText];
// 数据位
int dataBits = Convert.ToInt32(portConfigure.SelectSingleNode("DataBits").InnerText);
// 停止位
StopBits stopBits = stopBitsDictionary[portConfigure.SelectSingleNode("StopBits").InnerText];
// 参数配置成功后关闭xml文件,网上说这个操作归GC管了.
Console.WriteLine("配置参数读取成功");
Console.ReadKey();
}
}
}
result
正在读取上次保存的配置参数
配置参数读取成功
感想
写应用经验方向的博文,是希望通过我的实践历程告诉新手:要好好学习基础知识,这些基础知识在未来的工作中是切实可用的,坚定信心,不要迷茫。加油!
resource
- [文档] docs.microsoft.com/zh-cn/dotnet/csharp
- [规范] github.com/dotnet/docs/tree/master/docs/standard/design-guidelines
- [源码] referencesource.microsoft.com
- [ IDE ] visualstudio.microsoft.com/zh-hans
- [.NET Core] dotnet.github.io
感恩曾经帮助过 心少朴 的人。
C#优秀,值得学习。.NET Core具有跨平台的能力,值得关注。
Console,WinForm,WPF,ASP.NET,Azure WebJob,WCF,Unity3d,UWP可以适当地了解。
注:此文是自学笔记所生,质量中下等,故要三思而后行。新手到此,不可照搬,应先研究其理象数,待能变通之时,自然跳出深坑。