第一个运行程序的创建
先打开vs,选择控制台应用(.net framework)
配置项目
进入主界面
左边是解决方案资源管理器
照不到可以在视图打开,第四个就是
回到主程序,需要打印一行字符可以使用Console.WriteLine()
也可以使用Console.WriteLine()
运行一下看下效果
看一下Console.WriteLine()的效果,为了区分我多加了几条语句
运行结果如下,可以看出来区别了吧,简单来说就是一个换行,一个没有换行
当然还有一个区别,当我在语句内不加任何字符时Console.WriteLine()会报错
数据类型
按存储位置划分为值类型,引用类型
按定义类型分为预定义类型,自定义类型
区别主要在存储位置,值类型存储在栈,引用类型存储在堆
变量
当我们需要存储数据时,可以创建变量能够存储数据,根据所需要的存储的数据可以定义不同的数据类型
变量名命名规范:
1. 满足标识符的定义规则
2. 驼峰命名法: 首单词首字母小写,后面单词首字母大写.
比如 studentAge , studentName 3. 变量名尽量能见名知意
使用变量分为3步:1声明、2赋值、3使用
1.声明变量的语法:数据类型 变量名;
假如我要存放一个整数,可以这样声明一个变量
2.给变量赋值,可以使用 = 号,如下给i赋值为10
3.打印一下,可以看的i的值为10
当然还可以声明其他的数据类型
运行结果
可以根据自己的需求来定义不同数据类型的变量
运算符
算术运算符
例子
赋值运算符
例子
比较运算符
逻辑运算符
例子
if语句
基础 if(单分支)
if ... else 双分支(二选一)
执行顺序
if ... else if ... else 多分支
依次判断,找到第一个满足条件就执行
嵌套 if(if 里面再写 if)
switch语句
执行流程:
① 首先计算表达式的值
② 依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,遇到break就会结束switch ③ 如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句,然后结束switch
基础写法
case 穿透
static void Main(string[] args) { int month = 2; int days = 0; switch (month) { case 1: goto case 3; case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: days = 28; break; default: days = 0; break; } Console.WriteLine(days); }ase 1匹配到后,执行goto case 3,直接跳到 case3 的代码。
static void Main(string[] args) { int month = 3; int sumDay = 0; switch (month) { case 12: sumDay += 30; goto case 11; case 11: sumDay += 31; goto case 10; case 10: sumDay += 30; goto case 9; case 9: sumDay += 31; goto case 8; case 8: sumDay += 31; goto case 7; case 7: sumDay += 30; goto case 6; case 6: sumDay += 31; goto case 5; case 5: sumDay += 30; goto case 4; case 4: sumDay += 31; goto case 3; case 3: sumDay += 28; goto case 2; case 2: sumDay += 31; goto case 1; case 1: break; } Console.WriteLine(sumDay); }month=3:先执行 case3,sumDay +=28,然后goto case2,继续累加,直到 case1 break。 这就是利用 goto case 向上累加,经典的 switch 穿透题目。
循环结构
for 循环
执行顺序
例子
// 输出1~5 for(int i = 1; i <= 5; i++) { Console.WriteLine(i); }while 循环
执行顺序
例子
// 输出1~5 int i = 1; while (i <= 5) { Console.WriteLine(i); i++; }do-while 循环
先执行,后判断,至少跑 1 次
执行顺序
例子
// 输出1~5 int i = 1; do { Console.WriteLine(i); i++; } while (i <= 5);数组
声明和初始化数组
数组声明语法:
数据类型[] 数组名
例子
int[] arr1; string[] arr2;数组初始化:
数组必须先初始化,才能使用
// 声明一个包含5个整数的数组(未初始化) int[] numbers1; // 声明并初始化数组 int[] numbers2 = new int[5]; // 包含5个默认值(0)的数组动态初始化: 初始化时只指定数组长度,由系统为数组分配初始值
格式: 数组名 = new 数据类型[数组长度];
// 声明一个包含5个整数的数组(未初始化) int[] numbers1;声明与初始化合并: 数据类型[] 数组名 = new 数据类型[数组长度];
// 声明并初始化数组 int[] numbers2 = new int[5]; // 包含5个默认值(0)的数组静态初始化: 初始化时,就可以指定数组要存储的元素,系统会自动计算出该数组长度
格式: 数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据3,...}
int[] numbers3 = new int[] { 1, 2, 3, 4, 5 }; // 数组字面量初始化 string[] arr = new string[]{"hello","world","haha"};简化格式: 数据类型[] 数组名 = {数据1,数据2,数据3,...}
int[] numbers4 = { 10, 20, 30, 40, 50 }; // 简化语法(仅在声明时可用) // 字符串数组 string[] names = { "Alice", "Bob", "Charlie" };操作数组的元素
数组内存地址的访问方式
格式: 数组名
数组内部保存的数据的访问方式
格式: 数组名[索引]
索引: 是数组容器中空间的编号
作用: 访问数组容器中的空间位置
特征1: 索引从0开始
特征2: 索引是连续的
特征3: 索引逐一增加,每次加1
案例:
int[] scores = { 90, 85, 78, 92, 88 }; // 访问元素 Console.WriteLine(scores[0]); // 输出: 90 Console.WriteLine(scores[3]); // 输出: 92 // 修改元素 scores[2] = 80; // 将第三个元素改为80 Console.WriteLine(scores[2]); // 输出: 80List泛型列表
List 是 C# 中最常用的集合类型之一,它属于 了强大的动态数组功能。System.Collections.Generic 命名空间,提供 List 是一个C#为我们封装好的类,它的本质是一个泛型的数组, List 类 帮助我们实现了很多方法,比如数组的增删查改,都提供给了我们对应的方法,方便我们使用,不需 要我们自己来实现相关的逻辑
List常用操作
1. 创建 List
List<int> numbers = new List<int>(); // 空列表 List<string> names = new List<string>() { "Alice", "Bob", "Charlie" }; // 初始化 列表 List<double> values = new List<double>(10); // 指定初始容量2. 添加元素
numbers.Add(1); // 添加单个元素 numbers.AddRange(new int[] { 2, 3, 4 }); // 添加多个元素3.访问元素
int first = numbers[0]; // 通过索引访问 numbers[1] = 10; // 通过索引修改4.常用方法
int count = numbers.Count; // 获取元素数量 bool contains = numbers.Contains(3); // 检查是否包含 int index = numbers.IndexOf(3); // 查找索引 numbers.Insert(1, 5); // 在指定位置插入 numbers.Remove(3); // 移除指定元素 numbers.RemoveAt(0); // 移除指定位置的元素 numbers.Clear(); // 清空列表5. 遍历 List
// foreach 循环 foreach (int num in numbers) { Console.WriteLine(num); } // for 循环 for (int i = 0; i < numbers.Count; i++) { Console.WriteLine(numbers[i]); }字符串string
字符串 string是一个不可变(不可修改)的字符序列(数组),为引用类型,字面量用双引号""包裹。
常用操作
字符串的相等为值比较,只要字符序列相同即可。
string obj = "abc"; string str = "a"; string obj2 = str + "bc"; Console.WriteLine(obj == obj2); //truestring 是 System.String在 .NET 中的别名。
使用Length属性可以获取字符串的长度:
string text = "Hello"; Console.WriteLine(text.Length); // 输出: 5[] 运算符可用于只读访问字符串的个别字符。
有效索引于 0 开始,且必须小于字符串的 长度:
string str = "test"; char x = str[2]; // x = 's';判断是否为空
string.IsNullOrEmpty : 静态方法, 指示指定的字符串是null 还是空字符串 ("")
string.IsNullOrWhiteSpace : 静态方法, 指示指定的字符串是 null 、空还是 仅由空白字符组成
string s1 = "abcd"; string s2 = ""; string s3 = null; string s4 = " "; //空格字符串 Console.WriteLine(string.IsNullOrEmpty(s1)); // false, s1不是空字符串 Console.WriteLine(string.IsNullOrEmpty(s2)); // true, s2是空字符串 Console.WriteLine(string.IsNullOrEmpty(s3)); // true, s3是null Console.WriteLine(string.IsNullOrEmpty(s4)); // false, s4是空格字符串, 不 是null或空字符串 Console.WriteLine(string.IsNullOrWhiteSpace(s1)); // false, s1不是空字符串 Console.WriteLine(string.IsNullOrWhiteSpace(s2)); // true, s2是空字符串 Console.WriteLine(string.IsNullOrWhiteSpace(s3)); // true, s3是null Console.WriteLine(string.IsNullOrWhiteSpace(s4)); // true, s4是空格字符 串, 是空白字符串$字符串插值
字符串插值的格式: $"{}" ,大括号中可以是一个变量,一个 (简单)表达式语句,还支持设置格式。功能强大、使用方便,老人孩子都爱用!
{} 字符转义,用两个 {{}} 即可,如果只有一边,则用单引号'{{' ,即输出为 { 。
使用三元运算符?表达式,用括号包起来即可,因为“:”在插值字符串中有 特殊含义,即格式化。
var name = "sam"; Console.WriteLine($"Hello {name}!"); //Hello sam! Console.WriteLine($"日期:{DateTime.Now.AddDays(1):yyyy-MM-dd HH:mm:ss}"); //日期:2024-01-18 23:21:55! Console.WriteLine($"Length:{name.Length}"); //Length:3 Console.WriteLine($"Length:{(name.Length>3?"OK":"Error")}"); //Length:Error