认识C#
.NET与C#
.NET概述与C#应用
.NET是Microsoft.NET的简称,是基于Windows平台的一种技术。
IDE环境
微软推出了强大的平台和技术,并提供了强大的集成开发环境(IDE)来支持,这就是visual Studio,它集成了.NET Framework,目前最流行的.NET平台开发环境。
第一个C#程序的创建
新建程序
启动Visual Studio 2012,选择 开始—>所以程序—>Microsoft Visual Studio 2012—>选择Visual Studio 2012选项。
使用Visual Studio 2012创建并运行控制台应用程序包括三步:新建项目—>生成可执行文件—>运行。现在我们一起创建一个控制台应用程序,输出一句话。
1.启动Visual Studio 2012
第一次运行Visual Studio要配置环境,需要花上一定的时间。程序启动后,需要选择最经常从事的开发活动类型,以便于Visual Studio将环境配置为最便使用的环境。这里我们经常要做的是C#开发,所以选择Visual C#开发设置。
2.新建项目
在Visual Studio菜单栏中选择文件—>新建—>项目选择,弹出新建项目对话框。
在左侧的项目类型中选择Visual C#选项,在右侧的模板列表中选择“控制台应用程序选项”。
在名称文件框中命名
在Main()方法中添加代码
Console.WtireLine(“内容”);
Console.ReadLine();
在C#中严格区分大小写,所以在使用中要区分大小写。
执行C#应用程序时,可以使用.NET Framework提供的一下快捷键。
F5:启动。
Ctrl +F5:开始执行不调试。
1.2.3认识C#程序
1.namespace关键字
namespace(命名空间) 是C#中组织代码的方式,它的作用类似于java中的package(包),这样我们就可以把紧密相关的一些代码放在同一个命名空间中,大大提高管理和使用的效率。
2.using关键字
在java中,如果导入其他包,应该使用import关键字。而在C#中,使用using关键字来引用其他命名空间,它的作用和java中的import类似。
3.class关键字
与java一样,C#也是一种面向对象的语音,使用class关键字表示类。我们编程的代码都应该包含在一个类里面,类要包含在一个命名空间。在程序模板生成时.Visual Studio自动创建了一个类,名为Program。如果你不喜欢,可以改掉它。注意:C#与java不同,不要求类名必须与源文件名称一样。
4.Main()方法
C#中的Main()方法和java中的main()方法作业是一样的,是程序运行的入口,应用程序从这里开始运行。但要注意的是,C#中的Main()方法首字母必须大写,Main()方法的返回值可以是void或者是int类型,Main()方法可以没有命名参数。因此,这样组合一下,C#中的Main()方法有四中形式。
语法
static void Main(string[] args){}
static void Main(){}
static int Main(string[] args){}
static int Main(){}
注意
编写程序的时候,一般会采用编译器自动生成的Main()方法,也可以根据需要修改成其它三种形式。例如,当Main()方法被调用时,如果希望通过命令行传递一些参数,可以采用带参数的Main()方法;当Main()方法执行结束需要返回一个结果(如执行成功还是失败)时,可以采用有返回值的Main()方法。
5.关键代码
Main()方法中添加两行代码结束这个小程序的关键代码,是用来输出和输入的。
Console.WriteLine("内容"); //从控制台输入内容
Console.ReadLine(); //从控制台输入
对比
组织代码的方式:C#使用的命名空间(namespa),java使用的包(package)。
引入命名空间或包的关键字:C#使用using,java使用import。
程序入口:C#的Main()有四种形式,java的main()有一种形式。
C#中的变量和常量
1.3.1 C#中的数据类型
C#常用数据类型
常用数据类型 | java | C# | 举例 |
---|---|---|---|
整形 | int | int | 年龄 |
浮点型 | float | float | 成绩 |
双精度浮点型 | double | double | 圆周率 |
字符串型 | String | string | 姓名 |
布尔型 | boolean | bool | 是否是少数民族 |
注意
C#中布尔型的关键字与java不同。使用bool,C#中字符串类型的关键字首字母是小写的。
在为浮点型变量赋值是,C#语言要求赋值数值必须以字母f或F结束。
1.3.2 C#中的变量
语法
数据类型 变量名称;
C#的变量名规矩和java基本相同,只是$符号在C#中是不能使用的,因此变量名的规矩则可以简单分为以下三条。
组成:52个英文字母(A-Z,az),10个数字(09),下划线(_),除此之外不能含有其他的字符。
开头:只能是字母或下划线开头。
不能使用的:不能是C#中的关键字。
规范
变量名规范如下
变量的名称要有意义,尽量用对应的英文命名,具有见名知意的作用。例如,一个变量代表姓名,不要使用aa,bb等,要使用name。
避免使用单个字符作为变量名,如a,b,c等,应该使用index,temp等,但循环变量除外。
当使用多个单词组成变量名时,应该使用驼峰命名法,即第一个单词的首字母小写,其他单词的首字母大写,如myName、youAge等。
1.3.3 C#中的常量
常量名称必须具有一定的实际意义。
常量名称最好以大写字母来命名,中间可根据意义的连接性用下划线做连接,每个常量定义的右侧最好有简单的注释,说明其作用。
常量名称长度最好不要超过25个字符,否则可读性差。
语法
const 数据类型常量名称 = 值
console类
1.4.1C#向控制台输出
利用Console.WriteLine()方法输出有三种方式
方式一:
Console.WriteLine();
方式二:
Console.WriteLine(“要输出的值”);
方式三:
Console.WriteLine(“格式字符串”,变量列表);
方式一和方式二的用与java中System.out.println()方法的用法相同,自己动手试试就一清二楚了。
方式三是C#语言中的新语法。先看一个列子:
string course=“C#”;
Console.WriteLine(“我的课程名称是:{0}”,course);
上面这句话的输出结果是什么呢?我们动手试试看就知道了
static void Main(string[] args)
{
string course=“C#”;
Console.WriteLine(course);
Console.WriteLine(“我的课程名称是:”+course); //用+号输出
Console.WriteLine(“我的课程名称是:{0}”,course);//用占位符输出
}
1.4.2 C#从控制台读入
于Console.WriteLine()对应,从控制台输入可以使用Conssole.ReadLine()方法。Write是写的意思,Read是读的意思。
语法
Console.ReadLine();
这句话返回一个字符串,可以直接把它赋给一个字符串变量,例如
name = Console.WriteLine();
如果需要输入整形数据怎么办呢?只要一个简单的转换就可以了。
int age = int.Parse(Console.ReadLine());
int.Parse()方法的作用是把字符串转换为整数。
类和对象
1.5.1 自定义方法
除了使用.NET提供的类的方法,也可以在类中添加自定义的方法。还记得在java中是怎么样定义方法的吗?在C#中定义方法的语法与java语法类似。
语法
[访问修饰符] 返回值类型 方法名(参数列表)
{
//方法的主题
}
1.访问修饰符
在java中已经学习过了访问修饰符public,在C#中将会使用两个访问修饰符,一个是public公共的,另一个是private私有的。
2.方法的返回值类型
我们编写的方法是实现特定功能的模块,看供他人调用,在调用后可以返回一个值,这个返回值的数据类型就是方法的返回值类型,可以是int、float、double、bool、string等。如果这个方法不返回任何值,需要使用void关键字。
3.方法名
每个自定义方法都要有一个名称,方法的名称应该有明确的含义,这样别人才知道这个方法实现了什么样的功能。
4.参数列表
调用方法时,可以向方法中传递参数,这些参数构成了参数列表。如果没有参数就不用参数列表。参数列表中的每个参数都是通过“类型参数名”形式进行声明,各个参数之间用逗号分开。
5.方法的主体
方法的主体部分就是这个方法实现某一特定功能的代码。自定义方法时,应该先写方法的声明,包括访问修饰符,返回值类型,方法名,参数列表。
1.5.2 理解类和对象
类是创建对象的模板,对象是类的一个具体实例,这就是类和对象之间的关系。
C#语言中,定义类的语法如下。
语法
[访问修饰符] class 类名
{
//类的主体
}
1.5.3 注释
我们知道,编写代码时注释是非常重要的一项工作,与java类似,C#中也提供多种注释。C#的行注释和块注释与java是完全相同的,分别是//和/…/,但文档注释也java中的注释不同,C#使用///,且文档注释的每行都以///开头。
C#语法快速热身
选择结构
我们在生活经常要面临一些选择。如计算机坏了,就不能写程序了,如果下雨了就不出去了。在编写代码是也经常要进行条件判断。
2.1.1 if结构
C#中的if结构的语法和java中的完全相同,我们快速回顾一下if结构的语法。
C#中的简单if结构如下
语法
if(条件表达式)
{
//代码块
}
语法
if(条件表达式)
{
//代码块1
}
else
{
//代码块2
}
C#中的多重if结构如下。
语法
if(条件表达式1)
{
//代码块1
}
else if(条件表达式2)
{
//代码块2
}
else if(条件表达式3)
{
//代码块3
}
else
{
//代码块4
}
注意
只有当满足外层if的条件时,才会判断内层if的条件。
else于离它最近的那个缺少else的if相匹配。
规范
if结构书写规范如下。
为了使if结构更加清晰,应该把每个if或else包含的语句都用大括号括起来。
相匹配的一对if和else应该左对齐。
内层的if结构相对于外层的if结构要有一定的缩进。
对比
大括号按规范写法:C#中的大括号{和}各占据新的一行;而java中大括号{紧跟if结构的条件后面,右大括号}则需要另起新的一行,这是一种编程习惯,可提高程序的可读性。
2.1.2 switch结构
C#中switch结构的用法与java有什么不同呢?我们都知道,java语言允许case中没有break语句。如果当前执行的case中没有break语句,程序会继续执行下一个case,直到遇到第一个break语句跳出,或执行完switch结构,还有紧跟在switch结构后面表达式的值或变量可以为int、short、byte、char枚举类型。string等数据类型。
C#语言要求每一个case和default语句中都必须有break语句,除非两个case中间没有其他语句,要么前一个case可以不包含break。
数组与循环
2.2.1 一维数组
在java中是怎么样声明数组的呢?下面的两种方式都正确。
语法
数据类型[] 数组名;
数据类型 数组名[];
但是,在C#中只能使用第一种方式,既不能把括号放在数组名的后面。
语法
数据类型[] 数组名;
例如:
int [] array;
2.2.2 对象数组
为了更方便地保存和操作学员信息,将姓名、成绩封装到学员类中。学习数组时我们已经知道,要保存三个学员姓名可以使用员工string类型的数组,要保存三个学员成绩可以使用一个double类型的数组。那么,如果要保存三个学员对象,该怎么办呢?没错,我们可以使用一个Student(学员类)类型数组,此时,数组元素为学员对象,我们称之为对象数组。实现代码如下
//学员类
public class Student
{
public string name; //姓名
public double score; //成绩
public void showInfo()
{ //输入信息
Console.WriteLine(name + "\t" + score);
}
static void Main(string[] args)
{
//定义对象数组
Program[] stus = new Program[3];
//为对象数组元素赋值
stus[0] = new Program();
stus[0].name = "张浩";
stus[0].score = 100;
stus[1] = new Program();
stus[1].name = "李成";
stus[1].score =99 ;
stus[2] = new Program();
stus[2].name = "江亦";
stus[2].score = 95;
Console.WriteLine("前三名学员的信息为:");
foreach(Program stu in stus)
{
stu.showInfo();
}
Console.ReadLine();
}
}
2.2.3 循环结构
上一节我们学习了数组的定义和初始化,那么如何提取数组元素的值呢?本节我们将通过不同的方式得到数组的元素值。回想一下,在java中使用过哪些循环结构?在java中,我们学习过while循环、do while循环、for循环,你还记得它们的语法和执行的过程吗?C#中也有这三种循环结构、而且同java中的执行过程完全一样。除此之外,我们还要介绍一种新的循环结构——foreach。首先回顾java中学习过的循环结构语法进行简单回顾,然后将学习foreach结构。
1.while 循环
while循环是先判断条件是否满足,如果条件成立再执行循环体。
语法
while(条件表达式)
{
//代码块
}
2.do-while 循环
do-while循环是先执行再判断条件,所以至少会执行一次循环体值的语句。
语法
do
{
//代码块
}while(条件表达式)
3.for 循环
for循环常常用在确认循环条件数量的情况。
语法
for(表达式1;表达式2;表达式3)
{
//代码块
}
foreach 循环
选择我们要认识的是foreach循环,例如、我们去超市买东西付款时候,要吧每一件物品都计价。each是每个的意思、foreach 循环结构用于遍历一个数据集合(目前只学习了数组)的每一项,需要设置一个标识符(变量)依次表示其中的每一项。在循环期间,也可以对各数组项执行指定操作。
语法
foreach(元素类型 元素变量名 in 数组)
{
//代码块
}
2.24 跳转语句
1.break 语句
除了在switch结构中可以使用break语句退出某个case语句外,也可以把它用于for、while、do-while、foreach循环结构。break语句将使程序跳出当前循环条件,并继续执行该循环后面的语句。
2.continue 语句
continue语句和break类似,它是出现在循环结构中,但continue语句的作用是退出当前循环的本次结构,并且进入下一次循环,而不是退出当前循环。
冒泡排序
2.3.1 冒泡排序的算法
生活中总会遇到一些排序问题,如考试的分数从大到小或小到大这就需要利用排序了。
//开始排序——使用冒泡拍讯
for(i=0;i<数组.Length-1;I++)
{
//将最大的元素交换到最后
for(j=0;j<数组.length-1-i;j++)
{
if(数组[j]>数组[j+1])
{
//交换元素
int temp = 数组[j];
数组[j]=数组[j+1];
数组[j+1]=temp;
}
}
}
使用属性升级MyBank
private访问修饰符
3.1 访问修饰符
在应用程序中,访问修饰符可以用来修饰类成员和方法,一此限定类成员的可访问级别,在java中已经使用过访问修饰符public(公共的),现在认识一个新的访问修饰符private(私有的)。
C#中访问修饰符
访问修饰符 | 访问权限 | 访问级别 |
---|---|---|
public | 不受任何限制 | 最高 |
private | 只有类的内部才可以使用 | 最低 |
this关键字
在Student类定义一个private成员变量_name,在SetName()方法的参数中也定义; 一个与之同名的变量_name。这是编译器会发现成员变量和方法的参数重名了。
此时,编译器无法分辨代码中出现的这两个_name哪个是成员变量,哪个是方法中的参数,我们可以借助this关键字来解决这个问题。
在面对对象的编程语言中,this关键字是指当前对象本身。通过this可以引用当前类的成员变量和方法。
3.2 用属性实现字段封装
1.C#的属性
在C#中,字段通常是私有的,如果要访问类中的字段,需要通过get和set访问器实现,这种结合了字段和方法的实现方式我们称之为属性。
语法
Private string _name;
public string Name;
{
get{return _name}
set{_name = value}
}
get访问器用来返回相应的私有字段的。
set访问器用来设置相应的私有字段的值。
2.属性的数据类型
定义类的一个属性时,属性数据类型必须和它访问的字段类型一致。
3.属性访问类型
属性除了可以约束数据访问外,还有以设置读,写属性来限定它的访问类型。属性访问类型有三种。
只读属性,只包含get访问器。
只写属性,只包含set访问器。
读写属性,包含get和set访问器。
深入C#的string类
4.1C#中的String类
字符串是应用程序中最常用的一种数据类型,C#中有一个专门处理字符串的类string,它位于System命名空间中。
4.1.1 常用的字符串处理方法
C#中提供了字符串处理方法。
常用字符串处理方法
方法 | 说明 |
---|---|
bool Equals(string value) | 比较一个字符串与另一个字符串value的值是否相等。若两者相等,则返回true;若不相等,返回false |
int Compare(string strA,string strB) | 比较两个字符串的大小关系,返回一个整数。若strA小于strB,则返回值小于0;若strA等于strB,则返回值为0;若strA大于strB,则返回值大于0 |
int IndexOf(string value) | 获取指定的value字符串在当前字符串中第一个匹配项的位置。如果找到了value,就返回它的位置;如果没找到,就返回-1 |
int LasIndexOf(string value) | 获得指定的字符串value在当前字符串中最后一个匹配项的位置。如果找到了value就返回它的位置;如果没找到,就返回-1 |
string Join(string sparator,string[] value) | 把字符串数组value中的每个字符串用指定的分割符separator连接,返回连接后的字符串 |
string[] Split(char sparator) | 用指定的分隔符separator分割字符串,返回分割后的字符串数组 |
string Substring(int startIndex,int length) | 从指定的位置startIndex开始检索长度为length的字符串 |
string ToLower() | 获得字符串的小写形式 |
strng ToUpper() | 获得字符串的大小形式 |
string Trim() | 去掉字符串前后两端多余的空格 |
类型转换
4.2简单的类型转换
1.隐式类型转换
对于任何数值类型A,只要其取值范围完全包含在类型B的取值范围内、也就是说,int型可以隐式转换为float型或double型,float型可以隐式转换为double型。
2.显示类型转换
与隐式类型转换相反,当要把取值范围大的类型转换为取值范围大的类型转换为取值范围小的类型时,就需要执行显示转换。
4.3 数值类型与字符串之间的转换
1.字符串转换为数值型
还记得如何从控制台接收整数的代码吗?
int.Parse(Console.readLine());
当要把字符串转换为数值类型时,可以调用不同的数值类型的Parse()方法(Parse的中文意思是解析)。例如,将字符串转换为整形的代码:
int.Parse(string);
将字符串转换为单精度浮点型的代码:
float.Parse(string);
将字符串转换为双精度浮点型的代码:
double.Parse(string);
注意,要转换的字符串必须是数字的有效表示形式,什么意思呢?
简单地讲就是表面上看起来是对应的数字,例如,可以把32转换为整数,因为它是由数字构成的,但不能把name转换为整数,因为它不是整数的有效表示形式。
2.数值类型转换为字符串
字符串可以转换为数值,那么怎样将数值类型的数据转换为字符串呢?同java一样,C#只要调用ToString()方法就可以了。例如,
int age=18;
string myage = age.ToString();
4.4使用Convert类进行转换
我们知道Parse()方法可以将字符串类型转换为数值类型,C#中还有一个更全能的类—Convert类,它可以在各种基本类型之间执行数据类型的互相转换。
常用Convert类的类型转换方法
方法 | 说明 |
---|---|
Convert.ToInt32() | 转换为整形(int型) |
Convert.ToSingle() | 转换为单精度浮点型(float型) |
Convert.ToDouble() | 转换为双精度浮点型(double型) |
Convert.ToString() | 转换为字符串类型(string型) |