阅读须知:纯粹是本人啊Jun作为初学者的笔记和个人对其中知识的复习,大神请绕道。
大三,必修课,C#
差不多放寒假了,终于有少许时间温故而知新。在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 开发指南
1、用控制台项目,做一个命令行的计算器,可以完成算术运算、移位运算等操作;
2、用控制台项目,做一个小应用,可以展示类型转换、装箱和拆箱的操作;
3、用控制台项目,做一个自我介绍的应用,可以自动计算年龄和距离过下一个生日还有几天,精确到小时。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Calculate calculate = new Calculate();
6 bool flag = true;
7 while (flag)
8 {
9 Console.WriteLine("计算器能够计算: 1.可以完成算术运算 和 移位运算等操作 \t 2. 退出计算器");
10 int choose = Int32.Parse(Console.ReadLine());
11 switch (choose)
12 {
13 case 1:
14 Console.Write("输入你的算术表达式:");
15 String expression = Console.ReadLine();
16 object result = calculate.ComplierCode(expression).ToString();
17 Console.WriteLine("输出的结果:" + result.ToString()+"\n");
18
19 break;
20
21 case 2:
22 flag = false;
23 break;
24
25 default:
26 break;
27
28 }
29 }
30
31 }
32
33 }
34
35 class Calculate
36 {
37
38 public object ComplierCode(string expression)
39 {
40 string code = WrapExpression(expression);
41
42 CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider();
43
44 //编译的参数
45 CompilerParameters compilerParameters = new CompilerParameters();
46 //compilerParameters.ReferencedAssemblies.AddRange();
47 compilerParameters.CompilerOptions = "/t:library";
48 compilerParameters.GenerateInMemory = true;
49 //开始编译
50 CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, code);
51 if (compilerResults.Errors.Count > 0)
52 throw new Exception("编译出错!");
53
54 Assembly assembly = compilerResults.CompiledAssembly;
55 Type type = assembly.GetType("ExpressionCalculate");
56 MethodInfo method = type.GetMethod("Calculate");
57 return method.Invoke(null, null);
58 }
59
60 private string WrapExpression(string expression)
61 {
62 string code = @"
63 using System;
64
65 class ExpressionCalculate
66 {
67 public static DateTime start_dt = Convert.ToDateTime(""{start_dt}"");
68 public static DateTime end_dt = Convert.ToDateTime(""{end_dt}"");
69 public static DateTime current_dt = DateTime.Now;
70
71 public static object Calculate()
72 {
73 return {0};
74 }
75 }
76 ";
77
78 return code.Replace("{0}", expression);
79 }
80
81 }
<2>. C#支持两个预定义的引用类型object和string。
所有被称为“类”的都是引用类型,
1 例如:Student student1= new Student();
2 Student student2= student1;
<3>. 装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类 型链接起来。
1 数组的类型转换
2
3 public static int StrToInt(string str)
4 {
5 return int.Parse(str);
6 }
7
8 string[] arrs = new string[] { "100", "300", "200" };
9 int[] arri = Array.ConvertAll(arrs, new Converter<string, int>(StrToInt));
1 static void Main(string[] args)
2 {
3 Console.WriteLine("你好,我是小Jun机器人,我是一个自我介绍的应用!!!\n");
4 Console.Write("请输入您的姓名:");
5 string name = Console.ReadLine();
6 Console.Write("\n请输入你的性别(男/女):");
7 string sex = Console.ReadLine();
8 Console.WriteLine();
9 if (sex == "男")
10 Console.WriteLine(name + "先生,您好!现在小Jun可以为您计算下一个生日的距离时间!");
11 else if (sex == "女")
12 Console.WriteLine(name + "女士,您好!现在小Jun可以为您计算下一个生日的距离时间!");
13 else
14 {
15 Console.WriteLine();
16 System.Environment.Exit(0); //强制退出
17 }
18 Console.Write("请您以(yyyy-mm-dd)的格式输入您的生日:");
19
20 string birthday = Console.ReadLine();
21 string[] date = birthday.Split('-');
22 int[] date1 = Array.ConvertAll(date, new Converter<string, int>(StrToInt));
23
24 string nowTime = DateTime.Now.ToString("yyyy-MM-dd-HH");
25 string[] date2 = nowTime.Split('-');
26
27 int[] date3 = Array.ConvertAll(date2, new Converter<string, int>(StrToInt));
28
29
30 //下面是为了区分你是否过了今年的生日。
31 if (date3[1] - date1[1] >= 0) //是否到了生日的月份
32 {
33 double day;
34 day = Convert.ToDouble(date3[0] - date1[0]) + Convert.ToDouble(date3[1] - date1[1]) / 12; //会有小数,没有计算到日
35 Console.Write("\n您今年已经:{0} 岁了", Math.Round(day, 1));
36 date1[0] = date3[0] + 1; //过了今年的生日,所以要计算明年的生日
37
38 string s = string.Join("-", date1);
39
40 System.TimeSpan disTime = Convert.ToDateTime(s) - Convert.ToDateTime(nowTime);
41 int hour = 24 - date3[3];
42 Console.WriteLine(",距离下一次生日还剩"+Convert.ToInt32(disTime.TotalDays)+" 天 "+ hour+" 小时 ");
43 }
44 else
45 {
46 double day;
47 day = Convert.ToDouble(date3[0] - date1[0] - 1) + Convert.ToDouble(12 - date1[1] + date3[1]) / 12;
48 Console.Write("\n您今年已经:{0} 岁了", Math.Round(day, 1));
49 date1[0] = date3[0]; //还没过了今年的生日
50 string s = string.Join("-", date1);
51
52 System.TimeSpan disTime = Convert.ToDateTime(s) - Convert.ToDateTime(nowTime);
53 int hour = 24 - date3[3];
54 Console.WriteLine(",距离下一次生日还剩 " + Convert.ToInt32(disTime.TotalDays) + "天," + hour + "小时");
55 }
56
57 Console.ReadLine();
58
59 }
60
61 static int StrToInt(string s) //将字符串转换为int型
62 {
63 return int.Parse(s);
64 }