首页 > 代码库 > C#基础

C#基础

C#基础

 .NET

   .net是基于internet协议和标准之上的新平台提供了一套无缝链接和沟通的工具

    1,平台环境是指开发和运行软件的环境,基于Internet协议和环境

    2,它是微软一切技术和产品的总和。

 

    .net framework是.net的核心,是一个集成在Windows中的组件,它提供了生成和运行.net应用程序的环境,主要有公共语言运行时和。net类库组成。

    优点:统一的编程模式,基于开放的标准,高效而功能强大的集成开发环境。

 

   CLS是Common Language Specification 公共(通用)语言规范,定义了所有.net语言应遵循的规则,确保可以生成于其他语言操作的应用程序。

  FCL是Fromework Class Library  框架类库,提供了一组丰富的数据类型,包含基类库和扩展类库。

   CLR 是 Common Language RunTime 公共语言运行时,管理内存,执行代码,代码安全验证,编译其他系统服务。

   CTS 是Common Type System 公共类型系统,定义了.net平台的所有的数据类型以及这些类型需要遵循的标准,主要包含标准.net数据类型和准则集。

                       技术分享

 

  C#

  C#是专门为.net设计的面向internet和企业级应用的新一代的编程语言,综合了目前所有高级语言的特点,是一种简洁优雅,类型安全,完全面向对象的语言。

   MSIL 是Microsoft Intermediate Language 微软中间语言, 是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段msil代码可以被不同的编译器实时编译并运行在不同的结构上。

   编译运行的过程:

  C#语言-->公共语言规范(CLS)的编译器-->MSIL(中间语言或程序集)-->公共语言运行库(CLR)中的编译器-->操作系统执行的代码。

    两次编译的过程:第一次是为了将不同的语言编译成中间语言形成程序集,第二次为了CLR针对不同的操作系统做优化。

 

    转义符

      技术分享

 

  变量的命名规则

  ① 由字母,数字,下划线组成,不能以数字开头

  ②不能使用关键字

  ③不能包含特殊意义的字符

 简单数据类型

            技术分享

          类型                     大小

  整型    sbyte               有符号2的8次方

            byte               无符号2的8次方

        short               有符号2的16次方

                 ushort             无符号2的16次方

                 int                    有符号2的32次方

                uint                  无符号2的32次方

               long                  有符号2的64次方

               ulong                 无符号2的64次方

  非整型  float   float f=1.7f;  默认为小数加后缀f区分

       double

            decimal  decimal d=1.7m;    默认为小数加后缀m区

  字符类型 char    单个字符用单引号  如 cha a=‘a‘;

           string

  日期类型  datetime  datetime date;

  布尔类型  bool

 i++与++i

     i++  先返回值在自增   返回增加之前的数

         ++i  先自增再返回     返回增加之后的数

 运算符分类

  (按操作符的数量):一元, 二元, 三元

   (按功能划分):

    ①.算术运算符 + - * / % ++ --

    ②.比较运算符 > < >= <= == !=  返回值为bool类型

    ③逻辑运算符 &&   ||   !

        ④赋值和快捷运算符 = += -= *= /= %=

常量

    内容不会发生变化的值

    使用const 声明

  建议命名全部大写 如:const double PI=3.1415。

数据类型的转换

    隐式转换(数值类型间转换):由小范围到大范围的数值类型转换,不会失败,不会精度丢失,一般发生在数值类型之间

  显示转换(强制转换):存在风险,可能会丢失精度。

    语法:新类型 名称=(待转类型)名称

 

技术分享
            byte b = 9;            int i = b;//隐式转换            b = (byte)i;//强制转换           
View Code

 

 

 

