自己用的C#基础学习笔记(一)——C#面向过过程

1      第二天

1.1    程序设计

程序设计步骤:分析问题,设计算法,编写程序,运行程序,分析结果,编写文档

面向过程三个结构:顺序结构、选择结构、循环结构

面向过程的三个原则:自顶向下、逐步求精、模块化

面相对项:对象、类、封装、继承、多态、信息。优点:符合人们认识事物的规律。改善程序可读性,人机交互更加贴切自然语言。

1.2    计算机组成

计算机分类:电子模拟计算机,电子数字计算机:专用和通用。

计算机的五代发展

计算的五个组成部分:控制器,运算器,存储器,输入设备,输出设备。

计算机的存储:半导体存储,铁磁环存储

软件分类:系统软件,应用软件。

Windows组成:内核部分,应用程序,ie视窗。

Windos命令快捷:

Dir 显示本文件夹下内容

Md 创建文件夹

Rd删除文件夹

Cd 切换路径cd.. 上一级

切换盘符盘符+:

 

1.3    VS使用

1. 新建项目,尽量不要用中文。

2. 解决方案大于项目,一个方案下可以有多个项目

3. Properties属性,C#后缀名为cs文件,C的后缀为c,C++为h或cpp

4. Bin-》debug-》里面有程序的可执行文件exe。

5. 选项-》Consolas字体,程序员常用。文本编辑器里,打开行号

6. F5播放,sln文件为解决方案的可执行文件,双击进入解决方案,suo隐藏文件,csproj项目进入文件。

7. 快捷键:

ctrl+s\z保存撤销

k+c注释 k+u取消注释

k+d代码对齐

l 删除一行

ctrl+F5开始执行但不调试

alt+shift+               

K+S折叠冗余代码 #region  #endregion

红色波浪线指报错、绿色警告。

8、解决方案右键添加新的项目,多个项目需要在解决方案中右键属性修改自动项,不然只会运行上一次运行的程序。

 

1.4    C#基础

1.    net平台

新一代平台,两种交互模式C/S,B/S。

作用:窗体应用程序的开发、应用程序(网页为主)。

2.    netframwork框架

为net平台提供稳定的运行环境。

为平台下应用软件提供运行环境。

编译器、CLR公共语言运行池、FCL类库、BCL类库。

C#->编译器(IDE)-》FCL类库-》CLR公共语言运行池jit模块解析成机器语言-》计算机阅读。

3.    static void Main()主函数,程序入口。

Console.writeLine();将字符输出在控制台上。

输出多个变量时,可以使用占位符,{0},{1}…占几个位置必须填几个变量,例如:

Console.WirteLine(“语文{0}数学{1}英语{2}”,a,b,c);

Console.Write();用法和上面一样,只是不会换行

Console.ReadKey();暂停,任意键继续,接受用户输入的字符显示在控制台,mono中会自动输入,但vs不会。

Console.ReadLine();返回字符串类型,必须用字符串类型变量接收

4.    注释

三种,1单行注释://  解释代码的意义,注释掉代码。2多行注释:/*  */。

3文档注释:///注释类和方法使用。

2      第三天

2.1    C#基本语法1

2.1.1     变量、数据类型

1、 整数类型

2、 Sbyte   -128 --- 127

Short -2^15-----2^15-1   -32768 --- 32767   2字节

Int  -2^31----2^31-1     -2147583648----2147483647  4字节

Long -2^63----2^63-1    8字节

一般用int

 

无符号整形:没有负数,从零开始

Byte  o-255

Ushort 2^16-1 65535

Uint 2^32-1 4294967295

Ulong 2^64-1

 

2. 小数类型:浮点型

单精度float  7位小数赋值时后面必须加f,用来区别双精度。赋值为整数时,会默认为整数.0,不用加f。 4字节

双精度double  15位,不用加f  8字节

Decimal 货币类型28位 16字节赋值时后加m

Unity中常用的是float

3、 字符类型

