C#基础笔记


 

课程学习笔记

 


 

1. 概念: .netC#

A.net/dotnet:一般指.Net Framework框架,一种平台,一种技术。

B C#(sharp)是一种编程语言,可以开发基于.Net平台的应用。

C、(*JAVA既是一门技术又是一门编程语言。

2. .Net都能做什么

  .Net这个平台上开发的桌面应用程序叫 winform应用程序开发。

3. 解决方案中可以包含多个项目,项目可以包含多个文件,文件中是我们写的程序。

4.

在文件中,命名空间可以包含类,类中可以包含方法,方法中可以是我们写的程序。

5. 重置开发环境:可以使我们的开发工具恢复默认状态。 工具----》导入导出

    一般的窗口不小心关闭了,再视图中找。

6.  Main方法是我们程序的入口方法。当我们执行一个程序时,会首先找到Main方法,从Main的第一句程序开始执行,当Main方法执行完成后(及执行到Main方法的反大括号),程序就结束了。

   所以,现在我们初学者写程序,就先写在Main方法中。

 

  

一般情况下,一个程序只能有一个Main方法。

7.  .sln是解决方案文件。

.csproj 是项目文件。

8. 今天学习的第一句话:

Console.WriteLine(“你想显示的内容”);

 

 

第二句话:

Console.ReadKey();

当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才继续执行。

9. C#中,每一句话都必须以分号结束(;.

10. 设置vs中字体大小:工具——》选项

行号的显示:工具——》选项

 

11. C#中的注释,什么是注释呢?对我们写的程序进行解释,注释是给人看的。

   有三种注释:

1.    单行注释。  //开始,到本行结束。

2.    多行注释。  /*开始   */结束,之间的都为注释。

3.    文档注释。用于对类和方法进行注释,在类或方法前面,连续输入3///

 

12. 下面的一对指令可以折叠一段代码。

     #region #endregion

13. .net是一种多语言平台,开发.net可以用多达几十种语言进行开发。

    Java:是一种单语言的平台。一种语言多种平台。

14. MSIL:微软中间语言。

 

第二天课程

 

1.内存:用户存储正在运行的程序数据(不准备)。

RAM:内存的特点,断电后里面的数据丢失。

 

2.变量:变量代表着一块内存空间,我们可以通过变量名称向内存存/取数据,有变量就不需要我们记忆复杂的内存地址。

 

3. 向内侧申请一块内存空间的语法:

 数据类型 变量名

C#中常用的数据类型:

Int类型:    整数数据类型。

Double类型:  小数

Char类型:   字符型  只能存储一个字符,并且存储的这个字符要求用单引号引起来。

String类型:   字符串。就是把0个或者1个或多个字符连接起来,字符串要求用引号引起来。

Decimal类型: 存储金钱。数字后面必须要加M/m.

 

 

 

注意:在C#开发环境中,直接写一个小数点的数字,这个数字是double类型的。在一个小数后面加一个M/m,就告诉编译器这是decimal类型的。

 

4.变量声明的3种方法

1)              先声明,再赋值。        Int a;  a=3

2)              定义变量时,直接赋值。  Int a = 3;

3)              一次声明多个同类型的变量,多个变量名称之间要用逗号分割。最后以;结束这句话。

          举例:  string zsNamelsNamewwName

                  Int zsAge = 18lsAge = 20wwAge = 22

 

注意:变量一定要先声明,再赋值,最后使用(取值/调用/写这个变量)。

 

5.变量的命名规则:
   1)必须以“字母”_@符号开头(不能以数字开头)。

   2)后面可以跟任意“字母”、数字、下划线。

注意

A. 你起的变量名不要与C#系统中的关键字重复。

B. 在C#中,大小写是敏感的。

C. 同一个变量名不允许重复定义(先这么认为,不严谨)

   3)定义变量时,变量名要有意义。

6. C#变量命名编码规范——Camel命名法:

     首个单词的首字母小写,其余单词的首字母大写。

       如:studentName  zsAge   name

     Pascal命名规范:每一个单词第一个字母都大写。

SoftwareName   SystemVersion

     如果使用到英文单词的缩写,全部用大写!

在方法中定义变量,要使用Camel命名法。Main方法也是。

7.      在一个方法中,一般情况下变量只能定义一次(先这么认为),但可以多次赋值,再次赋值时,会把变量中原有的值给覆盖掉。

8.+”在C#中有两种意义:

      1)是数学中的加法运算:两边参与加法的运算的数据类型为数字类型,则“+”表示数学上的加法意义。

      2)是连接两个字符串:两边参与加号运算的数据,有一个是字符类型,那个找个“+”号就是连接的意义。

 

