VS2017-实验手册-中文
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一 C# 7.0 特性与 IDE 扩展
一、本地方法或内嵌方法:
定义在方法内的方法称为本地方法。 • 打开 Visual Studio 2017,点击文件 -> 新建项目 -> Console App (.Net Framework) • • 项目名称 “UseLocalFunctitic System.Console; namespace UseLocalFunctions { // Exercise 1 class Program { static void Main(string[] args) { void Add(int x, int y) { WriteLine($"Sum of {x} and {y} is : {x + y}"); }
public class Program { public static void Main(string[] args) { Shape sh = new Rectangle(); Program obj = new Program();
sh.Radius = 5; sh.Height = 10; sh.Length = 15; obj.CheckShape(sh); ReadLine(); } public void CheckShape(Shape sh) { switch (sh) { case Circle c: WriteLine($"circle with radius {sh.Radius}"); break; case Rectangle s when (sh.Length == sh.Height): WriteLine($"{sh.Length} x {sh.Height} square"); break; case Rectangle r: WriteLine($"{sh.Length} x {sh.Height} rectangle"); break; default: WriteLine("<unknown shape>"); break; case null: throw new System.ArgumentNullException(nameof(shape)); } } } public class Shape { public int Height; public int Length; public int Radius; } public class Circle : Shape { public int Height; public int Length; public int Radius; } public class Rectangle : Shape { public int Height; public int Length; public int Radius; } public class Square : Shape { public int Height; public int Length; public int Radius; }
二、模式匹配 Pattern Matching:
C# 7.0 支持模式匹配的特性,我们可以使用它做许多事情,下面是简单的示例。 • 注释掉上面类,粘贴下面的代码,并观察其行为。
class Program { static void Main(string[] args) { //Example 1 var myData = "Custom Data"; var myData2 = myData is string ? "String" : "Not a string"; var myData3 = myData is string a ? a : "Not a String"; WriteLine(myData2); WriteLine(myData3); //Example 2 var x = 10; dynamic y = 0b1001; var sum = y is int? $"{y * x}" : "Invalid data"; WriteLine(sum); ReadLine(); } }
2. 创建测试项目
在待测试的类名上,在右键弹出的菜单中,选择 Create Unit Tests ,可以直接创建相应的测试项目。
在弹出的创建测试项目对话框中,完善测试项目信息。
测试框架支持: • • • NUnit MSTest
默认的测试项目名称是原测试项目加上 Tests 后缀。测试类的名称是在被测试类名之后也加上 Tests 后缀。 此处,可以直接点击 Ok 完成。 默认会生成基础的测试代码。
return result; } private static BigInteger GetFactorial(int number) { if (number < 0) throw new ArgumentException("negative number", nameof(number)); return number == 0 ? 1 : number * GetFactorial(number - 1); } }
在 switch 语句中使用模式
C# 7.0 允许用户在 IS 语句和 SWITCH 语句中使用模式, 因此我们可以使用任意数据类型来匹配模式,模式可以是固 定模式,类型模式,变量模式等。下面的实验将有助于您理清概念。 • • • 可以 switch 任意类型(不仅仅基础类型) 在 case 子句中使用模式 case 子句可以有附加的条件
decimal CalculateMarks() { decimal totalMarks = 0; foreach (var subject in subjects) { totalMarks += subject.Marks; } return totalMarks; } } } public class Subject { public string SubjectName { get; set; } public decimal Marks { get; set; } }
void Multiply(int x, int y) { WriteLine($"Multiply of {x} and {y} is : {x * y}"); Add(30, 10); } Add(10, 30); Multiply(40, 30); ReadLine(); } } }
在上边的实验中,我们定义量两个内嵌方法: “Add” 和 “Multiply” 。您可以看到,我可以在定义它们的父方法中任意 调用,甚至可以在一个内联方法 Multiply 中调用另一内嵌的 Add 方法。
实验概览
实验内容
该实验包含五个部分: 1) C# 7.0 本地方法 2) C# 7.0 模式匹配 3) 实时单元测试 4) 创建 Azure App Service Linux 5) 为 Visual Studio 2017 Web 应用配置 Application Insight 该实验使用运行于 Windows 10 技术上的虚拟机。登录虚拟机,请按 CTRL+ALT+END,然后输入您的登录凭据。 Virtual Machine Win10-Base 在该实验中,用户 Admin 的口令是 Passw0rd! Role Windows 10 Client
三、实时单元测试
1. 创建项目
• • • 创建测试项目 选择 新建 -> 项目 -> Visual C# -> Class Library (.NET Framework) 命名项目为:LiveUnitTestingDemo,并确定
使用以下代码替换生成的代码。 public static class MyMath { public static int Add(int value1, int value2) { return value1 + value2; } public static int Sub(int value1, int value2) { return value1 - value2; } }
1.2 本地方法 vs 递归方法
本地方法不需要维护调用堆栈,而递归方法需要。通过执行下面的实验,来理解它们的性能差异。 • 将上面实验的 Program 类注释掉,使用下面的代码。
class Program { static void Main(string[] args) { //BigInteger factorial = GetFactorial(9000); BigInteger factorial = GetFactorialUsingLocal(9000); } private static BigInteger GetFactorialUsingLocal(int number) { if (number < 0) throw new ArgumentException("negative number", nameof(number)); else if (number == 0) return 1; BigInteger result = number; while (number > 1) { Multiply(number - 1); number--; } void Multiply(int x) => result *= x;
将测试项目中的 MyMathTests 类修改为如下代码 using Microsoft.VisualStudio.TestTools.UnitTesting; namespace LiveUnitTestingDemo.Tests { [TestClass()] public class MyMathTests { [TestMethod()] public void AddTest() { var result = MyMath.Add(2, 3); Assert.IsTrue(5 == result); } [TestMethod()] public void SubTest() { var result = MyMath.Sub(3, 2); Assert.IsTrue(1 == result); }
实验手册
目标
该导师引导的实验,可以使开发者理解与探索 Visual Studio 2017 的新特性,使用新的扩展,例如 C# 7.0、Azure App Service 等开展一些动手实验,以学习 Visual Studio 2017 的新特性。
准备
在开始实验之前,您必须在您的开发机上已经安装了企业版 Visual Studio 2017,另外还需要一个 Azure 的账号。
1.1. 带有返回类型的本地方法
在第一个实验中,我们看到的本地方法返回 void,但是并没有对返回类型的限制。您可以返回任意类型。在这个实 验中,我们创建一个名为 TotalMarks 的本地函数,它将计算总分,并返回 decimal 类型。 class Program { static void Main(string[] args) { PrintStudentMarks( 101, new Subject { SubjectName = "Math", Marks = 96 }, new Subject { SubjectName = "physics", Marks = 88 }, new Subject { SubjectName = "Chem", Marks = 91 } ); ReadLine(); } public static void PrintStudentMarks(int studentId, params Subject[] subjects) { WriteLine($"Student Id {studentId} Total Marks: {CalculateMarks()}"); WriteLine($"Subject wise marks"); foreach (var subject in subjects) { WriteLine($"Subject Name: {subject.SubjectName} \t Marks: {subject.Marks}"); }