(C#) 精简 C# 入门(二)

最近在做一些需要用到 C# 开发的项目,许久未碰有些生疏,因此决定把语言的基础内容先都快速过一遍。为方便查阅,挑选最精简的部分整理于该博客。

【说明】

  1. 本系列的目标是整理出十个左右的博客(传送门),其中每个博客大概包含 10 个左右的非常简短的 Section,适合快速入门。目前更新到:精简 C# 入门(三)
  2. 本系列不适用于完全的编程初学者(未接触任何计算机语言),这一类读者建议仔细学习【参考资料】中的视频资源

【参考资料】
1.b站:【01_C#入门到精通】新手强烈推荐:C#开发课程,一整套课程

文章目录

  • #1 异常处理
  • #2 变量的作用范围
  • #3 选择与循环:if & for
    • 3.1 if else
    • 3.2 switch case
    • 3.3 while
    • 3.4 do while
    • 3.5 for
  • #4 断点与调试
  • #5 三元表达式
  • #6 产生随机数
  • #7 常量
  • #8 枚举 `enum`
  • #9 结构 `struct`
  • #10 数组
  • #11 冒泡排序

#1 异常处理

近似于 Python 的 try-except

try
{
     
	// 可能出现异常的代码块
}
catch
{
     
	// 出现异常后需要执行的代码块
}

恰当地使用 try-catch,可以实现一些 if else 语句无法实现的效果,例如:

int n = 0;
Console.WriteLine("请输入一个数字");
try
{
     
	n = Convert.ToInt32(Console.ReadLine());
}
catch
{
     
	Console.WriteLine("请不要输入其他字符!");
}

#2 变量的作用范围

在 C# 中,在一个 {} 内声明的变量仅在当前大括号内生效(可读、可写),这个范围包括大括套的嵌套。

而在两个平行的函数之间,由于无法在函数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"

#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 (变量或表达式的值)
{
     
	case1: // 代码
		break;
	case2: // 代码
		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++)
{
     
	// 代码块
}

#4 断点与调试

先加个断点,然后按 F5 进行调试
F11 逐语句调试(单步调试)
F10 逐过程调试。相比于逐语句调试,逐过程调试不会跳入具体函数中去。例如下图中,F10 不会跳入函数 GetMax 中去,而 F11 会逐语句执行每一行代码。
(C#) 精简 C# 入门(二)_第1张图片

#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;

更具体的使用方式如下图:
(C#) 精简 C# 入门(二)_第2张图片
枚举类型与 int 类型兼容(可以相互转换),依旧使用刚刚定义好的的 Gender 类:

Gender gender = Gender.woman;
int n = (int)gender;

>>> 
"1"
int n = 0;
Gender gender = (Gender)n;

>>> 
"man"

更复杂的,枚举类型中的变量还可以进行赋值。赋值后,该变量转换成 int 时的数值等于该赋值。并且改变量之后的其他变量所对应的 int 数值也会发生改变,具体如下图:
(C#) 精简 C# 入门(二)_第3张图片
枚举类型与 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 数组

一次性存储多个相同类型的变量

数组类型[] 数组名 = new 数组类型[(数组长度)] // ()意味着可以省略

数组的声明

示例(1):

int[] nums = new int[10]; // 声明一个数组,此时默认数组内 10 个元素均为 0
nums[0] = 1;              // 修改第 0 个元素为 1

示例(2):

int[] nums1 = {
     123}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); // 降序

你可能感兴趣的:(C#,c#,visual,studio)