9.占位符:

      Console.Writline(“”)中,第一个变量/字符串中可以使用占位符。

       占位符由{数字}组成,数字由0开始编号,如下:

         1个占位符:{0

2个占位符:{1

3个占位符:{2

………

       举例如下:  

Console.Writeline();有多个参数时,输出都是第一个参数中的内容,从第二个参数开始,都是用来替换第一个参数中的占位符的值,所以从第二个参数开始,要不要输出,就要看第一个参数中有没有相关的占位符。

 注意,电话号码一般用 string类型。

 

10. 交换两个变量的值

必须借助第三者:

 

11.学习第三句话: Console.Readline();

        这句话用于让用户从键盘上输入一句话,当程序执行到Console.Readline();时,就会暂停,然后等待用户从键盘上输入,按回车程序将继续执行。

        如果想要得到用户输入的内容,就需要定义一个string类型的变量,写在下面这句话前面,接收用户输入的内容。

      

接收用户输入的内容必须定义一个字符串来接收。

String input=Console.ReadLine();

 

12.字符串中的转义

   当我们需要在字符串中输入一些特殊字符时,比如:半角引号,换行,退格时。就需要使用转义字符。

   转义字符是一个字符,他由一个\+一个字母来组成具有特殊意义的一个字符。

  常用的转义字符:

                \n   换行

                \b   backspace退格

                \t   tab键(由多个空格字符组成的一个字符,具有行与行对其的功能)。

                \\   输出\

                 \”  输出

   在字符串前面加@符号有两种意义:

1)       字符串中如果有\,则不再理解为转义符。

2)       是字符串可以换行。

 如果字符串中前面加了@符号,在字符串上用两个双引号代表一个双引号。

 

13.算术运算符及算术表达式。

      1)算数运算符+ - * / %(取余数/取模),他们都是二元运算符。要求参与的两个操作数的类型必须相同,并且经过运算后的结果与操作数的类型相同。

      2)在算术表达式中,如果要改变计算的优先级,用小括号。小括号可以无限极的出现(必须成对出现)。

 

14.算术运算符——自动类型转换

     

15.类型自动转换(隐式转换)规则

       参与运算(算术运算和赋值运算)的操作和结果类型必须一致。当不一致时,满足下面条件时,系统自动完成类型的转换。

1)参与运算的两个数据类型必须相兼容。

         例如:int和double兼容。

2)必须一边的数据类型表示范围小,一边的范围大,并且把小的转换成大的不丢失精度。

2)对于表达式,如果一个操作数为double类型,整个表达式可提升为double类型。

在自动转换中,转换是不会丢失精度的。如果丢失精度,那个这个转换肯定不会自动完成。

经常见到的就是,参与运算的两个操作数,一个是int,一个是double,那么int类型会自动转换成double类型。

  如果一个操作数为double类型,则整个表达式的运算结果为double类型。

16.强制类型转换。

   当需要丢失精度的转换(如从 double 3.14转换到int 3的转换,会丢失0.14的精度)时,系统是不会帮我们自动转换的,需要我们程序员来写代码完成转换。

   强制转换的语法为:

         (数据类型名)待转换的值;

 

        注意:下面的两种转换是错误的,因为强制类型转换要求带转换的类型和目标类型必须是数字。  

    

 

17.类型转换: Convert.ToInt32();

       Int 变量名 = Convert.ToInt32(代转字符串);

 上面的语句的意义:把待转字符串转换成int类型后赋给变量。

      String strSecore = “90”;

     Int iScore = Convert.ToInt32(strSeore);

      strScore转换成 Int类,并且赋给iScore

 

18. try-catch的使用(简单用法)

  C#中异常捕获如何完成:

 try

{

       有可能出现错误的代码写在这里

}

Catch

      出错后的处理。

上面的程序如何执行:

  如果try中的代码没有出错,则程序正常运行 try中的内容后,不会执行 catch中的内容。

  如果 try中的代码一旦出错,程序立即跳入catch中去执行代码。那么 try中的出错代码后面的代码不再执行了。

 

19.自加自减复合赋值-关系表达式

  a.  ++      自加一     有前加和后加

      --       自减一     有前减和后减

          Int age = 18;

         Int sum = age++ - 10;

 

   上面age是后加,所以在进行语句运算时,age++age的原值参与运算,所以sum = 8

 

           Int age = 18;

         Int sum = ++age - 10;

 

    上面代码age是前加,所以在进行语句运算时,++ageage1后的值,所以sum = 9

 

总之,不管是++age还是age++,经过运算后,age的值都进行了+1运算。

 Int age = 18

 Int sum = age++ - 10

