#1 创建项目 & Visual Studio 基本设置
使用平台:Visual Studio 2019
创建项目:选择 控制台应用 (.NET Framework)
创建完成后的初始页面:
区域1:引用区
引用 命名空间 namespace(类似 Python 中的 import 库)
区域2:代码区
由大到小分别为 命名空间 namespace > 类 class > 方法 method,分别对应区域 2, 2.1, 2.1.1(可以将这三者粗略地理解为 Python 中的 库 > 类 > 方法)
修改字体:建议使用 Consolas
工具 → \to→ 选项 → \to→ 字体和颜色
更改启动项目
在默认情况下,不管解决方案中含有几个项,默认情况下在点击启动 & F5 时只会运行第一个项,例如下图中的 ConsoleApp2。
若想要运行其他项,例如上图中的 ConsoleApp3,则需进行一些设置:右键单击解决方案 → \to→ 属性 → \to→ 更改启动项目为 “当前选定内容”
#2 Hello World!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(“Hello World!”);
Console.ReadKey(); // 获取用户按下的下一个字符
}
}
}
第二行代码 Console.ReadKey(); 功能见注释,目的在于暂停程序,防止控制台闪退(如果不添加,控制台在输出 “Hello World” 后将马上退出)
运行:单击运行按钮 & F5
错误检查:点击生成解决方案 & F6
在运行项目之前,可以先通过生成解决方案来检查潜在错误,效果如图:
#3 注释
单行注释 //
// 这是单行注释
1
多行注释 /**/
/* 这是
多行注释 */
1
2
快捷注释 Ctrl + K + C
选中目标区域后按下 Ctrl + K + C (取消注释为 Ctrl + K + U)
文档注释 ///
在命名空间、类、方法前输入 ///,会自动生成一个文档注释模板,例如:
///
///
///
///
///
///
public static int GetMax(int n1, int n2)
{
int n = 1;
return n1 > n2 ? n1 : n2;
}
填入内容后:
///
/// 求两个整数中的较大值
///
/// 第一个整数
/// 第二个整数
/// 较大的整数
public static int GetMax(int n1, int n2)
{
return n1 > n2 ? n1 : n2;
}
#4 常用快捷键
Ctrl + S 保存
F1 查看文档
Ctrl + K + C 快捷注释(取消注释为 Ctrl + K + U)
#region … # endregion 折叠冗余代码,使整体代码更加简洁,如下图:
三个大红框分别为:折叠前,添加后,折叠后
左侧出现的加减符号用于折叠及展开
#5 变量和数据类型
示例:
int n1 = 1;
double n2 = 3.14;
string name = “小红”;
char gender = ‘女’;
bool ifCorrect = true;
5.1 变量的作用范围
在一个 {} 内声明的变量仅在当前大括号内生效(可读、可写),这个范围包括大括套的嵌套。
而在两个平行的函数之间,由于无法在函数1中访问函数2内定义的变量,我们可以通过在类中创建静态变量的方式,来模拟全局变量。以下代码展示了静态变量的基础应用:
class Program
{
static double _PI = 3.14;
static void Main(string[] args)
{
double r = 2;
double A = _PI * r * r;
AccuratedPI();
double A_accurated = _PI * r * r;
Console.WriteLine("Initial:{0}, Accurated:{1}", A, A_accurated);
Console.ReadKey();
}
static void AccuratedPI()
{
_PI = 3.14159265;
}
}
“Initial:12.56, Accurated:12.5663706”
5.2 值类型 vs 引用类型
注意:这个 Section 中有大量在之后的博客中才会具体介绍的内容,读者可以先跳过
C# 中的变量主要分为这两种类型。其中:
值类型:int, double, char, enum, struct
引用类型:string, 自定义类, 数组
还有一种特殊的 var 类型,能够根据输入自动为变量分配数据类型。例如下例中的 n 会被自动分配为 int 类型,ns 为 int[] 类型
var n = 3;
var ns = new int[] { 0, 1 };
1
2
不理解以上 enum, struct, 自定义类, 数组 这几个概念的读者请忽略他们,这些内容将在之后的两篇博客中具体描述:精简 C# 入门(二), 精简 C# 入门(三))
值类型、引用类型在内存分配上的区别(这部分不重要,可以忽略)
值类型行直接储存在栈之中
引用类型的地址储存在栈之中,但其本体储存与堆之中
值类型、引用类型在可修改性上的区别
(这个 “可修改性” 的表述可能不太恰当,日后会做修改)。如下图,可得
对于值类型 double d 无论在外部函数中怎么修改,其值均为初值
对于引用类型 string name 和 int[] list:
在外部函数中对其整体的修改不会影响它们在 Main 函数中的值,正如 Change 1
在外部函数中对其元素的修改会影响,正如 Change 2
(string 可以理解为只允许读不允许写的 char[],这导致无法对其元素进行修改)
#6 输出(Write) & 接收(Read)
Write
From Section 2:
Console.WriteLine(); // 输出一个字符串并换行,当字符串为空时,相当于一个换行符 \n
Console.Write(); // 输出但不换行
1
2
Read
From Section 2:
Console.ReadKey(); // 读取输入的一个键
Console.ReadLine(); // 读取输入的一个字符串
1
2
示例:
Console.WriteLine(“请输入你的QQ”);
string input = Console.ReadLine();
Console.WriteLine(“你的QQ为:{0}”, input);
Console.ReadKey();
1
2
3
4
6.1 占位符 {}
C# 中的占位符有点类似于 Python 中的 .format,都需要使用 {}。示例:
int a = 1;
int b = 11;
Console.WriteLine(“{0}+{1}={2}”, a, b, a+b);
“12”
保留数位:{0:0.00} 表示对第 0 个变量保留两位小数
6.2 转义符
\n 换行
\t Tab
\b Backspace
" 表示 “,实现在字符串中显示 "
\ 表示 \,常用于地址字符串中,例如 “C:\Users\Desktop”
@”…" 主要有两个作用:
取消 \ 的转义作用,例如 @“C:\Users\Desktop”
将字符串按照原格式输出,例如(删去 @ 则会报错)
Console.WriteLine(@“lala~
yaya~”);
“lala~
yaya~”
#7 运算符
7.1 算数运算符
+, -, *, /, % 加,减,乘,除,取余
运算结果(输出)的数据类型,与输入变量中范围最大的那个相同,例如 int % double = double
7.2 复合运算符
++, –
a++ = a=a+1
++, – 除了跟在变量后,还可以放在变量前(如 ++a),这是其含义也发生了一定程度上的改变,具体可自行查阅。(作者认为理解掌握 a++ 已经足够了)
+=, -=
a+=5 = a=a+5
当然除此之外还有 *=, /=, %=
7.3 关系运算符
, <, >=, <=, ==, !=
7.4 逻辑运算符
&&, ||, !,与,或,非
逻辑运算符之间存在优先级差异,并且 && 与 & 同表示逻辑与但仍有一些不同。但是针对这两点,作者认为是可以忽视它们的:
在优先级方面,使用括号来体现优先级,例如:
// 由于 || 优先级低于 &&,因此上下两行所表示的含义一致
// good
bool judge = (a > b) || (b > c && c > d);
// bad
bool judge = a > b || b > c && c > d;
对于使用 && or &,绝大部分情况使用 && 即可,|| 同理
#8 数据类型转换
8.1 隐式类型转换
特点:自动发生
要求:两种类型兼容,且目标类型范围 > 原类型范围,例如 int 转 double
int n1 = 3;
int n2 = n1;
1
2
8.2 显示类型转换
特点:需要使用特定语法 (目标类型)原变量
要求:两种类型兼容,且目标类型范围 < 原类型范围,例如 double 转 int
double n1 = 3.14;
int n2 = (int)n1;
1
2
8.3 Convert 强制类型转换
使用 Convert.ToXXX(),例如:
string str = “123”;
int n1 = Convert.ToInt32(str);
double n2 = Convert.ToDouble(str);
1
2
3
8.4 Parse, TryParse 强制类型转换
例如使用 int.Parse() 将 string 转换为 int:
string str = “123”;
int n1 = int.parse(str);
1
2
关于 Parse, TryParse 更详细的示例:由于 TryParse 即使转换出错也不会产生报错,因此这两种方法适用于不同的场景