出版时间:2019-11,丹尼尔·索利斯(Daniel,Solis)卡尔·施罗坦博尔()卡尔·施罗坦博尔(Cal,Schrotenboer) 著,窦衍森,姚琪琳 等 译
编程环境
win10 LTSC安装 visual studio
查看win10版本: winver
win10 1809 不支持 visual studio 2022安装 4.8.1 ,参考: https://learn.microsoft.com/zh-cn/troubleshoot/developer/visualstudio/general/visual-studio-2022-unsupported-operating-systems
开发环境
-
Roslyn 是微软公司开源的 .NET 编译器, 安装 visual studio 的.net 桌面开发环境后,可以搜索 csc.exe (C#的编译器)加入path,这样就可以使用命令行编译c# 源代码,如
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\Roslyn
-
可以使用 visual studio code,安装
C# Dev Kit
第 1 章 C#和.NET 框架
20 世纪90 年代末的Windows编程:
- Win32 API 不是面向对象的
- MFC是面向对象的,但一致性差
- COM(组件对象模型)概念简单,但编写复杂
新平台目标:
In 2002, Microsoft released the first version of the .NET Framework: 经过20+年的持续更新优化,该技术体系是可信赖的。
.NET Framework 的构成:
CLR:
- Memory management and garbage collection
- Code safety verification
- Code execution, thread management, and exception handling
GC自动从内存中删除程序不再访问的对象:检查内存泄漏非常困难和耗时。
The programming tools:
-
The Visual Studio integrated development environment (IDE)
-
.NET-compliant compilers (e.g., C#, Visual Basic .NET, F#, IronRuby, and managed C++)
-
Debuggers
-
Web development server-side technologies, such as ASP.NET and WCF
GC自动垃圾收集:面相开发的效率提升,面向执行的安全提升。
JIT编译器:不被本机调用的代码不会被编译,被调用的代码会被编译一次(第一次启动有点慢)。
第2章 C#和.NET Core
- .NET Core是高度模块化的,可以通过NuGet包自动升级。
- .NET Core已经支持windows下的WPF
第3章 C# 编程概述
- C#是OOP语言,程序、类型声明、命名空间都是对象
- 程序由一个或多个类型声明构成(如类)
- 类型声明由命名空间组织
- 每个C# 程序必须有一个Main方法作为程序的入口
@
可以作为标识符的第一个字母
创建SimpleProgram.cs
using System; // 使用其中的 class console.WriteLine() 函数
namespace simple
{// 声明新的空间,其内部都是该空间的成员
class Program
{
static void Main()
{// Main为特殊函数,是程序的起点
Console.WriteLine("Hello world!世界,你好!");
}
}
}
- 编译命令: csc SimpleProgram.cs
- Console.WriteLine 的格式化字符串前有
$
, 其中的变量才会被替换,否则被视为字符串字面量 - Console.WriteLine自动加换行, Console.Write不自动加换行
- 标记可以引用替换值位置以外的位置,不会发生编译错误,但会产生运行时错误
using System;
namespace simple
{ class Program
{
static void Main()
{
int var1=3,var2=6;
Console.WriteLine("两个整数为:{var1},{var2}");
Console.WriteLine($"两个整数为:{var1},{var2}");
}
}
}
/*
两个整数为:{var1},{var2}
两个整数为:3,6
*/
格式说明符语法
-
宽度和对齐格式说明放在前面
-
C,c 货币,具体货币符号和所在区域有关,保留2位小数
-
D,d 十进制整数,位数不够左侧补0
-
F,f, 定点表示法(f 是fixed 不是float)十进制小数,精度为小数位数
-
G,g,紧凑的定点表示或科学记数法表示,具体取决于值。如果未列出任何说明符,则这是默认值。精度说明符:取决于值。
Sample: Console.WriteLine("{0 :G4}", 12.3456789);
Output: 12.35 -
X,x,十六进制,区分大小写,一串十六进制数字。十六进制数字 A 到 F 将匹配说明符。精度说明符:要在输出字符串中使用的最小位数。如果数字的数字较少,则左侧将填充 0。
Sample: Console.WriteLine("{0 :x}", 180026);
Output: 2bf3a -
N,n,数,类似于定点表示F,f,但在每组三位数字之间有逗号或句点分隔符,从小数点开始向左移动。
使用逗号还是句点取决于 PC 的区域性设置
精度说明符:小数位数。
示例:Console.WriteLine(“{0 :N2}”, 12345678.54321);
输出:12,345,678.54 -
P,p, 百分比,表示百分比的字符串。该数字乘以 100。精度说明符:小数位数。
示例:Console.WriteLine("{0:P2}", 0.1221897);
输出: 12.22 % -
E,e,科学计数法,区分大小写,带有尾数和指数的科学记数法。指数前面由字母 E,E 字符将与说明符的大小写相同。
精度说明符:小数位数。
示例:Console.WriteLine("{0:e4}",12.3456789);
输出:1.2346e+001
using System;
namespace simple
{
class Program
{
static void Main()
{
double cash = 12345.678;
Console.WriteLine("货币格式测试:{0,-20:C}", cash);
Console.WriteLine($"货币格式测试:{cash,20:c}");
Console.WriteLine($"货币格式测试:{cash:c,20}");
Console.WriteLine();
int i = 12345678;
Console.WriteLine("十进制整数格式测试:{0,-20:D20}", i);
Console.WriteLine($"十进制整数格式测试:{i,20:d20}");
Console.WriteLine();
double d = 53242452111.123456;
Console.WriteLine("十进制小数格式测试:{0,-20:F4}", d);
Console.WriteLine($"十进制小数格式测试:{d,20:f4}");
Console.WriteLine();
Console.WriteLine("{0 :N2}", 12345678.54321);
Console.WriteLine();
Console.WriteLine("{0:e4}", 12.3456789);
}
}
}
/*
货币格式测试:¥12,345.68
货币格式测试: ¥12,345.68
货币格式测试:c212346
十进制整数格式测试:00000000000012345678
十进制整数格式测试:00000000000012345678
十进制小数格式测试:53242452111.1235
十进制小数格式测试: 53242452111.1235
12,345,678.54
1.2346e+001
*/