相当于:

 Int age = 18

 Int sum = age – 10

age= age + 1

 

int age = 18

int sum = ++age – 10

相当于:

int age = 18

age = age + 1

Int sum = age – 10

 

C#中,一般情况下,一元运算符的优先级大于二元运算符。

     一元运算符为:++-- , 二元运算符-  *  /

  b. 复合运算符

l +=           例如:age = age + 3;ó age + = 3

l -=

l *=

l /=

l %=

能够改变变量中的值的:

   =

   ++/--

20.关系运算符(比较运算)

     C#中,有6个关系运算符,用于比较两个事物之间的关系。

•    >      大于

•    <      小于

•    ==     等于

•    !=     不等于

•    >=     大于等于 

•    <=     小于等于

 关系表达式:由关系运算符连接起来的式子。

 

21.什么是bool类型(布尔)

关系表达式的运算结果为bool类型,bool类型只有两个值,一个是true,一个是false

如果关系运算表达式成立,则这个表达式的值为true,否则为false

22.逻辑运算符:

       &&

      ||

       !

    逻辑(与)&&

逻辑与运算:   表达式&&表达式2

 逻辑与连接的两个表达式,要能够求解成bool类型,一般情况都是关系表达式。整个逻辑与运算的结束也是bool类型。

 

表达式1

表达式2

逻辑与结果

True

True

True

True

False

False

False

True

False

False

False

False

当两个表达式全为True,其结果为True

 

逻辑或(或者):

   表达式1 ||表达式2

    逻辑或连接的两个表达式,要求能够求解成bool类型,一般情况都是关系表达式,整个逻辑或运算结束也是bool类型:

表达式1

表达式2

运算结果

Ture

Ture

Ture

Ture

False

Ture

False

Ture

Ture

False

False

False

  当两个表达式有一个为True,其结果为ture

    

逻辑非:!

   这是一个一元运算符。

   用法:!(布尔类型的表达式)

   作用:取反。即布尔表达式为ture,加!后,其整个式子为false反则一样。

 

 

 

23.if结构的基本语法:

      if(条件)

         语句1;

     执行过程:首先判断条件的结果,如果条件为ture,则这行语句1,如果条件为false,则跳过语句1。执行后面的语句。

     注意:

1if后面的括号中的条件,要能计算成一个bool类型的值。

        2)默认情况下,if语句只能带1句话,即和if语句有关系的语句只有语句1.

if带多句话可以写成:

if(条件)

       语句1

       语句2

       。。。。。。。。。

要求:我们在写程序的时,哪怕if语句只带一句话,也要写在大括号中。

16节)

24.  if-else结构:

语法:

if(条件)

 

     语句1

         else

{

语句块2

}

 执行过程:

   如果条件为ture,则执行if带的语句块1,并且跳过else带的语句2

         如果条件为false,则跳过if带的语句块1,执行else带的语句块2

    上面两个语句块,根据条件结束为tureFalse,总要执行一个。

25.  if-else if

在if-else if语句中,只有当上一个条件不成立时,才会进入下一个if语句并进行if语句后面的条件判断。一旦有一个if后面的条件为ture,则执行此if所带的语句(块),语句(块)执行完成后,程序跳出if-else if结构。 如果所有的if条件都不成立,则执行最后的else所带的语句,如果最后没有else语句,则什么都不执行。

26.switch-case语法:

       switch(表达式/变量)

           

               case 1:语句块1

               break;

               case 2:语句块2

               break;

               default: 语句块3

               break;

  执行过程:首先计算表达式,然后根据计算的结果与匹配case后面的值,如果有匹配项,则执行匹配项后面的语句,直到break语句跳出 switch-case,如果所有的case值都不匹配,那么default则执行 default后面的语句,直到 break结束。如果没有default,则跳出switch-case,什么都不执行。

27.if-else if switch的比较:

l   相同点:都可以实现多分支结构

l 不同点:

•   switch:一般只能用于等值比较

•   if-else if:可以处理范围

21

28.do-while

语法:

do

{

     循环体;

}while(条件)

执行过程:

1. 执行循环体,执行完循环体转向2

2. 判断条件是否成立,如果条件为true,则转向1,如果条件为false,则转向3.

3. 跳出循环,循环结束。

   假如循环条件一开始就不成立,对于while循环,一次都不会执行。对于do-while循环体会执行一次。

   所以,do-while的循环体一般至少会被执行一次。

while先判断,后执行。

do-while先执行,后判断。

29. try-catch

   检测异常:

  try    //检测

 

      有可能出现异常的代码

  

   catch

    {

       出错后进入catch后执行的代码

}

