最近在做一些需要用到 C# 开发的项目,许久未碰有些生疏,因此决定把语言的基础内容先都快速过一遍。为方便查阅,挑选最精简的部分整理于该博客。
【说明】
- 本系列的目标是整理出十个以内的博客(传送门),其中每个博客大概包含 10 个左右的非常简短的 Section,适合快速入门。目前更新到:精简 C# 入门(四)
- 本系列不适用于完全的编程初学者(未接触任何计算机语言),这一类读者建议仔细学习【参考资料】中的视频资源
【参考资料】
1.b站:【01_C#入门到精通】新手强烈推荐:C#开发课程,一整套课程
文章目录
#1 异常处理 try-catch
近似于 Python 的 try-except
try
{
// 可能出现异常的代码块
}
catch
{
// 出现异常后需要执行的代码块
}
恰当地使用 try-catch
,可以实现一些 if else
语句无法实现的效果,例如:
int n = 0;
Console.WriteLine("请输入一个数字");
try
{
n = Convert.ToInt32(Console.ReadLine());
}
catch
{
Console.WriteLine("请不要输入其他字符!");
}
#2 查看运行时间
对于两个不同的算法,可以通过比较其运行时间来判断优劣。示例:
using System.Diagnostics; // 需要现在开头引用一个命名空间
Stopwatch sw = new Stopwatch();
sw.Start();
// 算法
sw.Stop();
Console.WriteLine(sw.Elapsed);
#3 选择与循环:if & for
使用 Tab + Tab
快捷键,实现快速生成结构体格式,例如输入 for
直接按两下 Tab
,效果:
for (int i = 0; i < length; i++)
{
}
其余的大部分结构体都适用于该快捷键
3.1 if else
if (判断条件 1)
{
// 代码块
}
else if (判断条件 2)
{
// 代码块
}
else
{
// 代码块
}
3.2 switch case
switch (变量或表达式的值)
{
case 值1: // 代码
break;
case 值2: // 代码
break;
default: // 代码
break;
}
3.3 while
while (循环条件)
{
// 代码块
}
使用 break
可以跳出当前循环
使用 continue
跳过本次循环,回到循环条件
3.4 do while
while 循环:先判断再执行
do while 循环:先执行再判断
do
{
// 代码块
}while(循环条件)
3.5 for
for (int i = 0; i < length; i++)
{
// 代码块
}
3.6 for each
foreach (var item in collection)
{
// 代码块
}
var
的作用详见 精简 C# 入门(一)Section #5.2,可以替换为其他数据类型
collection
包含数组(int[]…)与集合(ArrayList, HashTable)
以上代码中的关于
数组
的介绍位于本博客的 Section #11,而关于集合
这个概念则可以先忽略,其内容在 精简 C# 入门(四)Section #7, #8 中会有详细介绍
#4 断点与调试
先加个断点,然后按 F5
进行调试
F11
逐语句调试(单步调试)
F10
逐过程调试。相比于逐语句调试,逐过程调试不会跳入具体函数中去。例如下图中,F10
不会跳入函数 GetMax
中去,而 F11
会逐语句执行每一行代码。
#5 三元表达式
语法:
变量 = 表达式1 ? 表达式2 : 表达式3
表达式1
True 就执行 表达式2
,False 则执行 表达式3
,例如:
int max = n1 > n2 ? n1 : n2;
#6 产生随机数
这一块是在【参考资料】(1) 的 P61 中突然中途插入的内容,个人感觉其与上下文的关系有点割裂,因此仅做一个简短总结。
Random r = new Random(); // 创建能够生成随机数的对象
int rndInt = r.Next(1, 10); // 调用该对象的方法,产生一个 1-9 之间的随机数
#7 常量
const 常量类型 常量名 = 常量值;
const double pi = 3.14;
相较于变量,常量不能被修改(重新赋值)
#8 枚举 enum
枚举类型是一种特殊的类,与类同级,因此直接写在命名空间内,定义:
public enum Gender
{
man,
woman
}
有了 Gender
这个类,在之后的 Main 函数中,我们就可以创建类对象,例如:
Gender gender = Gender.man;
更具体的使用方式如下图:
枚举类型与 int
类型兼容(可以相互转换),依旧使用刚刚定义好的的 Gender
类:
Gender gender = Gender.woman;
int n = (int)gender;
>>>
"1"
int n = 0;
Gender gender = (Gender)n;
>>>
"man"
更复杂的,枚举类型中的变量还可以进行赋值。赋值后,该变量转换成 int
时的数值等于该赋值。并且改变量之后的其他变量所对应的 int
数值也会发生改变,具体如下图:
枚举类型与 string
不兼容,因此相互转换要麻烦一些(尤其是 string
转枚举)。使用以上 Animal
类为例:
// 枚举转 string
string str = Animal.dog.ToString();
>>>
"dog"
// string 转枚举
string str = "dog";
Animal animal = (Animal)Enum.Parse(tyepof(Animal), str);
>>>
"dog"
#9 结构 struct
一次性声明多个不同类型的变量
public struct Person
{
public string _name,
public string _gender,
public int _age,
string _nickname
}
public
关键字使得其修饰的字段能由外部进行访问和修改,例如 _name 这个字段。未由 public
修饰的字段默认为 private
,无法由外部进行修改,例如 _nickname。
注意:我们将结构中的“变量”称之为字段。与变量的唯一性不同,字段可以同时存在同名的多个,例如不同人可以有相同的 _name 字段。因此为了体现这一差别,一般习惯在字段前加上一个下划线。
示例:enum
in struct
public struct Person
{
public string _name,
public Gender _gender,
public int _age,
string _nickname
}
public enum Gender
{
man,
woman
}
class Program
{
static void Main(string[] args)
{
Person p1;
p1._name = "小红";
p1._gender = Gender.woman;
p1-_age = 99;
}
}
#10 数组 list
一次性存储多个相同类型的变量
数组类型[] 数组名 = new 数组类型[(数组长度)] // ()意味着可以省略
数组的声明
示例(1):
int[] nums = new int[10]; // 声明一个数组,此时默认数组内 10 个元素均为 0
nums[0] = 1; // 修改第 0 个元素为 1
示例(2):
int[] nums1 = {
1, 2, 3};
int[] nums2 = new int[3] {
1, 2, 3};
数组的属性
nums.Length >>> 10 // 长度
不同于变量,外部函数可以直接对传入的数组进行修改,从而改变数组在该函数外部的值。例如以下代码中,Change
函数更改了 Main
函数中的数组 nums
,但并未改变变量 n
:
static void Main(string[] args)
{
int n = 0;
int[] nums = {
0 };
Program.Change(n, nums);
Console.WriteLine(n);
Console.WriteLine(nums[0]);
Console.ReadKey();
}
static void Change(int n, int[] nums)
{
n += 1;
nums[0] += 1;
}
>>>
"0
1"
#11 冒泡排序
由于本博客默认读者并不是完全不会其他任何计算机语言的,因此冒泡排序的原理不在这里赘述。直接给出 C# 冒泡排序的实现方式(从小到大):
int[] nums = {
3, 4, 7, 1, 6, 6, 8 };
for (int i = 0; i < nums.Length; i++)
{
for (int j = 0; j < nums.Length-1-i; j++)
{
if (nums[j] > nums[j+1])
{
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
for (int i = 0; i < nums.Length; i++) {
Console.Write(nums[i]); }
Console.ReadKey();
>>>
"1346678"
当然,C# 中有内置的方法能帮助我们快速实现数组的升序 or 降序排序:
Array.Sort(nums); // 升序
Array.Reverse(nums); // 降序