Char 赋值使用单引号,只能存一个字符,可以存一个汉字,因为C#的char是占用两个字节,char不能为空

字符串类型:string 必须使用双引号赋值,空字符串也占内存。

4、 布尔值

只有true和false,其他值都不行,0和1也一样,此处和PHP不一样。

 

2.1.2     变量命名规范

字母下划线开头,只能字母大小写,数字0-9 下划线,不能有空格

C#区分大小写

变量名不能使用关键字,例如:true,flase,while,case,break,int,long。。。。等

经典命名方法:

Camel命名法(驼峰法):第一个单词首字母小写,第二个首字母大写。一个单词小写

Parscal命名法:所有单词首字母大写

匈牙利命名法:C++老程序员使用较多,变量格式:作用域_数据类型的变量名。

作用域表现形式:全局静态s_,全局作用g_,常量c_,类的作用m_,方法作用域没有开头(随便写)

数据类型:int  n, float  f,double  d,long  l,short s,uint  un,ushort  us,ulong  ul,char b/c,byte ub,sbyte b ,string sz,bool b ,对象 p

如果是数组结构,就把它当做对象。

结构体su  结构体名字全部大写,有空格的地方用下划线。

枚举em,跟结构体一样

2.1.3     变量声明

<数据类型>变量名/=值/变量名1,变量名2.

Eg: int number; Int number = 8; intnumber,number2

2.1.4     算数运算符

和PHP一样.

2.1.5     类型转换

隐式转换:低精度转高精度,可以自动转。

显式类型:即强制类型转换(int)(long) (short)

不同类型的数据先转换才能运算,例如:

Int a =4,b=5; float c= a/b; 此例子不会有小数,因为int计算后才会转换类型,小数直接被舍弃了。

String 转int  Convert.Toint32( );  转shortint16  转longint64

Uint16 uint32 uint64

转double  Convert.ToDouble();

转float  Convert.ToSingle();

 

2.1.6     转义字符

和php一样

\b 退格(删掉一个字符),放在字符串开头结尾不起作用。

\n换行,\r回车

 \ttab

@取消转义字符的作用,按原格式输出。

2.1.7     进制转换

十进制转二进制,十进制数除以2,一直除到余1或者除尽,过程所有余数倒过来即二进制。

例如19/2 ,余数11001,二进制为10011

二转十,二进制每位数乘以2的位次方,再相加,即为十进制。公式 m1*2^0+m2*2^1+…mn*2^n-1

 

1、 负数转换取反加1  即反码+1表示负数,加的1叫做补码

7为0000 0111(原码)  -7 为1111 1001

二进制最高位为1即为负数

最高位为0,即为整数。

2.1.8     位运算

按位与&:都为1为1,

按位或|:一个为1即为1,

异或^:相异为1相同为0,

取反~:反之

左移右移<<>>:左移n位即乘以2的n次方。高位丢弃,低位补零。

右移n位就是除以2的n次方。低位抛弃高位补零,负数则补1

注意:左移右移都是以符号左边为位移数

 

3      第四天

3.1    C#基础语法2

3.1.1     自增自减运算符

++,--    优先级高于乘除法

++I,先加后用i--

I++,先用后加

减法同理。

Int I = 0;

Int a = (++I + I++/4 – i--) * 6 + i++;

       1      0    2      1

结果i=2,a=-5;本题误区,整型/整型永远是整型,所以1/40

不能用于表达式和常量。

三目运算符中,作为输出结果,i++也是先加后用。例如:a=1;b=2;a>b?a:b++;此时输出,b=2;

3.1.2     直接赋值运算符

+=,-=,/=,*=,%=

使用和PHP一样

3.1.3     关系运算符

< >= <=  ==  !=

算数运算符优先级高于关系运算符。

关系运算符返回布尔值

3.1.4     逻辑运算符

&& ||  !  与或非

逻辑运算符比关系运算符低,包括==。

3.1.5     优先级列表

待截图