如果try中的代码没有异常,则不会执catch中的代码。

如果try中的代码有异常,则直接跳入catch中执行代码。

24

30.程序调试

               1.设置断点。

       2.单步运行。

       3.观察变量。

31. for循环:

        语法:

          for(表达式1;表达式2;表达式3;)

          {

             循环体;

}

for循环,一般用于已知循环次数的循环。

一般情况,表达式1:用于定义循环变量和对循环变量赋初值。

           表达式2:循环条件。

           表达式3:用于改变循环变量的值。

执行过程:

1步:计算表达式1,转向第二步。

2步:计算表达式2(循环条件),如果表达式2的值为true转向第3步,如果表达式2的值为false,转向5第步。

3步:执行循环体,转向第4步。

4步:执行表达式3,转向第2步。

5步:循环结束。

32. 水仙花数:

          设一个三位数为:abc

          如果a*a*a+b*b*b+c*c*c=abc则找个数为水仙花数。

33. break

   break用于循环中,退出当前循环。

1)        可以用于switch-case判断中,用于跳出switch.

2)        用在循环中,用于立即跳出(终止)循环。

注意:用于循环中时,跳出break所在的循环。

34. continue;

          用于循环中,程序一旦执行到continue语句,立即结束本次循环(就是不再执行循环体中continue下面的语句),直接进行下一次循环。(do-while/while直接进入下一次循环条件的判断,如果条件成立,则再次进入循环)。 对于for循环,先执行表达式3,再判断循环条件是否成立。

35.小节:

   三元表达式:

      1?表2:表3

          执行过程:首先计算表达式1(表达式1应该是一个能够计算成bool类型的值),如果表1的值为true,则表达式2的值作为整个表达式的值,如果表1的值为false,则表达式3的值做为整个表达式的值。

                    表达式2和表达式3的类型一定要相同(相兼容)。

 

    1.顺序结构:语句顺序执行。

     2.分支结构:语句满足条件下执行

if, if-else, if-else-if, switch-case;       1?表2:表3(三元)

      3.循环结构:语句在满足条件下循环执行多次

          while , do-while, for

        4.跳转语句

           break, continue, goto

35. 枚举\常量\结构

  1.常量:

        语法:

       const  类型常量名 =常量值;

举例: const double PI = 3.14;

   2.枚举:

        让我们定义一种枚举类型,并且在定义这种类型时我们要指定找个类型的所有值。

         语法:

        enum 自己起的类型名称{值1,值2,值3,。。。。值n};

            枚举的定义:一般和类定义在同一个级别。这样,在同一个命名空间下的所有的类就都可以使用找个枚举了(方法中/类中也可以)。

           枚举的作用:

1)限制用户不能随意赋值,只能在定义枚举时列举的值中选择。

2)不需要死记每一个值是什么,只需要选择相应的值。

注意:1.定义枚举时,值不能是int类型

2.枚举定义的变量都可以强制转换成一个int类型。

               3.枚举的值在定义时是有一个默认编号的,编号从0开始。

  如果把一个字符串转换成枚举类型:

     (自枚)(Enum.Parse(typeof(自枚),”待转换的字符串”));

 

   29

 36.结构 

     为什么我们要用结构:

     1)比如我们上课讲的为了存储一个人的信息,要声明一组变量。当我们要存储n个人的信息时,就要声明n组变量,麻烦。

     2)存储一个人的信息的这几个变量之间没有关系,容易记乱。

 语法:

  访问修饰符 struct 结构名

 

       定义结构成员

例如:

注意:定义好一个结构后,就可以直接声明相应的变量了。

      声明好变量后,通过变量名.成员名 来访问结构的成员。

举例:

37.计算机基础知识:

   计算机中最小的单位叫“位”,bit比特 b   

    就把8个进制分成一组,那么8个进制位叫做字节 Byte B  计算机能够处理的最小单位。

     1KB=1024B

     1MB=1024KB

     1GB=1024MB

     1TB=1024GB

 

     1Gb=128M

38.数组

   为什么使用数组

可以帮我们一次声明多个同类型的变量,这些变量在内存中是连续存储的。

   语法

       数据类型[]数组名=new数据类型[数组长度];

   例如 int[]score = new int[5];

     就声明了一个长度为5的数组,数组叫score.

    通俗点说:就是声明了一个数组,里面包含5int类型的变量。数组名叫:score里面的5int类型的变量叫做:数组的元素。

       如何访问数组:通过下标(索引)来访问数组:      数组名[编号]

比如,我们要向第0个元素赋一个3,可以写成:

         score[0]=3;

int类型数组一旦声明,里面的每一个元素被初始化成0

