您的位置:首页 > 编程语言

.NET编程技术——实验01:VS2015 对象浏览器的使用、简单调试和断点使用。

2017-12-23 13:44 429 查看
阅读须知:纯粹是本人啊Jun作为初学者的笔记和个人对其中知识的复习,大神请绕道。



大三,必修课,C#

实验01:VS2015 对象浏览器的使用、简单调试和断点使用。

实验04:RS485串口调试、基本控件使用、CRC算法应用

实验05:RS485串口通讯,串口指令的收发应用,完成串口基础功能,github地址:实验05

实验06:窗体应用的最小化在Windows状态栏中显示托盘图标

实验07:Windows的注册表的基本使用方法,文件流保存为文本文件基础用法

实验08:利用GDI+技术生成简单验证码,类似excel的数据折线图、并保存为图片

实验09:Access数据库的创建、表创建、MD5加密,数据、图片保存在数据库的用法

实验10:将DataGridView表单数据保存为excel文件,表单的基本格式化

包含实验06~实验10的功能:github地址:实验10

       差不多放寒假了,终于有少许时间温故而知新。在C#的课程里,总共有10个实验,每周一个,刚开始的实验一20分钟卓卓有余,心想着这么简单的实验,是在挑战智商吗?这个天真的想法一直延续到期中验收,验收完的下半学期,理想破灭,简直拿生命去编程。


        好了,总结完毕,那么先来认识一下C#的IDE(微软的Visual Studio),啊Jun用的是2015版本的,接下来的文章都用VS2015表明是Visual Studio 2015。

         啊Jun认为老师在第一节课介绍了VS2015一些基本功能,其中最重要的就是Debug(调试)和对象浏览器。

        为什么说这两个很重要呢,因为啊Jun在大一时候学的C语言和C++的老师都没有认真教过同学们如何Debug,每次测试一些函数的功能都是用print( )或者std::cout( )插入到其中,其测试效率非常低下,而且很麻烦,但是如果熟练运用VS中的Debug和断点,简直是快速且无敌。

         嗯,第二个重要的功能就是视图中的对象浏览器,可以浏览所有组件的用法。好了,对象浏览器的功能其实就相当于微软MSDN中的开发指南,就是我们常说的API,那下面给出的是 .NET Framwork的开发指南网址:.NET
Framework 开发指南



















好了,稍微介绍完了VS2015的Debug和对象浏览器的功能了;那么接下来就开始第一个实验了。
先看实验内容:

1、用控制台项目,做一个命令行的计算器,可以完成算术运算、移位运算等操作;

2、用控制台项目,做一个小应用,可以展示类型转换、装箱和拆箱的操作;

3、用控制台项目,做一个自我介绍的应用,可以自动计算年龄和距离过下一个生日还有几天,精确到小时。

         首先第(1)题我在前面的文章有提到过,老师也提到过,计算器的动态编译器,但是我们上的课只学了变量和方法啊。。。这个我们完全搞不懂怎么个写法。然而老师跟我们说,不会就百度。
        “不会就百度。。”,听到这句话,我很吃惊,怎么这个老师跟以前的C语言和C++的老师不一样,以前的老师都不允许在网上找答案。反观这位老师,在整个学期下来,给我们的感觉跟以前的编程课老师就是不一样,很新颖,后来打听了这些C#老师只是一名讲师,学历是比在校的其他老师低, 但是毋庸置疑,担任过的项目我想已经可以领先了几条街了。对于我们这些本科生来说,很幸运遇到这一些老师,不断刷新编程价值观。
         好了,bb了这么多,那我们就来百度一下吧,百度到了:c#动态编译计算方法,大家可以参考一下,这边文章用的是窗体项目,啊Jun的是控制台项目,那么也很简单,换了参数就ok。其实对于初学者来说,也不简单的,因为如果以前只是接触C语言或者C++的话,只会控制台项目,完成没有窗体项目的经验,所以也需要摸索一些时间才行。以后的实验很快就会涉及到窗体项目。
         这里算是运用了别人的API吧,我想以后学会引用别人的API是程序员们的一项需要很好掌握的技能,啊Jun也是在不断地学习中,啊Jun之前尝试在Android Studio想着依赖别人在Github开源的项目,但是暂时还没学会。。