3.1.6     分支语句

If(布尔表达式){

       要执行的代码;

}

注意:C#中不能使用数值变量或者空字符串代表布尔值,包括10

If(){  }else{  }

If(){ }else if(){  }else{  }  //执行完一个成立条件,就不再往下走了

三目运算符

a>  b?a:b

switch(表达式){//和PHP一样,default可以不要,每个语句后面不要忘记加break;包括default

       case“a” :语句1;break;

       ……..

       Default: 语句;

}

Switch效率更高一些。

If代码段内的定义的变量,只能在if中使用。即变量的作用域仅限于if条件内

4      第五天

4.1    异常捕获

用来纠正用户不按常理出牌的输入导致的报错

语法:

Try{

       会产生异常的语句;

}catch{

       异常处理语句;

}finally{

       最后必须执行的语句;

} Finally必定执行,但可以不要

例如:

Try{

Console.wirteLine(“”);

Int number = 输入语句

原执行语句

}catch{

Console.WriteLine(“输入非法”);//直接写结果即可,判断是否非法是由系统判断的,因为C#本身变量的强类型。

}finally{

}

4.2    循环语句

1、         While循环

Whiel(循环条件){

         循环体;

}

Break在循环中代表终止循环语句

Continue;跳出本次循环,进入下一次循环

2、         do while循环

do{  }while(循环条件);//先执行一次

4.2.1     程序调试

点击代码左侧的黑条,设置断点

F10快捷键逐步执行

黄色的符号是将要执行的,绿色箭头是正在执行的,鼠标放在变量上,可以看到变量在当前执行过程的值。

5      第六天

5.1    常量

不能被重新赋值

声明【访问修饰符】 const  <数据类型>  <常量名> = <值>;

例如: const double PI = 3.4159265;

注:常量不一定非要用大写字母,小写也不会报错,此处和php不同,但一般命名时都会采用大写,多个单词用下划线隔开。

作用:提高可读性,方便运算,可以复用。

5.2    访问修饰符

Public 共有   private 私有

5.3    复杂数据类型

5.3.1     

举例:

Enum Season{

       Spring,

summer,

autumn,

winter

}

枚举enum

【访问修饰符】 enum 枚举名{

       枚举项

       枚举项

       ….

}

每个枚举项以逗号结束

枚举可以在命名空间下定义,

类下也可以定义,如下:

using System;
namespace xuexi
{
    public enum Gender{
        nan,nv
    }
    class MainClass{
        public enum Gender1{
            男,女
        }
        public static void Main (string[] args){

枚举的使用:赋值时使用枚举名加点来表示,定义时使用枚举名为类型,如下

Gender g = Gender.男;  Gender1 g1 = Gender1.女;

5.3.2     枚举和其他数据类型转换:

枚举类型和Int类型相互兼容,可强转:(int)   

例如:int num = (int)g;

public enum Gender1{
          男,//相当于0

女//相当于1

}

注意:枚举项也可以从任意数开始,后边根据第一个数后延,直接对枚举项赋值即可

例如:public enum Gender1{
            男=8,//相当于8

女=12,//相当于12

人妖 //13

}

Int转换成枚举,对应的int值转换成枚举项,如果没有该int值,不会报错,但也不会转换。

Int a = 8;

Gender1 gg = (Gender1)a;

枚举转换成字符串:

Gender1 gg = Gender1.男;

String gstr = gg.ToString();

字符串转成枚举:

(枚举类型)Enum.Parse(typeof(枚举名),字符串);

注意:此处的字符串可以使枚举项本身,也可以是枚举项的索引

 

例如:(Gender1)Enum.Parse(typeof(Gender1),”0”/gstr);

接收转换结果时使用对应枚举类型的变量 例如:Gender1 g3 = (Gender1)Enum.Parse(typeof(Gender1),”1”);

 

5.3.3 Parse方法转换数据类型:

大多数类型都有转换方法(待补充没有的)

Int.Parse(num);

String.Parse();

Enum.Parse();

5.3.4     

Public struct Person{

       Public string name;

Public int age;

Public Gender gender;//枚举

}

结构体

存储多个不同的变量,

结构体是值类型

在命名空间,类下做的定义

【public】Struct 结构体名{

[public]结构体成员;

}

注意:结构体不能赋初值,

结尾是分号,和枚举不同

使用结构体:

Person p1;

P1.name = “csdfs”;p1.age=”12”;p1.gender =Gender.男;

Person p2;

P1.name = “42fs”;p1.age=”32”;p1.gender =Gender.男;

 

思考问题:

结构体变量的遍历:

枚举的遍历:方法是加一个标志作为最后一个枚举项,得出最后一个枚举的索引值,然后for循环(该方法只适用于正常索引的枚举值)

5.3.5     一维数组

<数据类型>[]数组名 = new    eg:int[] nums

赋值方法:int[] nums = {1,2,3,4,5};int与中括号之间可以有空格

Int [] nums = new int[10];//如果不给赋值,此时默认全部为0

Int[] nums = new int[2]{1,44};

单个赋值:nums[0] = 5;//默认从0开始,索引不能为字符串

数组长度可以用 .Length获得,eg: nums.Length

Array.Sort();//数组元素升序排序

Array.Reverse();//反转函数,将每两个数组的元素顺序反转过来,例如{1,2,3}反转后{3,2,1}

C#中没有降序,只有升序,但可以使用先升序排序,然后在使用反转函数,即形成降序。因为有顺序下元素互换正好更换顺序。

C#中,数组a赋值给数组b,只是将引用给了数组b,修改数组ab中任意元素,对应的数组元素会跟着变。

 

5.4    循环嵌套

5.4.1     For循环(固定次数的循环)

For(初始表达式;循环表达式;增量表达式){

       循环体;

}

循环中声明变量不会报错,eg:

For(int I =0;i<10;i++){

       Inttt = I;//循环中声明变量,不会重复声明。

}

和 PHP一样

Random r = new Random;//创建随机数对象

r.Next(100);//随机0-99之间的数

r.Next(1,50);//随机1-49之间的数

随机出来的数字不包含最后一个(即最大值)

6      第七天

6.1    数组

6.1.1     结构体数组

Static struct Length{

Public float area;

Public float length;

}

Length[] nums1 = new Length[3];

Nums1[0].area = 0;

Nums1[0].length = 23;

Nums1[1].area = 20;

Nums1[1].length = 233;

 

6.1.2     二维数组

Int[,] nums = new int[,]{{1,2,3,4}{3,4,6,7}};两行四列

Int[,] nums = new int[2,3];两行三列

1【0,0】

2【0,1】

3【0,2】

4【1,0】

5【1,1】

6【1,2】

赋值:nums[0][0] = 7;

给没有的下标赋值不会报错,但运行会出错,例如:nums[3,3]= 56;错误的方式

获取长度:

Nums.length   例如:2,3   获取长度为6

nums.GetLength(0); 获取第0维的长度,即有多少行,开头n小写

nums.GetLength(1); 获取第1维的长度,即有多少列

6.1.3     三维数组

Int[,,] nums = new int[1,2,3];

自行了解

6.1.4     Foreach循环

Var 是一个推断类型,可以根据变量中的类型自动推断变量的类型,该推断在编辑器中推断的,编辑器中完成,效率等同同类变量

例如: int a= 6; 可以改为  var a = 6;自动推断为int类型

Foreach(var item in 数组){

       Console.WriteLine(item);

}

6.1.5     交错数组

1

2

 

 

3

4

5

6

7

8

9

 

第一行两列,第二行4列,第三行三列,这就是交错数组

交错数组可以指定每一行有不同列

<数据类型>[][]交错数组名称;

Int[][] a = new int[2][];先指定有多少行

a[0] = new int[3];然后再单独指定有多少列

a[0] = new int[6];

赋值方式:a[0][2] = 9;同样不能超出下标界限

获取多少行一样使用GetLength(),行可以用GetLength(0)获取有多少行,其余应该使用nums[0].Length,nums[1].Length,nums[2].Length,其中0,1,2,正好是行下标,因此可以用i代替

例如:

For(int i=0;i

For(intj;j

       Console.WriteLine(nums[i][j]);

}

}

使用foreach嵌套也可以遍历

Foreach(var item in nums){

       Foreach(varv in item){

              Console.WriteLine(v);

}

}

6.2    函数

代码重用的机制

函数的实参和形参都占用空间

优点:模块化和复用

[public]  static 返回值 函数名([参数列表]){

代码块;

Return 返回值;

}

函数名使用帕斯卡命名法,即全首字母大写

Void代表没有返回值

函数写在主函数之外

例如:static int Add(int a,int b){
            return a+b;
     }

函数调用:如果该函数是静态函数,调用方式是类名.方法名.如果这个函数和主函数在同一类下,可以直接写函数名调用,参数不能为空。

形参和实参内容和php一样。

实参形参都在内存中开辟了空间

6.2.1     输出参数out

可以返回多个不同类型的数据。

举例:

Static int Add(out int a,int b){

       a= 0;//out参数a,那么a必须在函数内重新赋值,方法外赋值没有用

       b+=a;

       a+=b;

return b;

}

调用:

Add(out a,b);//out的变量,传递时必须加上out

该方法中,out的变量的值会直接改变原变量的值,相当于将变量值带出了函数。

6.2.2     可变参数params

可变参数其实是通过数组的方式来表现出数量可以变化的参数,而不是传递的值可以变化,所以可变参数标记的变量必须是数组。

Params标志的参数必须是数组,可以在参数中直接传值,而不是传递变量。传递的数值和函数的形参必须类型相同,顺序也必须相同,多个参数以逗号分隔。

注意:多个参数时,params必须放在所有需求参数的后面

 

6.2.3     可变参数params和out可以混用

static void AddCash(out float a,params float[] b){
    a = 5000.0f;
    a += b[0];
    a += b[1];
}

float a = 5000.0f;
AddCash (out a, 1000.0f,18.0f);
Console.WriteLine (a);//6018;

6.2.4     方法的重载

同名函数会发生重载。

C#中函数可以重名(两个或两个以上),但参数个数不能相同(或者个数相同,类型不同),重名后根据传递的参数来判断到底调用哪个函数。

参数个数相同,类型也相同,但顺序不同也构成重载,返回值不同不能构成重载

选中函数,按F12可以查看该函数的函数库,查看重载的信息。

7      第八天
引用型参数ref

使用变量的地址,直接修改实参的数值,使用ref必须在方法外先赋值

static void Change(ref int a,ref int b){
            int temp =a;
            a = b;
            b = temp;
}

int a = 5;//必须先赋值,否则会报错
int b = 8;
Change (ref a,ref b);//传参数时也需要用ref标记

7.1.1     值类型、引用类型(堆栈)

Int,float,double,short,enum,struct等值类型,数值存在栈中,地址也存在栈中。

String,数组,自定义的类,等引用类型,值是存在堆里面的,栈中只存引用的地址。

Ref本质就是复制了地址,然后直接通过地址改变栈中的原数值。

数组即使不加ref函数内操作也是会改变数组的内容的。

7.1.2     值类型和引用类型的区别

类中的变量存在堆中

方法中的变量存在栈中

值类型是值传递,引用类型是引用传递

7.2    方法的递归

方法自己调用自己,自己调用自己会死循环,所以一定要有条件的调用自己。

(静态方法必须使用静态变量)。多数无用,看例子。

Static int GetD(){

If(number<1){

       Return 0;

}

Int re = 1;

For(int I =1;i

Re*=I;

}

Return re+GetD(number-1);

}

 

你可能感兴趣的:(自己用的C#基础学习笔记(一)——C#面向过过程)