通过   数组名.Length 可以获得数组的长度。

39.数组中的变量位置交换

   A+b=Length-1-a;

   5个元素(2    6个元素(3

   0-4              0-5

   1-3              1-4

                    2-3

  N个元素进行交换。

    1)交换n/2次。

    2)在一个循环中,第i个元素与第Length-1-i个元素进行交换。

32

 

40.冒泡排序:

   让数组中的元素两两比较(第i个与第i+1个比较),经过ni-1)遍两两比较,数组中的元素能按照我们预期的规律排序。

    1.要从大到小排序,我们进行两两比较的时候用< ;

例如:

      10203040506070  原始数据7个元素。

 把上面数据从小到大排列(” > ”):

      20304050607010 第一趟 比较6次。

      30405060702010 第二趟 比较5次。

      40506070302010 第三趟 比较4次。

      同理。。。

      70605040302010 第六趟 比较1次。

也就是说n个数需要排n-1趟。第t趟比较n-t次。

i=0  第一趟

i=1  第二趟

趟数:i+1  t= i + 1

forint j = 0; j < n – i -1;j++

 

则为下面代码:

for(int i = 0;i < numbers.legth – 1;i++)

{

    for(int j = 0;j < numbers.length – 1 – I;j++)

{

     if(>)

     {

       交换

}

}

}

例子:

41.方法(函数)

  功能:用来复用代码的。当我们在一个程序中反复的写了同样的代码,那一般情况下,我们可以把需要重复写的代码定义在一个方法中,用的时候只需要调用就行了。

定义方法的语法:

public

[访问修饰符][static]返回值类型方法名([参数]

   方法体;

注意:1)一般情况下,方法一般要定义在类中。

     2)如果方法没有返回值,则返回值类型写 void

     3)如果方法没有参数,()不能省略。

 Console.Clear();--------------清屏

 

方法的调用:如果是静态方法(由static修饰的)则使用类名.方法名()

在类中调用本类调用的方法,可以写成   方法名();

return:立即退出本方法。

 

42.变量的作用域

在方法中定义的变量称为局部变量,其作用域从定义开始,到其所在的大括号结束为止。

 

43.参数

   被调用者想得到调用者方法中的变量时,则可以让调用者以参数的形式给被调用者。

  如: public static void Test(int number) //形参

 

在方法名后面的括号内定义的变量,叫做定义这个方法的参数,这里定义的变量用于接收调用者传来的数据

注意:如果一个方法一旦有参数,那么调用者必须传参数,并且传参数的个数与对应位置类型必须相同。

例子:

 

44.返回值

  当调用者想访问我们的方法中的变量时,可以通过返回值返回。

 例如:

      String s = Console.ReadLint();

      int I = Console.ToInt32(“22”);

为什么方法前面能够定义一个变量收到方法的值,是因为在方法中使用了返回值。

只要在方法中返回了值,那么调用方法中,前面就应该用一个变量来接受方法的返回值。

 

注意:一个方法只能有一个返回值。

     

一旦一方法有返回值,那注意在这个方法值中,就必须通过return语句返回一个值,并且找个值要与返回值类型是相同的。

语法:        return;

45.方法的复用

 

46.传入数组

当形参是数组的时候,我们传输组名

 

复习:

一个变量一旦定义在方法外,类的里面。就叫做类的字段。这个变量就可以被本类的所有方法所访问。但是要注意,静态方法只能访问静态字段。

const修饰的常量不能定义静态的。

 

47.方法的重载

  什么叫方法的重载:

     一般在同一个类中,方法名相同,并且方法的参数的个数不同或者对应位置上的类型不同,才能构成方法的重载。

注意:方法的重载和返回值没有关系。

 

通过参数来返回值:

如上代码:

实现步骤:

       1.在方法的参数类型前加out,那么传参数的时候,也必须在number前加out表明这个参数不是传入的,而是用来传出值的。

       2.如果参数是以out形式传入的,那么在传入前可以不赋值。

       3.在方法中对于由out修饰的参数,必须赋值,并且必须在使用前赋值。

 

练习:写一个MyTryParse方法,要求用户传入一个字符串,如果这个字符串能转换成int类型,则方法返回True,并且转换后的int类型数据通过方法的参数传出。如果字符串不能转换成int类型,则方法返回false,那么out传出的参数将没有意思,在方法中随便赋个值就行了。

 

注意:out用于传出值在方法中必须对out修饰的传数进行赋值。

      ref可以理解成双向的,既可以传入,又可以传出。

 在传参数的过程中,如果参数有out或者ref修饰的话,那么改变方法中的参数变量的值,调用者方法中变量的值也会相应改变。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值