那么,那个计算器,我改了一下别人的源码:如下

class Program
{
static void Main(string[] args)
{
Calculate calculate = new Calculate();
bool flag = true;
while (flag)
{
Console.WriteLine("计算器能够计算: 1.可以完成算术运算 和 移位运算等操作 \t 2. 退出计算器");
int choose = Int32.Parse(Console.ReadLine());
switch (choose)
{
case 1:
Console.Write("输入你的算术表达式:");
String expression = Console.ReadLine();
object result = calculate.ComplierCode(expression).ToString();
Console.WriteLine("输出的结果:" + result.ToString()+"\n");

break;

case 2:
flag = false;
break;

default:
break;

}
}

}

}

class Calculate
{

public object ComplierCode(string expression)
{
string code = WrapExpression(expression);

CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider();

//编译的参数
CompilerParameters compilerParameters = new CompilerParameters();
//compilerParameters.ReferencedAssemblies.AddRange();
compilerParameters.CompilerOptions = "/t:library";
compilerParameters.GenerateInMemory = true;
//开始编译
CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, code);
if (compilerResults.Errors.Count > 0)
throw new Exception("编译出错!");

Assembly assembly = compilerResults.CompiledAssembly;
Type type = assembly.GetType("ExpressionCalculate");
MethodInfo method = type.GetMethod("Calculate");
return method.Invoke(null, null);
}

private string WrapExpression(string expression)
{
string code = @"
using System;

class ExpressionCalculate
{
public static DateTime start_dt = Convert.ToDateTime(""{start_dt}"");
public static DateTime end_dt = Convert.ToDateTime(""{end_dt}"");
public static DateTime current_dt = DateTime.Now;

public static object Calculate()
{
return {0};
}
}
";

return code.Replace("{0}", expression);
}

}


       那么,这个是别人的源码就不好解释了,老师告诉我们只需要完成你想要的功能就可以了。

       那么到了第(2)题,关于值类型和引用类型;装箱和拆箱的问题。
概念题:补充一下知识:

       <1>. 数值转换有一个原则:从低精度类型到高精度类型可进行隐式转换,而 从高精度类型到低精度类型 必须进行显式转换;从精度相同的无符号 数值类型向有符号数值类型的转换也只能显式转换。

       <2>. C#支持两个预定义的引用类型object和string。 
在应用程序执行的过程中,引用类型使用new关键字创建对象实例,并存储在堆中。堆是一种由系统 弹性配置的内存空间,没有特定大小及存活时间,因此可以被弹性地运用于对象的访问。

所有被称为“类”的都是引用类型,
例如:Student student1= new Student();
Student student2= student1;


       <3>. 装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类 型链接起来。

到了第(3)题,这道题目可是花的时间就比较多了。
            首先先来认识一下C#中的DateTime这个数据类型。我们可以在对象浏览器或者 MSDN的DateTime结构 查看DateTime的操作,实在太多了,不过没事,用到的只是那么几句。
          <1>.DateTime是C#的一种表示日期和时间的类型,如获取当前的时间: DateTime.Now.ToString(“YYYY-MM-DD-HH-mm-ss”);

          <2>.还有一种类型是:System.TimeSpan,可用于两个DateTime类型的数运算,如: System.TimeSpan s = DateTime d1-DateTime d2;

          <3>. 想要获取当前时间:string nowTime = DateTime.Now.ToString("yyyy-MM-dd-HH"); 这里ToString()就是将时间类型转换成String类型,然后再根据“yyyy-MM-dd-HH”这样的格式将当前时间按照这样的格式输出。这些时间的输出格式有千百种,只要其中英文字母正确就没什么问题了,要注意的是MM:表示的是月份(Month),mm:表示的是分钟(minute),为了区分两者所以都是用大小写来区分。
         <4>.DateTime date = Convert.ToDateTime(string); 将字符串转换为DateTime类型
         <5>.数组的类型转换