.net 默认不检查强制转换错误,使用checked代码块检测强制转换错误。

 

 checked            {                //转换代码             }           

 

 

 

   parse将字符串转换成其他类型 。

  int a = int.Parse("1");

  double ss = int.Parse("1");

  tostring()从其他类型转到字符串

  Int a=9;  string str=a.Tostring();

 Convert转换,被称为万能转换

       Int a=Convet.ToInt32("1");

 方法

   1、定义

   方法就是对一系列语句的命名,减少代码重复。

   每个方法都有一个名字和方法体。 

  大部分方法可以处理传入的数据并返回处理的结果。

  方法体没有大小。

   2、语法  

 技术分享

 

3、调用语句

    方法名称(参数)

   方法名必须与声明的一致

   参数列表是可选的信息

  不管参数列表有没有参数,都要有括号

4、Return语句

    Return后面的语句不再执行。

  如果方法有返回值,方法体中必须有return语句;没有返回值,有没有都可以。

   Return关键字后必须返回相同类型的数据。

 

5、确定函数参数的原则:自己能确定的数据自己内部解决,自己确定不了的数据通过参数传递。

6、方法尽可能小,以便完成一个独立的工作,不要有与用户交互的代码。

7、如果方法需要信息(定义了参数),则必须传入参数

8、可以调用同一个类或者其他类中的方法;方法也可以调用其他方法。

 

 参数

声明方法的参数,必须指定每个参数的类型和名称。

定义方法时声明的参数叫做形式参数,而在实际调用时传递给方法的参数叫做实际参数。调用方法时,参数类型和个数必须相同,但参数名可以不同。

1、值参数

   方法默认值传递,传递的是变量的副本。

    值类型参数传递给方法时,传递的是数据的副本而不是数据本身。

  方法内部对形式参数的修改,不会影响方法外的实际参数。

 

2、引用参数

    将引用类型的对象传递给方法时,引用类型的变量不直接包含其数据;它包含的是对其数据的引用(地址),即引用指向原始对象而不是副本。ref是关键字。

   方法内修改形式参数,会影响实际参数。

  在方法中修改外面已有变量时使用,更侧重于改变一个。

3、输出参数

   Out关键字会导致参数通过引用来传递。这与ref关键字类似。若要使用out参数,方法定义和调用方法都必须使用out关键字。

   侧重于输出一个值。

4、区别

  Ref要求变量必须在传递前进行初始化(赋初值)。而作为out参数传递的变量不必在传递之前进行初始化,但是在离开方法之前,必须为变量赋值,有赋值操作。

5、用途

  方法需要返回多个值时使用。

6、TryParse

?  通过Bool表达式配合TryParse使用,防止类型转换失败。

?  语法:   TryParse(待转字符串,out 转出的变量名)

 

7、方法重载

   方法签名:方法的名称、参数的类型及参数的修饰符(out/ref)可以构成有效的签名,每个方法的签名在同一个类中必须唯一。

  方法重载:在同一个作用域中,两个方法的名称相同,但方法签名不同称为方法重载(OverLoad)。用来解决同一类型的问题。[out与ref的区别不可以构成]

8、递归方法

   递归过程是指调用自身的过程。

   必须考虑递归结束的条件。

例:计算阶乘

引申:技术分享6!是6*5!

 

 选择语句

If语句

If(bool表达式)

{

//表达式为真,执行

}

else

{

//表达式为假执行

}

  C#规定,每个else部分分总属于前面最近的那个缺少对应的else部分的if语句。

注意:Else可有可无;

单行语句可以不写{},但是提倡单行也要写;

If条件后不能加分号;

 

 Switch-case语句

多路判断语句

?计算条件表达式并对照多个常数值进行检查

1、注意

l  Break不能少

l  Switch()中的变量可以是int、string、bool、char、枚举类型,

但必须有一个定值。

l  每个case标签后是常量表达式的值,不必连续,也不必按特定顺序排列,但不能相同,否则会出现错误。

每个case标签之后的语句数不限,有多个语句,也可以不用{}。

l  default标签可选。意思是其余的结果。

2、区别

?相同点:都可以用来实现多路分支。

?不同点

多重if结构用来实现两路、三路分支比较方便。

Switch结构实现三路以上分支比较方便。

If结构用来判断一个值是否在某个区间的情况。

在使用switch时,case语句后面必须是常量表达式

 

循环语句

For语句

要求只在对特点条件进行判断后才允许执行循环,用于将某个语句或语句块重复执行预定次数的情形。

For(初始值;条件;增减变量)

{

…………

}

?首先赋初值,只执行一次。

?判断条件表达式是否满足,如果是执行{}内语句,如果不是,退出循环。

?每次执行完循环体内的语句都要执行增减变量。

?break用于退出循环

?continue用于跳出当前循环并开始本for的下一次循环。

?可以有死循环for(;;) 

 

While语句

While(条件true)

{

//退出条件

//语句

}

?执行一个语句或语句块,直到指定的表达式计算为false退出循环。

?先判断表达式是否满足条件,是,执行语句;否,退出。

?大多数情况下,while语句可以和for语句互换,while常用语计算次数不确定的情形。

例子:用户输入考试分数,直到按q退出,否则一直提示输入

 

 

Do While语句

Do

{

//循环体

}

While(条件)

?重复执行{}内的语句,直到指定的表达式为false退出。

?与while区别:循环体至少执行一次 

例子:乘法表

 

 for (int i = 0; i <= 9; i++)            {                for (int j = 1; j <= i; j++)                {                    Console.Write("{0}*{1}={2}",i,j,i*j);                    Console.Write("\t");                }                Console.Write("\n");            }      

 

 

 

 数组

?  定义:存放一组类型相同的变量,是一种数据结构。

?  这些变量都可以通过计算索引(位置)进行访问。

数组属性

?  数组的索引从零开始,具有n个元素(变量)的数组的索引时从0到n-1(因为从0开始).

?  数组元素可以使任何类型,包括数组类型(数组嵌套)。

  ?数组类型是从抽象基类型Array派生的引用类型。

  ?可以对c#中的所有数组使用foreach遍历。

数组类型

  一维数组

  多维数组(有行还有列或者高)

  交错数组

声明赋值数组的语法

                                     技术分享

 

 

●数组声明后必须赋值才能使用。

●访问数组,通过索引,使用for、foreach循环遍历。

●For循环可以读取、设置元素值,不必访问所有元素。

●循环遍历的方法:foreach和for

Foreach循环,不能对元素赋值,按顺序依次遍历,不能跳跃,拿不到索引。

 

数组常用方法及属性

1、 Length 长度

获取32位整数,该整数表示Array的所有维数中元素的总值。

语法:数组名称.Length 

2、 Rank 维度

获取Array的维数。

语法:数组名称.Rank

3、 Array.Clear()清除元素值

将数组中的元素设置为0、null或fasle,具体取决于数组元素的数据类型。

语法:Array.Clear(被清除坐标数组名称,起始坐标,结束坐标) 

4、 Array.copy 复制

将一个数组的一部分元素复制到另一个数组中,从索引0开始复制一定长度的元素。

语法:Array.Copy(被复制的数组名,复制到的数组名, 元素个数); 

5、 CopyTo复制

将源数组元素内容复制到目标数组,从目标数组的某个索引处开始到结束复制,目标数组长度必须大于等于源数组长度。

语法:源数组名称.CopyTo(目标数组名,目标数组开始复制的元素位置)

注意:目标数组长度必须大于源数组;

从设定的起始元素起替换目标数组元素,目标数组大于源数组的的内容将保留 

6、 Clone 克隆

克隆是将已知数组复制给新定义的数组,所以需要声明新数组用于接收;

克隆必须进行强制转换,即:(数组类型[])

语法:新定义的数组=(数组类型[])目标数组名.Clone(); 

7、 Array.IndexOf()正向查找第一个匹配项的索引(元素位置)

Array.LastIndexOf()反向查找第一个匹配项的索引

返回一对数组或部分数组中某个值第一个匹配项的索引,找不到返回-1。

语法:Array.IndexOf(数组名称,元素) 

8、Array.Sort()排序

语法:Array.Sort(数组名称) 

9、Array.Reverse()反转

反转数组中元素的顺序

语法:Array.Reverse(需要反转的数组名称)

冒泡排序

 int[] number = {2,8,6,1,3 };            for (int i = 0; i < number.Length-1; i++)            {                for (int j = 0; j < number.Length-i-1; j++)                {                    int temp = 0;                    if (number[j] > number[j + 1])                     {                        temp = number[j];                        number[j] = number[j + 1];                        number[j + 1] = temp;                    }                }                            }

 

 

二维数组

●二维数组就像具有行和列的表格。

●二维数组具有两个索引,分别代表行(前面)、列(后面)。

●int[,] score=new int[5,2];

声明初始化赋值

                  技术分享

交错数组

●交错数组就是元素为数组的数组(数组的嵌套)。

●交错数组元素大小可以不同(元素就是数组,指的是交错数组中的数组大小可以不同)。

●声明一个由5个元素组成的一维数组,其中每个元素都是一个一维整数数组。

●Int[][] score =new int [5][]                   5为外围数组(行)   []为内在数组

Params参数数组

●通过关键字params定义参数数组

●用于方法参数不固定的场合

●可以传递数组,也可以传递类型相同的多个变量。

作用

●在对数组长度未知(可变)的情况下进行函数声明。

注意

●数量不限。

●参数数组必须是方法声明中的最后一个参数。

●方法最多只能有一个参数数组。

●只能在一维数组上使用params关键字。

●Console.WriteLine中使用占位符,就是使用参数数组实现的。     

 

 数据类型

  值类型

●直接存储值。(数据存储在栈中)

●一个值类型变量赋给另一个值类型变量时,会复制一个数据副本给它(在栈中产生2个数据)。

●改变值类型不影响其他数值。(因为是2个数据,互不影响)

 

  引用类型

●存储对数据的引用地址。(变量定义在栈中,而数据实际存储在堆中,数据只是引用到变量)

●赋值时只复制对对象的引用地址,而不复制对象本身。(实际数据只有一份)

●两个引用类型的变量可以指向同一对象。

●改变一个引用类型的变量可能会影响其他对象。(因为是一份数据)

 

String类型

●String是特殊的引用类型,外在表现类似于值类型。(因为引用类型存在堆中,可以存大量内容,所以string定义为引用类型)

●String再赋值后(s1=“二毛”),不会影响s1的值。但是原数据就会是垃圾。

●String赋值后的值,是不可以改变的(所以才会产生垃圾)。

●可变字符字符串:stringBuilder

 

  比较值类型

  在做==和!= 比较时,比较的是存储的数值(真实数据)。

 

  比较引用类型

  在做=和!= 比较时,比较的是引用的位置是不是同一个,而不是所引用的值。

 

枚举类型

●枚举意义在于限定变量的取值范围。

●用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。

●enum关键字用于声明枚举。

●语法:enum名字{值1,值2,值3,值4}

●在方法外声明枚举。

●每个枚举元素都是有枚举值。默认情况下,第一个枚举的值为0,后面每个枚举的值一次递增1,可以修改值,后面的枚举数的值一次递增。

●枚举元素默认基础类型为int,准许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long或ulong。

              

 

结构

●是值类型,用来封装小型相关变量组(变量类型可以不一样)

●内存访问的开销较小

●类是引用类型,有些类仅仅包含很少的数据,它使用的堆的代价就有点不成比例了。

 

字符串操作

属性

●使用s.Length属性来获得字符串中的字符个数。

●字符串的内容一旦声明就不可变。所以只能读取,不能修改。

●如要修改字符串内容,先创建一个新的字符串,用s.ToArray()方法得到字符串的char数组,对数组进行修改后再调用new string(char[])这个构造函数来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的改变。 

           ●StringBuilder可变字符串。 

1、字符串反转:“我要学习”

stringstr = "我要学习";

char[] toChar = str.ToArray();

Array.Reverse(toChar);

stringtoStrint = newstring(toChar);

Console.WriteLine(toStrint);

2、单词反转:I want to learn

stringstr = "I want to learning";

string[] toArry= str.Split(‘ ‘);

Array.Reverse(toArry);

stringtoString=string.Join(" ", toArry);

Console.WriteLine(toString);

 装箱和拆箱

    装箱;将值类型转换成引用类型    装箱容易拆箱难

    拆箱;将引用类型转换成值类型

 

 

 

 

 

 

 

 

 

C#基础