C#基础语法学习笔记(传智播客学习)

最近在学习C#开发知识,跟着传智播客的视频学习了一下,感觉还不错,整理一下学习笔记。

C#基础语法学习笔记

    • 1.背景知识
    • 2.Visual Studio使用
    • 3.基础知识
    • 4.变量
    • 5.运算符与表达式
    • 6.程序调试
    • 7.判断结构
    • 8.循环结构
    • 9.常量、枚举类型
    • 10.结构体类型
    • 11.数组
    • 12.方法
    • 13.outref用法
    • 14.常用方法

1.背景知识

/*
背景知识:
(背景:.net是微软的)
一、.net与C#
1. .net:又叫dotnet,指.Net Framework框架.是一种技术,一种平台
2. C#: C sharp(锋利的), 是一种编程语言(控制计算机,和计算机进行交互的语言),可以基于.net 平台进行开发应用关系: .net是一种平台,在.net平台上可以用C#语言进行.net相关程序的开发
3.Java: Java即是一种技术,又是一种语言二、.net能干什么?
1.Winform: 在.net这个平台上开发的桌面应用程序叫做 Winform应用程序开发  (桌面应用程序:通过安装到桌面)
2.ASP.NET: 在.net这个平台上开发的web(浏览器)应用程序(网站) 叫做ASP.NET  (web应用程序:通过打开浏览器输入网址访问)
3.wp7 :windows phone ,这.net这个平台上进行的手机嵌入式开发 (嵌入式开发应用程序:工业化控制设备)两种服务模式:
1.C/S :客户机(Client)/服务器(Server) :桌面应用程序 (单机的不需要服务器的不算,因为只有C,没有S,像QQ这种是C,还需要S)
2.B/S :浏览器(Browser)/服务器(Server):一般是web应用程序   三、开发工具:Visual Studio
是微软的一个IDE(Integrated Development集成开发环境),也可以在记事本中写,但是太麻烦了 ,工欲善其事必先利其器。MSDN:开发工具的帮助文档*/

2.Visual Studio使用

/* Visual Studio使用* * 一.创建项目* 文件->新建->项目->选择要创建项目的类型(目前一般是.net的控制台应用)* * 项目名称* 项目位置* 解决方案:解决方案包含项目,解决方案中可以包含多个项目(意思是这些个项目是用于解决这个方案的)* *二、界面排版** 1.菜单栏* 所有功能都会在菜单栏* 2.工具栏* 常用的工具功能,便捷* * 3.解决方案资源管理器* * 解决方案中可以包含多个项目,项目可以包含多个文件,文件中是我们写的程序* 在文件中,可以有命名空间(定义命名空间前需要引用命名空间),命名空间中可以包含类,类中可以包含方法* (在C#中类文件是以.cs结尾的)* * 程序的执行过程:* Main方法是我们程序的入口方法,当我们执行一个程序时,会首先找到Main方法,从Main的第一句开始执行,* 当Main方法执行完成后(即执行到Main方法的反大括号),程序就结束了* 一般情况下,一个项目只有一个Main方法,或者也可以没有* * 4.重置开发环境* 可以使我们的开发工具恢复至默认状态* 菜单工具->导入导出设置->重置所有设置->不保存当前所有设置->C#开发设置->完成 * * 一般的窗口不小心关闭了,在视图中找* * 三、保存/打开项目*  .sln :解决方案文件,记录着解决方案中都有哪些项目*  .csproj:项目文件,记录着项目中都有哪些文件* 项目在哪忘了,右击解决方案->在文件资源管理器中打开文件夹* * 1.打开项目:* 先找到项目路径,不要打开.cs文件,直接双击打开.cs文件,只是打开了一个类,只能看不能运行,右边也没有解决方案* 建议用vs打开.sln解决方案文件(可以打开该解决方案下的所有项目),也可以打开.csproj文件(只能打开这一个项目)* * 2.保存项目* Ctrl+s:只保存当前界面下的文件* Ctrl+shift+s:保存所有文件* * 四、设置vs的字体大小及行号显示* * 1.设置vs字体大小:工具->选项->环境->字体和颜色* 2.行号显示:工具->选项->文本编辑器->所有语言->行号* * 五、在同一解决方案下创建多个项目* 直接从头打开vs创建项目话会再弄一个新的解决方案* 如果想在同一解决方案下创建多个项目,需要先打开解决方案,然后新建就会出现选项 或者打开解决方案后右击添加* * 六、启动项目设置* 当有多个项目时,运行会运行右侧黑色加粗的项目* 想更改三种方法:* ①工具栏有个选择框* ②在右侧找到要启动的项目,右击设置为启动项目* ③在右侧右击解决方案选择属性->启动项目->单启动项目/当前选择是现在打开的项目* * 七、项目的加载与卸载* 同一解决方案下,有时候打开着多个项目,如果其他项目有错,运行当前项目可能受影响。* 这时候可以右击其他项目选择卸载(不是删除),等需要时再重新加载即可。* */using System;   //引用命名空间
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _2.Visual_Studio知识    //定义一个叫 _2.Visual_Studio知识 的命名空间
{class Program        //定义了一个名称为Program的类{static void Main(string[] args)  //这是一个方法叫Main{}}
}

3.基础知识

/** 基础知识* * 一、框架及执行过程
using System;   //引用命名空间namespace XXX   //定义一个叫XXX的命名空间
{class XXXX        //定义了一个名称为XXXX的类{static void Main(string[] args)  //这是一个方法叫Main{//在这里编写程序}}
}* 程序的执行过程:* Main方法是我们程序的入口方法,当我们执行一个程序时,会首先找到Main方法,从Main的第一句开始执行,由上往下一句一句执行* 当Main方法执行完成后(即执行到Main方法的反大括号),程序就结束了* 一般情况下,一个项目只有一个Main方法,或者也可以没有* * 二、输出* * 运行代码:点击小绿按钮或者调试->开始调试* 小技巧:* (1)vs有的会有智能提示,回车或tab键会出来* (2)输入cw,再按两下tab键,可以快速打出Console.WriteLine(); 语句* * 1.Console.WriteLine("大号"); //在屏幕中换行输出* 2.Console.Write("111");//在屏幕中不换行输出* 3.Console.ReadKey();//当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才继续执行//如果没有这一句,会一闪立马就关了* 4.Console.Clear();//对控制台输出的清屏* * * 总结:* (1)C#区分大小写* (2)C#中每一个语句都必须以分号;结束* (3)这个生成的程序在项目文件夹->bin->Debug->.exe文件,其他文件都是和调试相关的* (4)程序要先 生成(编译)后运行,直接点那个启动是把这两步和在一起了。生成是先看看对不对,所以按F6经常生成一下,F5是先 生成后运行* * 三、注释* 注释:对写的程序进行解释,是给人看的* * 1.单行注释  // * 2.多行注释 /*开始  *斜杠结束* 除了多行注释语句,还可以用工具中的注释选中的行(快捷键先ctrl+e,再按一下c)* 3.文档注释 ///* 用于对类和方法进行注释,在类或方法前面连续输入三个/,会自动生成一段注释* * 四、计算机使用的基本技巧* * 1.常用的定位快捷键:* (1)Home键:跳到这一行的最前面* (2)End键:跳到这一行的最后面* (3)Ctrl+Home键:跳到这一页的最前面* (4)Ctrl+End键:跳到这一页的最后面* (5)PageUp键:上翻页(如果代码过多,就不需要用鼠标了)* (6)PageDown键:下翻页* (7)shift键:帮助选中多个字符(和其他定位键组合使用,光标经过的地方都会被选中),不用再通过鼠标选中了* 2.一段文字的删除习惯:* 不要一个一个的删,再先选中再一起删 * (快速选中一行:Home+shift+End) * Backspace:删除当前光标前面的* Delete:删除当前光标后面的* * 3.全选/复制/粘贴/剪切* Ctrl+A/C/V/X* 注意:对话框的内容的复制?* * 4.插入、覆盖模式的困惑* 有时候误点了Insert会出现一个小黑框,就是进入了覆盖模式,右下角会出现一个OVR就是覆盖模式的意思* 再点一个Insert就会突出覆盖模式,进入插入模式* * 5.学会使用Ctrl+Z的撤销操作* 6. ,.;()的全角还是半角问题* 敲代码都是在英文状态下的半角模式* * 7.遇到异常、报错不要慌* 按住F6出现编译错误,不要慌,先去看一下* * 8.#regin #endregion* 这对指令可以折叠一段代码,前面会有一个+号就可以折叠(#regin后可以加注释)*           
#region 测试用
Console.WriteLine("你好世界!");
Console.ReadKey();#endregion* * * 五、了解.net* .net是一种多语言的开发平台,开发.net可以用多达几十种语言进行开发(多语言、单平台(但是可以跨微软的平台))* Java:是一种单语言的平台,但是可以跨平台(单语言、多平台)* * MSIL:微软中间语言 Microsoft Intermediate Language* CLR:公共语言运行时 Common Language Runtime* CLS: 公共语言规范 Common Language Specification* CTS: 通用类型系统 Common Type System* JIT: 即时编译器 Just In Time*/using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _3.基础知识
{/// <summary>/// 这个类中有一个Main方法,是我们程序的入口方法/// </summary>class Program{/// <summary>/// 程序运行时,从这里开始执行代码/// </summary>/// <param name="args">static void Main(string[] args){Console.WriteLine("大号"); //在屏幕中换行输出Console.Write("111");//在屏幕中不换行输出Console.WriteLine("你是大傻der");Console.ReadKey();//当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才继续执行//如果没有这一句,会一闪立马就关了#region 测试用Console.WriteLine("你好世界!");Console.ReadKey();#endregion}}
}

4.变量

/** 变量* * 1、概念* 变量代表着一块内存空间,我们可以通过变量名称向内存 存/取数据.有变量就不需要我们记忆复杂的内存地址* * 2、变量的定义(声明)* 数据类型 变量名* * (1)数据类型* (数值类型) int 整型*              double 浮点型*              decimal 也是浮点型:一般用于存储金钱 decimal money =1000.25m (后面有个m只是表示是decimal类型) * (非数值类型)char 单个字符类型:只能存储一个字符,并且存储的这个字符要求用单引号引起来*               string 字符串类型:就是把0个或1个或多个字符连接起来,要求用双引号引起来* 注意:* ①在C#开发环境中,直接写一个有小数点的数字,这个数字是double类型的* ②在一个小数后面加一个m或者M,就是告诉编译器这个数字是decimal类型* * (2)变量的命名规则* 1°必须以 字母 _ 或 @ 符号开头(不能以数字开头)* 2°后面可以跟任意字母、数字、下划线* 3°注意:*  ①变量名不能与C#中的关键字重复*  ②在C#中,是区分大小写的*  ③在相同的作用域内,同一变量名不能重复定义* 4°变量名要有意义,见名知意  * 5°C#变量名编码规范——Camel命名法:首个单词的首字母小写,其余单词的首字母大写 例:studentName* 6°Pascal命名规范:每个单词的第一个字母都大写 例:StudentName* 7°如果使用到英文单词的缩写,全部用大写!* * (3)声明变量的三种方式:* 变量一定要先定义,再赋值,后使用* ①先定义,再赋值 int a; a=3;* ②定义变量时直接赋值 int a=3;* ③一次声明多个同类型的变量,多个变量名称中间用逗号分隔,最后以分号结束* int a,b,c; a=1; b=2; c=3;* int a=1,b=2,c=3;* * * * 3、变量的赋值输出* 变量名 = 值* * (1)赋值符:* 赋值运算符和赋值表达式*  a =a +1;*  注意:*  ①这里的 = 等号时赋值运算符,赋值的意思,而不是数学意义上的相等*  ②变量可以重复赋值,一旦给一个变量赋了新值,那么变量中的老值就不复存在了*  * (2)连接符:* +号在C#中有两种意义:*  ①加法:两边参与运算的是数值类型,则表示是数学中的加法运算*  ②连接:可以连接两个字符串,这里的+表示连接的意思
+ 字符串变量 相当于 + 字符串变量.Tostring()
+连接的两个变量,如果一边是字符串,另一边会自动调动字符串.Tostring()方法* * (3)占位符:* 占位符由{数字}组成,数字由0开始编号* 在Console.WriteLine("")中,第一个变量/字符串可以使用占位符* 注意:* ①索引(从0开始)必须大于或等于0,且小于参数列表 的大小* ②用逗号分开的叫参数,Console输出的永远是第一个参数的内容,后面的参数只是用于替换前面占位符的值* * 4、例:借助第三变量交换变量* int t;//定义第三变量t = a;a = b;  b = t;* * 5、字符串类型:* (1)Console.ReadLine();* 作用:用于接收用户的输入* 注意:* 用于让用户从键盘上输入一句话,让程序执行到下面这句话,就会暂停,按回车程序将继续执行* 输入的数据默认是字符串类型,所以要定义一个字符串变量来存储用户输入的值* (2)字符串转义* 1°什么时候用?* 当我们需要在字符串中输入一些特殊字符时,比如:半角引号、换行、退格,就需要使用转义字符* 2°概念:* 转义字符是一个字符,它是由一个\和一个字母来组成具有特殊意义的一个字符* 3°常用的转义字符:* \n :换行* \b :backspace 退格* \t :tab键 制表符(由多个空格组成的一个字符,具有行与行之间的对齐功能)* \\ :表示一个\* @ :在字符串前面加一个@符号有两种意义:*   ①字符串中如果有\ ,则不再理解为转义符*   ②使字符串可以换行*   (如果字符串前面加了@符号,在字符串上用两个双引号代表一个双引号)*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 变量
{internal class Program{static void Main(string[] args){}}
}

5.运算符与表达式

 /** 运算符与表达式* * 一、算术运算符与算术表达式* * 1、算术运算符* ① + 加* ② - 减* ③ * 乘* ④ / 除 :整除* ⑤ % 取余、取模 :取余数* 注意:* 它们是二元运算符,要求参与运算的两个操作数的类型必须相同,并且经过运算后的结果与操作数的类型相同* ++ :自增1 (有前加和后加)* -- :自减1 (有前减和后减)* 这两个是一元运算符 (如何区分一元还是二元?看有几个操作数, + 左右有两个操作数,所以是二元;++旁边只有一个操作数,所以是一元) * 在C#中,一般情况下,一元运算符的优先级大于二元运算符* * 例:
c = a++: 先将 a 赋值给 c,再对 a 进行自增运算
c = ++a: 先将 a 进行自增运算,再将 a 赋值给 c 
c = a--: 先将 a 赋值给 c,再对 a 进行自减运算
c = --a: 先将 a 进行自减运算,再将 a 赋值给 c * 2、算术表达式:* 由算术运算符连接起来的式子* 3、优先级* 先算乘除,后算加减,有括号先算括号里的,相同级别的从左至右运算* (如果要改变计算的优先级,用小括号,小括号可以无限制套用,但是一定要成对出现)* 在C#中,一般情况下,一元运算符的优先级大于二元运算符* * * 4、类型转换* (1)自动类型转换(隐式转换):* 1°发生隐式转换的条件:* ①两种类型兼容:参与运算的两个数据类型必须相兼容(例:int和double兼容,都是数值类型)* ②目标类型大于源类型:必须一边的数据类型表示范围小,一边的表示范围大,并且把小的转向大的不丢失精度(从int到double)* * 2°注意:* 在自动转换中,转换不会都是丢失精度的,如果丢失精度,那么这个转换肯定不会自动完成* 常见到,参与运算的两个操作数一个是int,一个是double,那么int类型会自动转换成double类型* 所以:两个int类型的运算想得到double类型,*1.0就可以了* * (2)强制类型装换(显式转换):* 1°背景:* 当需要丢失精度的转换,系统是不会帮我们自动转换的,需要程序员来写代码完成转换,就是强制类型转换* (如double3.14到int3的转换,会丢失0.14的精度)* 2°语法:* (数据类型名) 待转换的值* 例:* int b = (int)3.14* * 3°条件:* 强制类型转换,数据类型一定要相兼容(兼容的意思只都是数值类型,比如字符串和数值就不兼容)* * (3)字符类型的转换——借助类方法*方式一: Convert:不再仅是内存级别的转换,而是考虑数据意义的转换。Convert是一个加工、改造的过程* ①Convert.ToInt32(待转字符串) :将字符串变成整数* ②Convert.ToDouble(待转字符串):将字符串变成浮点数* ③Convert.ToString(): 一切类型都可以转换成string类型
方式二:将字符串类型装换为对应的数值类型
Console.Parse(String);
int.Parse(String)
double.Parse(String)
例:string s = "123";//int a = Convert.ToInt32(s);int a = int.Parse(s);* 二、复合运算符* += :a+=3 等价于 a=a+3* -= * *= * /=* %=* 注意: >= 大于等于号中间不能有空格** 三、关系运算符和关系表达式* 1、关系运算符* 在C#中,有6个关系运算符,用于比较两个事物之间的关系(所以为二元运算符)* >* <* == 等于* != 不等于* >=* <=* * 2、关系表达式* 由关系运算符连接起来的式子* 3、bool类型(布尔)* (1)bool值有两个* 真:true* 假:false* (2)关系运算的结果是布尔类型的* * * 四、逻辑运算符和逻辑表达式** 1、逻辑运算符* ① && 并且(逻辑与):两边都是真才是真   * ② || 或者(逻辑或):两边只要有一个真才是真* ③ ! 取反(逻辑非):真变假,假变真*(!是一元运算符,&& ||是二元运算符)** 2、逻辑表达式* 有逻辑运算符连接起来的式子* */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 运算符与表达式
{internal class Program{static void Main(string[] args){int a = 5, b = 6;int c = a++ * --b;//  b=b-1 (b是前减 )//  c=a*b (相乘赋值给c )//  a=a+1 (a是后加)Console.WriteLine(c);Console.ReadKey();}}
}

6.程序调试

/** 程序调试:* debug能力才是最重要的* * 编译错误:一般是语法错误,编译器通不过会直接提示,以后通不过多读,需要经验积累* 运行错误(逻辑错误):能编译通过,但是自己敲到代码不符合需求逻辑,需要找出错误地方就需要程序调试* * 对于运行错误有以下两种调试方法:**(1)利用编辑器自带调试功能:三步走* ①设置断点:在最前面的灰色处点一下就可以设置。断点:当程序运行到我们设置的断点处,程序就会停止* ②单步运行:点击启动调试,按F10一步一步执行观察变量* (F10是逐过程:遇到方法时不会进入方法体中执行*   F11是逐语句:遇到方法时能够进入方法体中执行*   跳出:可以跳出正在执行的方法*   F5继续:不会调试当前语句,直接跳到下一条语句* )* ③观察变量:观察的是左下的变量列表,也可以选中一块右击快速监视*(2)输出大法:(推荐)* 利用输出语句,在认为错误的代码块中加输出语句,如果输出不符,说明这块代码不对,用于确定错误位置**注意:
写代码时尽量不要重现一大段重复代码,这就是叫代码冗余
尽量不要让代码冗余
标志旗帜法 经常用来解决代码冗余
例:string username;string password;do{Console.WriteLine("请输入用户名:");username = Console.ReadLine();Console.WriteLine("请输入密码:");password = Console.ReadLine();if (username != "admin" || password != "888888"){Console.WriteLine("用户名或密码错误,请重新输入!");}} while (username != "admin"||password!="888888");Console.WriteLine("登录成功");Console.ReadKey();修改后:string username;string password;bool flag = false;do{flag = false;Console.WriteLine("请输入用户名:");username = Console.ReadLine();Console.WriteLine("请输入密码:");password = Console.ReadLine();if (username != "admin" || password != "888888"){Console.WriteLine("用户名或密码错误,请重新输入!");flag=true;}} while (flag);Console.WriteLine("登录成功");Console.ReadKey(); */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 程序调试
{class Program{static void Main(string[] args){int i = 1;while(i<=10){Console.WriteLine(i);i++;}Console.ReadKey();}}
}

7.判断结构

/** 判断结构(分支结构):语句在满足条件下执行* * 一、if单分支* 1、形式:* if(条件)* {*      语句1;*      语句2;*      语句3;* }* * 2、执行过程:* 首先判断条件的结果,如果条件为true,则执行语句.如果条件为false,则跳过语句,执行后面的语句* * 3、注意:* (1)if后面括号中的条件(是关系、逻辑表达式),要能计算成一个bool类型的值* (2)和if语句有关系的语句只有后面大括号中的内容* * 二、if-else双分支* 1、形式:* if(条件)* {*      语句; //1* }* else* {*      语句;//2* }* * 2、执行过程:* 如果条件结果为true,执行if后语句1,否则条件为false,执行else后语句2* 根据判断条件结果,总要执行一个* * * 三、if-else-if多分支* 1、形式:* if(条件1)* {*      //1* }* else if(条件2)* {*      //2* }* else* {*      //3* }* 2、执行流程:* 第一个条件不成立才会进入下一个,一旦有一个条件成立,就会执行当前后的语句,执行完跳判断* 3、注意:* 判断语句也可以进行嵌套* if()* {*      if()*      {*      *      }*      else*      {*      *      }   * }* * 四、switch-case语句* * 1、形式:* * switch(表达式)* {*      case 值1:*      语句1;*      break;*      *      case 值2:*      语句2;*      break;*      *      //...*      *      default:*      语句;*      break;* }* * 2、执行过程:* 首先计算表达式,然后根据计算结果匹配case后面的值* 如果有匹配项,则执行匹配后面的语句,知道break语句跳出判断* 如果所有的case值都不匹配,那么有default则执行default后面的语句,直到break结束*                               如果没有default,则跳出switch-case什么都不执行*                               * 3、if-else-if与switch-case语句的比较* (1)相同点:* 都可以实现分支结构* (2)不同点:* switch-case:一般只能用于等值比较* if-else-if:可以处理范围* * * 4、例: 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 第三题
{internal class Program{static void Main(string[] args){Console.WriteLine("请输入俩数和一个运算符:"); int a=Convert.ToInt32(Console.ReadLine());  //输入int b=Convert.ToInt32(Console.ReadLine());string c=Console.ReadLine();switch(c)          {case "+":  Console.WriteLine(a + b);  break;case "-":Console.WriteLine(a - b);break;case "*":Console.WriteLine(a * b);break;case "/":   if (b == 0){Console.WriteLine("0不能做除数");}else{Console.WriteLine(a/ b);}break;default:Console.WriteLine("不能识别运算符");break;}Console.ReadKey();}}
}* * * 五、三元表达式* 1、作用:可以代替if-else,有时使用更简便* 2、形式:* 表达式1 ? 表达式2: 表达式3* 例:* int a=100,b=20;* int max = a>b? a:b* Console.WriteLine(max);* * 3、执行过程:* 首先计算表达式1,表达式1应该是一个能够计算成bool类型的值 (相当于if后的条件)* 如果表达式1的值为true,则表达式2的值作为整个表达式的值* 如果表达式1的值为false,则表达式3的值作为整个表达式的值* 4、注意:* 表达式2和表达式3的类型一定要相同或者相容(能够发生自动转换)* */using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 判断
{internal class Program{static void Main(string[] args){}}
}

8.循环结构

/** 循环结构:语句在满足条件下执行多次* * 一、while循环* 1.特点:先判断,再执行* 2.形式:
while(循环条件)
{循环体;
}* 3.执行过程:* 先判断循环条件,如果条件为true,则执行循环体,循环体执行完,再去执行循环条件;* 如果条件为false,则跳出循环,循环结束* * 二、do-while循环 * 1.特点:先执行,再判断* 2.形式:
do
{循环体;
}while(循环条件);* * 3.执行过程:* 先执行循环体,* 执行完循环体再判断循环条件是否成立,如果条件为true,则执行循环体,如果条件为false,则跳出循环* * 注意:* 假如循环条件一开始就不成立,对于while循环,一次都不会执行,对于do-while循环体会执行一次* 所以:do-while循环体至少会执行一次,while循环体可能一次都不会执行* 所以一般要求先输入一次的循环一般都考虑用do-while循环  *   * 扩展:  * (1)try-catch的使用:* 1.作用:检测异常,可以用try-catch来调试代码块* 2.格式:
try //检测
{//有可能出现异常的代码
}
catch
{//出错后的处理
}**3.执行过程:*如果try中的代码没有出现异常,则不会执行catch中的代码*如果try中的代码出现异常,则程序立即跳到catch中*4.常用于输入出现异常时*例:
try
{int age = Convert.ToInt32(Console.ReadLine());  Console.WriteLine("你刚刚输入的年龄为:"+age);
}
catch {Console.WriteLine("输入错误!");
}   
Console.ReadLine(); ***(2)通过循环限制只能输入某些值
例:
while(answer!="y"&&answer!="n")
{Console.WriteLine("只能输入y和n,请重新输入!");answer=Console.ReadLine();
}** 三、for循环* 1.特点:一般用于已知循环次数的循环* 2.形式:
for(1循环初始化;2循环条件;3用于改变循环变量的值)
{4循环体;
}* * 3.执行过程:* 首先执行1循环变量初始化,用于定义循环变量和对循环变量赋初值* 然后执行2循环条件,如果为true,执行4循环体,如果为false,跳出循环* 然后4循环体执行完,再去执行3用于改变循环变量的值* 然后再执行2循环条件,依次类推* * 注意:1 2 3 4都可以省略,如果省略2循环条件,将是一个死循环* * 4.循环的嵌套* 例:输出九九乘法表for (int i = 1; i <= 9; i++)//外层循环:循环9次{//写在这里的代码属于外层循环for (int j = 1; j <= i; j++) //内层循环:外层循环每执行1次,内层循环执行i次{//写在这里的代码属于内层循环}//写在这里的代码属于外层循环}* 总结:* 三种循环可以相互转化,没有说用哪个循环对错,只能说用哪个循环更方便一些、逻辑更清晰一些* 已知循环次数的一般用for循环,* 循环条件比较复杂,跟循环次数无关的一般用while和do-while循环* * 四、break和continue 跳转语句* 1.break:* (1)可以用于switch-case判断中,用于跳出switch* (2)用于循环中,立即跳出(终止)break所在的循环,一般和if配合使用* 2.continue:* 用于循环中,结束本次循环,继续下一次循环* 3.goto:* 不建议使用,来回跳,因为会破坏结构不便于阅读,要慎重使用* * */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 循环
{class Program{static void Main(string[] args){//格式1://for(int i=1;i<=9;i++)  //i控制行//{//    for(int j=1;j<=i;j++)  //j控制列//    {//        Console.Write("{0}*{1}={2} ", j,i,i*j);//    }//    Console.WriteLine();//}//Console.ReadKey();//格式2://for(int i = 1; i <= 9; i++)  //外层循环:i控制行数//{//    for (int j = i; j <= 9; j++)  //内层循环:j控制列数,表示第i行的第j个式子//    {//        Console.Write("{0}*{1}={2} ", i, j, i * j);//    }//    Console.WriteLine();//}//Console.ReadKey();}}
}

9.常量、枚举类型

/** 常量、枚举类型* * 一、常量* 常量与变量对应,常量是指值不可以改变的(变)量* 1、定义:* const 数据类型 常量名 = 常量值;* 和变量定义形式很像,只是在前面加上了一个const修饰符* * 例:*          const double PI = 3.14;  //定义常量赋初值PI = 3.1415;//错误* * 注意:* 在定义时赋值,在其他时候不允许修改这个值* * 2、常量的作用* ①可以重复使用* ②在写程序的时候,可以防止被恶意的修改掉* * 二、枚举类型* * 1、概念:* 枚举类型:可以自己重新定义一种类型,在定义这种类型的时候一起定义了这种类型所有的值* * 2、定义:
enum 自己起的类型名称
{值1,值2,...值n};* 注意:* 枚举的定义一般和类的定义在同一个级别,这样在同一个命名空间下的所有类就都可以使用这个枚举了。(方法中/类中也可以)* * 3、作用* ①限制用户不能随意赋值,只能在定义枚举时列举的值中选择(枚举变量 = 枚举类型名.值)* ②不需要死记每一个值是什么,只需要选择相应的值(在vs中,使用枚举类型先点空格,会提示作用,方便程序员使用)* * 4、注意:* ①枚举类型内的值不需要加双引号* ②定义枚举类型时,其中的值不能是int类型* ③枚举类型都可以强制转换成int类型* ④枚举类型的值在定义时是有一个默认编号的,依次从0开始*          sex = Gender.女;  Console.WriteLine(sex);Console.WriteLine((int)sex);* 注意:可以在枚举类型中的值中修改编号,修改一个值的编号,后面的会是前面的编号+1,但是尽量出现重复编号*  enum Gender{男=0,  //编号是0  女,    //编号是1a=1,   //编号是1,尽量不要出现这种情况b      //编号是2}**  ⑤如何把一个字符串转换成字符类型?*  //枚举类型 枚举变量 = (自枚)(Enum.Parse(typeof(自枚),"待转换的字符串");*  注意:如果让用户输入枚举的值,最好使用try-catch防止输入的不是枚举列表中的值*  * */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 常量_枚举
{/// <summary>/// 定义了一个类型叫Gender的枚举类型,他的值有两个:男和女/// </summary>enum Gender{, //枚举类型内的值不需要加双引号}internal class Program{static void Main(string[] args){Gender sex; //定义Gender类型的变量,变量名叫sexConsole.WriteLine("请输入你的性别:");//sex = Gender.女;  //赋值,不能赋枚举之外的值//Console.WriteLine(sex);//Console.WriteLine((int)sex);//枚举类型 枚举变量 = (自枚)(Enum.Parse(typeof(自枚),"待转换的字符串");string s = Console.ReadLine();try{sex = (Gender)(Enum.Parse(typeof(Gender), s));switch(sex){case Gender.:Console.WriteLine("男性");break;case Gender.:Console.WriteLine("女性");break;}}catch{Console.WriteLine("你输入的性别有误上!");   }Console.ReadKey();}}
}

10.结构体类型

/** 结构体类型* 注意:C#中的结构比C语言中的结构体扩展了很多用法,只看C的结构体的话就局限了* C#中的结构体成员不仅可以是变量,还可以是方法* * 1.作用* 可以解决:* ①比如为了存储一个人的信息,要声明一组变量,当我们要存储n个人的信息时,就要声明n组变量 的问题* (解决了变量名重复定义的问题)* ②存储一个信息的这几个变量间没有关系,容易记乱* (不会再把变量记混了)* * 2.定义 * * 访问修饰符 struct 自己起的结构体类型名称* {*      //定义结构成员:可以是变量,也可以是方法*      //注意:定义结构体成员前也要加访问修饰符* * } //{}后没有分号;* * 定义好一个结构后,就可以直接声明相应的变量了,* 声明好变量后,通过变量名.成员名 来访问结构的成员* * 3、扩展——计算机的单位* 0~255 一共256个数 2的八次方=256 是一个字节* * 二进制表示 0 和 1 * 计算中的最小单位叫 “位” ,bit , 比特, 0101就是4个比特 b* 一个一个位处理太慢了,就把8个二进制位分成一组,那么8个二进制位叫做字节Byte B ,B是计算机能够处理的处理的最小单位* 1KB(千字节) =1024B* 1MB(兆字节) = 1024KB* 1GB(吉字节) = 1024MB* 1TB(太字节) = 1024GB* * Bps 传输速度 bit per second* */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 结构
{public enum Gender{,,}public struct Person{public string name;public Gender sex;public int age;}class Program{static void Main(string[] args){Person onePerson;onePerson.name = "zhangsan";onePerson.age = 20;onePerson.sex = Gender.;Person secPerson;secPerson.name = "lisi";secPerson.age = 26;secPerson.sex = Gender.;Console.WriteLine("随意输出一个{0}", secPerson.name);Console.ReadKey();}  }
}

11.数组

/** 数组* * 一、数组的作用* ①可以帮我们一次声明多个同类型的变量* ②这些变量在内存中是连续存储的* * 二、数组的声明(定义)、赋值与取值、遍历、输出* * 1、形式:* ① 数据类型[] 数组名 = new 数据类型[数组长度]* 例:int[] score = new int[5];  //声明了一个长度为5的数组,数组名叫score* 通俗点说:声明了一个数组,里面包含了5个int类型的变量,数组名叫score,里面5个int类型的变量叫做数组的元素* 并且对这5个元素从0依次开始编号到4  score[0]~score[4]* 注意:* int、double、decimal等类型的数值数组一旦声明,里面的每一个元素都被初始化成0,* 而char类型的字符数组、string类型的字符串数组编译器不会对其进行初始化,为Null空int[] score = new int[5];  //声明了一个长度为5的数组,数组名叫scorescore[0] = 10;score[4] = 20;Console.WriteLine(score[0]);Console.WriteLine(score[4]);Console.WriteLine(score[3]);Console.ReadKey();* * ② 数据类型[] 数组名 = {下标为0的元素值,下标为1的元素值,......}; //中间元素用逗号,隔开* 例:int[] score = {1,3,8}; //score数组长度为3,其中score[0]=1,score[1]=3,score[2]=8* string[] names={"zhangsan","lisi","wangwu"};* * ③ 数据类型[] 数组名 = new 数据类型[]{}   例:int[] score = new int[]{1,3,8};*    数据类型[] 数组名 = new 数据类型[数组长度]{下标0,下标1...} 例:int[] score = new int[3]{1,3,8};*    例: int[] score = new int[5]{1,2,3}//错误* * 2、如何访问数组:* 通过下标(索引)来访问数组:数组名[下标],下标从0开始* 例:score[0] = 10;* 注意:* 数组长度:通过 数组名.Length 可以获得数组的长度(即数组中有几个元素)* * 3、数组的赋值与取值:*          for(int i=0;i<score.length;i++)*          {*              console.writeline("请输入第{0}个人的成绩",i);*              score[i]=Convert.ToInt32(Console.ReadLine());//对数组中的元素进行赋值*              sum+=score[i];// 遍历数组,求数组中所有元素的和*          }* 4、数组的遍历:* for(int i=0;i<score.length;i++)* 三、数组的应用* 1、前后交换* int=temp;* temp=a[i];* a[i]=a[a.Length-1-i];* a[a.length-1-i]=temp; * * 2、冒泡排序* (1)思路:* 让数组中的n个元素依次进行两两比较(第i个数与第i+1个数比较),* 经过n-1趟的两两比较,第t趟的比较次数是n-t,每趟比较完都让当前最值排到当前最后* 核心点:* ①* 趟数:n个数需要排n-1趟,* 每趟次数:第t趟的比较次数是n-t次(趟数i是从0开始数,所以t=i+1* ②要从大到小排序,两两比较的时候使用<;从小到大排序用>* * (2)模板:* for(int i=0;i<n.length-1;i++)// 控制比较趟数:共n-1趟(i+1表示当前是第几趟)* {    *      for(int j=0;j<n.Length-(i+1);j++)//控制每趟的两两比较次数:每趟比较 n-t次,t表示当前是第t趟,因为i是从0开始数,t=i+1*      {*          if(n[j]<n[j+1]) // 从大到小,用<,从小到大,用>*          {*              //交换变量*              int temp = n[j];*              n[j]=n[j+1];*              n[j+1]=temp;*          }      *      }* }* * 四、二维数组*          int[,] a = new int[3, 4]   //二维数组初始化{{ 100,90,80,70},{ 90,90,80,60 },{ 50,70,40,80},};for(int i=0; i <3; i++)  //求和遍历二维数组,并且输出平均值{int sum = 0;for(int j=0;j<4;j++){sum += a[i, j];}Console.WriteLine("{0}班的平均分是{1}",i+1,sum/4.0);  //除以4.0防止精度缺失}Console.ReadKey();}* */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 数组
{internal class Program{static void Main(string[] args){//int[] score = new int[5];  //声明了一个长度为5的数组,数组名叫score//score[0] = 10;//score[4] = 20;//Console.WriteLine(score.Length);//Console.WriteLine(score[0]);//Console.WriteLine(score[4]);//Console.WriteLine(score[3]);//Console.ReadKey();int sum = 0;//定义数组int[] score = new int[10]; //对数组中的元素进行赋值for(int i=0;i<score.Length;i++)   {Console.WriteLine("请输入第{0}个人的成绩",i+1);score[i] = Convert.ToInt32(Console.ReadLine());//sum+=score[i];  }//遍历数组,求数组中所有元素的和for (int i = 0; i <score.Length; i++)   {sum += score[i];}//输出:输出数组中的每一个元素的值for (int i = 0; i <score.Length; i++)             {Console.WriteLine("第{0}个人学生的成绩为{1}分", i + 1, score[i]);}Console.Clear();  //清屏//输出平均成绩Console.WriteLine("{0}个人的平均成绩为:{1}", score.Length, sum / score.Length);Console.ReadKey();}}
}

12.方法

/** 方法、参数、返回值* * 一、方法(函数)* 在C#中函数、方法统一称为方法,有的人称静态为函数,非静态的为方法,在这我们统一称为方法* 方法就一堆代码进行重用的一种机制。方法就是一段代码,这段代码可能有输入的数据叫做参数,可能会有返回的执行结果叫做返回值* * 1、作用:* 用来复用代码的,当我们在一个程序中反复的写了同样的代码,那一般情况下,我们可以把需要重复写的代码定义在一个方法中,用的时候只需要调用就行了* 比如Console.WriteLine();就是一个方法* * 2、定义:* [访问修饰符] [static] 返回值类型 方法名([参数列表]) //[]内的表示可以省略* {*      方法体;*      [return 返回值];* }* * 注意:* (1)方法一般要定义在类中,一般写在Main()方法后面* (2)如果方法没有返回值,则返回值类型写void* (3)方法的命名规则:方法名开头大写,参数名开头小写,参数名、变量名要有意义* (4)如果方法没有参数,()不能省略* * 3、方法的调用:* (1)对于静态方法(有static修饰的都是静态方法):* ①不在同一个类中,通过 类名.方法名();调用* ②如果是在本类中调用本类的方法,可以只写方法名(); 也可以通过类名.方法名();调用* * 4、return可以立即退出本方法* * 二、参数* 1、变量的作用域(声明周期)* 在方法中定义的变量成为局部变量,其作用域从定义开始,到其所在的大括号(语句块)结束为止* 注意:* ①字段:一个变量一旦定义在方法外,类的里面,就叫做类的字段,这个变量就可以被本类的所有方法所访问* 但是要注意,静态方法只能访问静态字段* ②由const修饰的常量不能定义为静态的* * 2、在一个方法中想要访问另一个方法中的变量,怎么办?* 通过 参数和返回值* * 3、形参和实参 * 在方法名后面的括号内定义变量,叫作这个方法的参数,这里定义的变量用于接收调用者传过来的数据* 注意:* ①如果一个方法一旦有参数,那么调用者就必须传参数,并且传参数的个数、类型与对应位置上的个数、类型必须一致* ②参数的作用域就是下面的方法体中* ③当形参是数组的时候,我们传数组名* * 三、返回值* 当调用者想访问我们方法中的变量时,可以通过返回值返回* 只要在方法中使用了返回值,那么在调用方法中,前面就应该用一个变量来接收方法的返回值* 例:* string s = Console.Readline();* int x = Convert.ToInt32("32");* * 注意:* ①一个方法可以多个参数,但是只能有一个返回值,也可以没有* ②一旦一个方法有返回值,那么在这个方法中,就必须通过return语句返回一个值,并且这个值要与返回值类型是相同的* * 四、例:ReadInt()用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ReadInt__用法
{internal class Program{static void Main(string[] args){Console.WriteLine("请输入一个数:");int x = ReadInt();Console.WriteLine(x);Console.ReadKey();}public static int ReadInt(){int number = 0;do{try{number = Convert.ToInt32(Console.ReadLine());return number;}catch{Console.WriteLine("输入有误,请重新输入!");}}while (true);}}
}* * * 五、方法的重载* 一般在同一个类中,方法名相同,但方法的参数的个数不同,或者对应位置上的参数类型不同,才能构成方法的重载* 注意:* 方法重载和返回值没有关系* * * * * */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 方法
{internal class Program{static void Main(string[] args){//string s = "123";int a = Convert.ToInt32(s);//int a = int.Parse(s);//调用者Add1(10, 20);  //实参int b = Add2(10, 20);Console.WriteLine(b);Console.ReadKey();}//被调用者public static void Add1(int a, int b)  //形参{Console.WriteLine("a+b={0}", a + b);}public static int Add2(int a, int b){return a + b;}}
}

13.outref用法

/** * out的用法 * 作用:当一个方法想返回多个值的时候,可以通过out实现 * 例:下方代码* 实现步骤:* (1)在方法的参数类型前加out,那么传参数的时候也必须在number前加out* 表明这个参数不是传入的,而是用来传出值的* * (2)如果参数是以out形式传入的,那么在传入前可以不赋初值* * (3)在方法中对于由out修饰的参数,必须赋值,并且必须在使用前赋值* * out和ref:* out用于传出值,方法中必须对out修饰的传数进行赋值* ref可以理解成双向的,既可以传入,又可以传出* 在传参数的过程中,如果参数有out或ref修饰的话,那么改变方法中的参数变量的值,调用者方法中的变量的值也会相应的改变* */using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace outref用法
{internal class Program{static void Main(string[] args){int number;int result = Test(out number);Console.WriteLine("number={0} result={1}", number, result);Console.ReadKey();}static int Test(out int a)    {a = 10;a = a + 1;return 200;}}
}

14.常用方法

/*  *  常用类和方法;*  1、Math类  *  Math.Round(); //四舍五入函数  *  Math.Sqrt(); //开平方函数  *  例1:输入等边三角形的边长求面积,保留2位小数 
using System; namespace 求等边三角形面积 
{     class Program     {         static void Main(string[] args)      {             Console.WriteLine("请输入等边三角形的边长:");       string a=Console.ReadLine(); //输入边长为字符串类型         double x = Convert.ToDouble(a); //转化为浮点型           double ans = Math.Round(x * x * Math.Sqrt(3) / 4.0 , 2); //计算面积公式,并保留两位小数    Console.WriteLine(ans); //输出面积          Console.ReadKey();       }   } 
}  
* 
* 例2:编一个程序,输入一个正数,对该数进行四舍五入到个位数的运算。
* 例如,实数12.56经过四舍五入运算,得到结果13;而12.46经过四舍五入运算,得到结果12。 
using System; 
namespace 第六题
{     internal class Program   {         static void Main(string[] args)   {             double a=Convert.ToDouble(Console.ReadLine()); //输入       Console.WriteLine(Math.Round(a,0)); //四舍五入到个位输出       Console.ReadKey();     }    }
}  
* 2、Random类 随机数 
* 例:编写一个掷骰子100次的程序,并输出各个点数出现的次数 
using System; 
namespace 第6题 
{     internal class Program     {         static void Main(string[] args)       {int[] a = new int[7];          Random random = new Random(); //定义随机数对象       for(int i=0;i<100;i++)        {               int res=random.Next(1,7); //能随机生成[1,7)范围内的数,注意不会到7,即区间范围是[1,6]   a[res]++; //利用"桶"的思想         }           Console.WriteLine("掷骰子100次后:");        for(int i=1;i<=6;i++)       {              Console.WriteLine("{0}出现的次数为{1}", i, a[i]);          }             Console.ReadKey();  }    } }  
*/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[BT]BUUCTF刷题第一天(3.19)

第一天&#xff08;共4题&#xff09; Web [极客大挑战 2019]EasySQL Payload&#xff1a; 用户名&#xff1a;admin or 11# &#xff08;密码也可以改成这个&#xff09; 密码&#xff1a;1&#xff08;可任意&#xff09; 网站漏洞代码&#xff1a; sql"select *…

Android和IOS Flutter应用开发使用 Provider.of 时,可以使用 listen: false 来避免不必要的重建

文章目录 listen: false解释示例 listen: false 使用 Provider.of 时&#xff0c;可以使用 listen: false 来避免不必要的重建 解释 当您使用 Provider.of 获取状态对象时&#xff0c;默认情况下&#xff0c;该对象每次发生变化时都会触发重建该对象所在的组件。这在大多数情…

云平台一键迁移(腾讯云windos服务器迁移到阿里云windos服务器)

参考文档 https://help.aliyun.com/zh/smc/use-cases/one-click-cloud-platform-migration 迁移文档 https://cloud.tencent.com/document/product/598/37140 #腾讯密钥创建 https://cloud.tencent.com/document/product/1340/51945 安装腾讯云自动化服务助手 一.导入迁移…

adb的使用(安装apk和传输文件)

adb命令安装apk包 先传apk adb pull /tmp/app-test.apk /data/local/tmp/ 指定文件安装 adb install apk路径 adb命令传输文件 1.从手机端将文件传输到电脑 1&#xff09;在电脑端打开文件将要存储的路径&#xff0c;按住shift键右击&#xff0c;选择“在此处打开命令窗口…

GitHub gpg体验

文档 实践 生成新 GPG 密钥 gpg --full-generate-key查看本地GPG列表 gpg --list-keys关联GPG公钥与Github账户 gpg --armor --export {key_id}GPG私钥对Git commit进行签名 git config --local user.signingkey {key_id} # git config --global user.signingkey {key_id} git…

JVM常用垃圾收集器

JVM 4.1 哪些对象可以作为GC ROOT? 虚拟机栈&#xff08;栈帧中的局部变量表&#xff09;中引用的对象本地方法栈中引用的对象方法区静态变量引用的对象方法区常量引用的对象被同步锁持有的对象JNI&#xff08;Java Native Interface&#xff09;引用的对象 4.2 常用垃圾收集…

计算机二级(Python)真题讲解每日一题:《方菱形》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 请写代码替换横线&#xff0…

golang踩坑记录

1. server gave HTTP response to HTTPS client 出现场景&#xff0c;http包get请求https的 原代码 response, err : http.Get(fmt.Sprintf("https://%v/api/user/secret/?name%v&password%v", djang_ip, username, password))修改后 有地方说go的版本问题&…

accessToken

1、介绍 accessToken&#xff0c;通常是用于身份验证和授权的令牌,它可以用于前端和后端&#xff0c;具体使用方式取决于应用程序的架构和需求。 前端应用 accessToken通常用于向后端API发送请求时进行身份验证和授权。 &#xff08;1&#xff09;前端应用程序会在用户登录成…

boost的ptree比qt的接口更适合读写xml,因为它舍弃了结点属性,里面只有根节点和子节点,显得更简洁

就6个接口&#xff1a; 写xml文件 boost::property_tree::ptree 动物园; add<std::string>("名字", "苹果"); add_chile("水果类型",水果);// 读取 XML 文件 boost::property_tree::read_xml("example.xml", pt); get_child()&…

描述我处理过的一个性能优化问题如何实现Web应用的负载均衡?

一、描述我处理过的一个性能优化问题 在我过去的工作经历中&#xff0c;我遇到并成功解决了一个性能优化问题。这个问题发生在一个电商网站的后台管理系统中&#xff0c;当管理员尝试查询大量订单数据时&#xff0c;系统的响应速度非常慢&#xff0c;有时甚至导致页面超时或崩…

SpringCloud入门(1) Eureka Ribbon Nacos

这里写目录标题 认识微服务SpringCloud 服务拆分和远程调用服务拆分案例实现远程调用 RestTemplate Eureka注册中心Eureka的结构和作用搭建eureka-server服务注册服务发现 Ribbon负载均衡 LoadBalancedLoadBalancerIntercepor源码解析负载均衡策略饥饿加载 Nacos注册中心安装与…

不同环境迁移和hive等不同数据源迁移数据到Doris的解决方案

1、Doris不同开发环境迁移 在项目开发时,需要开发环境、测试环境、uat环境、预生产环境、生产环境。常常遇到这样的场景:需要把某个环境的所有表结构和数据都迁移到某个环境。手动去操作是耗时耗力的,这时需要通过代码或工具来高效执行。 1.1 使用代码进行迁移表结构 /***…

PySpark案例实战

一、前言介绍 二、基础准备 # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创建SparkContext对象 scSparkContext(confconf) #打印…

GC垃圾回收的算法

GC&#xff08;垃圾回收&#xff09;的算法有多种&#xff0c;每种都有其特点和适用场景。以下是一些常见的GC算法&#xff0c;并举例进行说明&#xff1a; 引用计数算法&#xff1a; 原理&#xff1a;为每个对象维护一个引用计数器&#xff0c;每当有一个地方引用这个对象时&a…

Arduino RP2040 多核心运行模式

Arduino RP2040 多核心运行模式 &#x1f4cc;RP2040基于Earle F. Philhower, III的开发核心固件&#xff1a;https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json&#x1f388;相关开发文档在线j简要介绍&#xff1a;https:/…

深入理解栈和队列(一):栈

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、栈的概念 栈&#xff08;Stack&#xff09;是一种特殊的线性表&#xff0c;它遵循后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的原则。栈可以被看作是一个只能在一端进行操作…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

springcloud修炼——Eureka注册中心

如果你要理解这个技术博客博客专栏 请先学习以下基本的知识&#xff1a; 什么是微服务什么是服务拆分什么是springcloud Springcloud为微服务开发提供了一个比较泛用和全面的解决框架&#xff0c;springcloud继承了spring一直以来的风格——不重复造轮子&#xff0c;里面很多的…