数组的类型转换

public static int StrToInt(string str)
{
return int.Parse(str);
}

string[] arrs = new string[] { "100", "300", "200" };
int[] arri = Array.ConvertAll(arrs, new Converter<string, int>(StrToInt));


下面就上代码,好好理解
static void Main(string[] args)
{
Console.WriteLine("你好,我是小Jun机器人,我是一个自我介绍的应用!!!\n");
Console.Write("请输入您的姓名:");
string name = Console.ReadLine();
Console.Write("\n请输入你的性别(男/女):");
string sex = Console.ReadLine();
Console.WriteLine();
if (sex == "男")
Console.WriteLine(name + "先生,您好!现在小Jun可以为您计算下一个生日的距离时间!");
else if (sex == "女")
Console.WriteLine(name + "女士,您好!现在小Jun可以为您计算下一个生日的距离时间!");
else
{
Console.WriteLine();
System.Environment.Exit(0); //强制退出
}
Console.Write("请您以(yyyy-mm-dd)的格式输入您的生日:");

string birthday = Console.ReadLine();
string[] date = birthday.Split('-');
int[] date1 = Array.ConvertAll(date, new Converter<string, int>(StrToInt));

string nowTime = DateTime.Now.ToString("yyyy-MM-dd-HH");
string[] date2 = nowTime.Split('-');

int[] date3 = Array.ConvertAll(date2, new Converter<string, int>(StrToInt));

//下面是为了区分你是否过了今年的生日。
if (date3[1] - date1[1] >= 0)  //是否到了生日的月份
{
double day;
day = Convert.ToDouble(date3[0] - date1[0]) + Convert.ToDouble(date3[1] - date1[1]) / 12; //会有小数,没有计算到日
Console.Write("\n您今年已经:{0} 岁了", Math.Round(day, 1));
date1[0] = date3[0] + 1;  //过了今年的生日,所以要计算明年的生日

string s = string.Join("-", date1);

System.TimeSpan disTime = Convert.ToDateTime(s) - Convert.ToDateTime(nowTime);
int hour = 24 - date3[3];
Console.WriteLine(",距离下一次生日还剩"+Convert.ToInt32(disTime.TotalDays)+" 天 "+ hour+" 小时 ");
}
else
{
double day;
day = Convert.ToDouble(date3[0] - date1[0] - 1) + Convert.ToDouble(12 - date1[1] + date3[1]) / 12;
Console.Write("\n您今年已经:{0} 岁了", Math.Round(day, 1));
date1[0] = date3[0];  //还没过了今年的生日
string s = string.Join("-", date1);

System.TimeSpan disTime = Convert.ToDateTime(s) - Convert.ToDateTime(nowTime);
int hour = 24 - date3[3];
Console.WriteLine(",距离下一次生日还剩 " + Convert.ToInt32(disTime.TotalDays) + "天," + hour + "小时");
}

Console.ReadLine();

}

static int StrToInt(string s)  //将字符串转换为int型
{
return int.Parse(s);
}




      实验01完成

,如果有疑问或者在哪些地方有错误的,欢迎大家指出,共同学习,共同进步。

实验01:VS2015 对象浏览器的使用、简单调试和断点使用。

实验04:RS485串口调试、基本控件使用、CRC算法应用

实验05:RS485串口通讯,串口指令的收发应用,完成串口基础功能,github地址:实验05

实验06:窗体应用的最小化在Windows状态栏中显示托盘图标

实验07:Windows的注册表的基本使用方法,文件流保存为文本文件基础用法

实验08:利用GDI+技术生成简单验证码,类似excel的数据折线图、并保存为图片

实验09:Access数据库的创建、表创建、MD5加密,数据、图片保存在数据库的用法

实验10:将DataGridView表单数据保存为excel文件,表单的基本格式化

包含实验06~实验10的功能:github地址:实验10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: