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

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

【说明】

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

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

#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 注释

单行注释 //

// 这是单行注释

多行注释 /**/

/* 这是
多行注释 */

快捷注释 Ctrl + K + C
选中目标区域后按下 Ctrl + K + C (取消注释为 Ctrl + K + U

文档注释 ///
在命名空间、类、方法前输入 ///,会自动生成一个文档注释模板,例如:

/// <summary>
/// 
/// </summary>
/// <param name="n1"></param>
/// <param name="n2"></param>
/// <returns></returns>
public static int GetMax(int n1, int n2)
{
    
    
    int n = 1;
    return n1 > n2 ? n1 : n2;
}

填入内容后:

/// <summary>
/// 求两个整数中的较大值
/// </summary>
/// <param name="n1">第一个整数</param>
/// <param name="n2">第二个整数</param>
/// <returns>较大的整数</returns>
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 折叠冗余代码,使整体代码更加简洁,如下图:

  1. 三个大红框分别为:折叠前,添加后,折叠后
  2. 左侧出现的加减符号用于折叠及展开
    在这里插入图片描述

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

不理解以上 enum, struct, 自定义类, 数组 这几个概念的读者请忽略他们,这些内容将在之后的两篇博客中具体描述:精简 C# 入门(二), 精简 C# 入门(三))

值类型、引用类型在内存分配上的区别(这部分不重要,可以忽略)

  1. 值类型行直接储存在栈之中
  2. 引用类型的地址储存在栈之中,但其本体储存与堆之中
    在这里插入图片描述

值类型、引用类型在可修改性上的区别

(这个 “可修改性” 的表述可能不太恰当,日后会做修改)。如下图,可得

  1. 对于值类型 double d 无论在外部函数中怎么修改,其值均为初值
  2. 对于引用类型 string nameint[] list
    在外部函数中对其整体的修改不会影响它们在 Main 函数中的值,正如 Change 1
    在外部函数中对其元素的修改会影响,正如 Change 2
    (string 可以理解为只允许读不允许写的 char[],这导致无法对其元素进行修改)
    在这里插入图片描述

#6 输出(Write) & 接收(Read)

Write
From Section 2:

Console.WriteLine(); // 输出一个字符串并换行,当字符串为空时,相当于一个换行符 \n
Console.Write();     // 输出但不换行

Read
From Section 2:

Console.ReadKey();   // 读取输入的一个键
Console.ReadLine();  // 读取输入的一个字符串

示例:

Console.WriteLine("请输入你的QQ");
string input = Console.ReadLine();
Console.WriteLine("你的QQ为:{0}", input);
Console.ReadKey();

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"
@"..." 主要有两个作用:

  1. 取消 \ 的转义作用,例如 @"C:\Users\Desktop"
  2. 将字符串按照原格式输出,例如(删去 @ 则会报错)
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 逻辑运算符

&&, ||, !,与,或,非

逻辑运算符之间存在优先级差异,并且 &&& 同表示逻辑与但仍有一些不同。但是针对这两点,作者认为是可以忽视它们的:

  1. 在优先级方面,使用括号来体现优先级,例如:
// 由于 || 优先级低于 &&,因此上下两行所表示的含义一致
// good
bool judge = (a > b) || (b > c && c > d);
// bad
bool judge = a > b || b > c && c > d;
  1. 对于使用 && or &,绝大部分情况使用 && 即可,|| 同理

#8 数据类型转换

8.1 隐式类型转换

特点:自动发生
要求:两种类型兼容,且目标类型范围 > 原类型范围,例如 intdouble

int n1 = 3;
int n2 = n1;

8.2 显示类型转换

特点:需要使用特定语法 (目标类型)原变量
要求:两种类型兼容,且目标类型范围 < 原类型范围,例如 doubleint

double n1 = 3.14;
int n2 = (int)n1;

8.3 Convert 强制类型转换

使用 Convert.ToXXX(),例如:

string str = "123";
int n1 = Convert.ToInt32(str);
double n2 = Convert.ToDouble(str);

8.4 Parse, TryParse 强制类型转换

例如使用 int.Parse()string 转换为 int

string str = "123";
int n1 = int.parse(str);

关于 Parse, TryParse 更详细的示例:由于 TryParse 即使转换出错也不会产生报错,因此这两种方法适用于不同的场景
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43728138/article/details/115771081