第一章:第一个C#程序
一、.NET与C#
1.NET是什么?
.NET是C#的运行环境
2.C#是什么?
C#是一门编程语言,高级计算机语言。
3.C#文件的后缀是什么?.cs
二、第一个C#程序的创建
1.新建程序的步骤;
①启动VS工具(VS是编写C#的工具);
②新建项目;
③生成可执行文件;
④开始运行;
2.认识C#程序
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("你好世界!");
Console.ReadLine();
}
}
}
对于这段代码,你一定既熟悉又陌生。因为它跟Java程序有几分相似,但是又有不同的地方。
组成部分:
①namespace关键字
namespace是命名空间,它的作用类似于Java中的package(包)。
②using关键字
在Java中,如果需要导包的话应该使用关键字import,而在C#中,使用using关键字来引用其他命名空间,它的作用和Java中的import类似。
③class关键字
C#也是一种面向对象的语言,使用class关键字表示类。注意:在C#中,不要求类名必须与源文件的名称一样。
④Main方法
在C#中的Main方法有四种形式:
static void Main(String[] args){}
static void Main(){}
static int Main(String[] args){return 1;}
static int Main(){return 1;}
注意:在C#中,Main方法的Main一定要首字母大写!!!
⑤关键代码
输出:
Console.WriteLine(“你好世界!”); //从控制台输出内容
输入:
Console.ReadLine(); //从控制台输入
3.Java和C#对比:
组织代码的方式:C#使用命名空间(namespace),Java使用包(packa)。
引入命名空间或包的关键字:C#使用using,Java使用import。
程序入口:C#中的Main()有四种形式,Java的main()只有一种形式。
三、C#中的注释
C#的注释有哪些?
单行://
多行:
块注释:/**/
文档注释:///
折叠:#region
#endregion
四、C#中的变量和常量
1.C#中的数据类型
常用数据类型 | Java | C# | 举例 |
---|---|---|---|
整型 | int | int | 年龄 |
浮点型 | float | float | 成绩 |
双精度型 | double | double | 圆周率 |
布尔型 | boolean | bool | 是否是少数民族 |
其他引用类型:string,class,array数组,集合
2.C#中的变量
语法:数据类型 变量;
命名规则:
组成:英文字母、数字、下划线_
开头:只能以字母或下划线,不能以数字开头
不能使用的:不能是C#中的关键字
变量名应该使用驼峰命名法,类名使用帕斯卡命名法。
3.C#中的常量
语法:const 数据类型 常量名称 =值;
//例如一周有7天
public const int dayMax =7;
Java中的常量:
语法:final 数据类型 常量名称 =值;
4.何时使用常量?
用于在程序中一旦设定就不允许被修改的值,例如圆周率的值在整个程序范围内一般是不能随意修改的。
五、在C#中怎么样定义数组?
语法:
数据类型[] 数组名 = new 数据类型[长度];
数据类型[] 数组名 = { 值 };
数据类型[] 数组名 = new 数据类型[长度]{值}; //长度 = 值个数
int [] num =new int [3];
string [] name ={"张三","李四"};
int [] number =new int [5]{1,2,3,4,5};
Java定义数组和C#定义数组的区别
声明:在Java中,数据类型[] 数组名 数据类型 数组名[];
在C#中,数据类型[] 数组名
大小: 在Java中,new 数据类型[长度]; 在C#中,new 数据类型[长度];
初始化:new 数据类型[]{值}; new 数据类型[长度]{值}; //长度=值的个数
长度: 数组名.length 数组名.Length(注意大写!)
六、Console类
1.C#向控制台输出
语法:
方式一:Console.WriteLine( ); //换行
方式二:Console.Write( ); //不换行
方式三:Console.WriteLine(”格式字符串“,变量列表);
string course ="C#";
Console.WriteLine("我的课程名称{0}",course);
"我的课程名称{0}"就是格式字符串,{0}叫作占位符,从零开始。
2.C#从控制台输入
语法:Console.ReadLine();
该方法返回string类型,如果需要输入整型数据怎么办?接下来要进行转换了。
int age =int.Parse(Console.ReadLine());
int.Parse()方法的作用是把字符串转为整数。
七、类和对象
1.自定义方法
语法:[访问修饰符] 返回值类型 方法名(参数列表){//方法的主体}
①.访问修饰符
private:私有的
protected:受保护的
public:公开的
②.方法的返回值类型
返回值类型就是数据类型,如果返回值类型不为空,必须使用return;如果方法不返回任何值,需要使用void关键字。
③.方法名
每个自定义的方法都要有一个名称,方法名要求见名知意。
④.参数列表
调用方法时,可以向方法中传递参数,这里的参数称为形参,形参是抽象,是不存在的。
2.理解类的对象
C#中的类和对象跟Java中的类和对象一样,具体内容请看Java中的类和对象那章。
八、VS的调试
步骤:
1.设置断点
程序调试时常用的快捷键如下:
F5:开始调试
F9:设置或取消断点
F10:单步执行
2.监视变量值
第二章:C#语法快速热身
一、选择结构
1.if结构
语法:
①简单if结构:
if(条件表达式)
{
//代码块
}
②if-else结构
if(条件表达式)
{
//代码块1
}
else
{
//代码块2
}
③多重if结构
if(条件表达式)
{
//代码块1
}
else if(条件表达式)
{
//代码块2
}
else
④嵌套if结构
if(条件表达式)
{
if(条件表达式)
{
//代码块1
}
else
{
//代码块2
}
}
else
{
//代码块3
}
C#中的if结构和Java中的完全相同,就简单回顾一下语法吧。
注意:在C#中一个大括号占一行!!!
2.switch结构
语法:
java:
switch(表达式) {
case 常量1:
break; //可有可无
}
C#:
switch(表达式)
{
case 常量1:
//代码块
break; //必须有
}
注意:C#语言要求每个case和default语句中都必须有break语句,如果两个case中间没有其他语句,那么前一个case可以不包含break。
例如:
public void BankNameOutPut()
{
Console.WriteLine("请输入银行简称:");
string bank = Console.ReadLine().ToUpper();
//将输入的银行简称转换为大写字母
switch (bank)
{
case "ICBC":
Console.WriteLine("中国工商银行");
break;
case "CBC":
Console.WriteLine("中国建设银行");
break;
case "ABC":
Console.WriteLine("中国农业银行");
break;
default:
Console.WriteLine("输入银行简称错误");
break;
}
Console.ReadLine();
}
在Main入口调用BankNameOutPut() 方法,当输入ICBC时,则会出现“中国工商银行”,当输入CBC时,则会出现“中国建设银行”,以此类推。
二、循环结构
1.while循环
语法:
while(条件)
{
//代码块
}
2.do…while循环
do
{
//代码块
}while(条件表达式);
3.for循环
for(初始化; 条件判断;迭代)
{
//代码块
}
4.foreach循环
Java:
for(数据类型 变量名 : 数组){}
C#:
foreach(数据类型[根据数组的数据类型决定] 变量名 in 数组名)
{
//代码块
}
using System;
namespace ConsoleApp6
{
class Program
{
static void Main(string[] args)
{
int[] array = new int[5] { 0, 1, 2, 3, 4 };
//循环中将array的每个元素赋值给item
Console.WriteLine("数组array中{0}个元素的值是:", array.Length);
foreach (int item in array)
{
Console.Write(item+" ");
}
Console.WriteLine();
Console.ReadLine();
}
}
}
三、跳转语句
1.break:将使程序跳出当前循环结构,并继续执行该循环后面的语句。
(跳出本层循环继续执行外层循环的语句)
2.continue:退出当前循环结构的本次循环,并开始执行当前循环结构的下一次循环。
(跳出本次循环,开始执行下次循环)
四、冒泡排序
1、两两相邻比较
2、不满足排序规则:交换位置
//开始排序--使用冒泡排序,使用双重循环
for (i = 0; i < scores.Length-1; i++)
{
for (j = 0; j < scores.Length-1-i; j++)
{
if (scores[j]>scores[j+1])
{
//交换元素
temp = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = temp;
}
}
}
口诀:
▲ N个数字来排队,两两相比小靠前。
▲外层循环N-1,内层循坏N-1-i。
▲如果要降序排序,只要把(scores[j]>scores[j+1])中的大于号换成小于号就行了。
第三章:使用属性升级MyBank
一、面向对象编程,OOP
三大特性:封装,继承,多态
1、封装:
将内部的具体实现隐藏
2、继承:子承父
3、多态:多种形态
4、封装的实现:
①、抽取类,抽取类的成员:属性,方法
②、访问修饰符
public :公开
只要你知道有这个对象,你就可以使用public成员
protected:受保护的
a、有这个对象;b、类授予你访问的权限
private:私有
当前类以外的都不能访问
internal:默认的
5.封装的好处:
▲避免使用非法数据赋值
▲保证数据的完整性
▲避免类内部发生修改时,导致整个程序的修改
二、this关键字
this:表示当前类的对象引用
可以调用当前类的成员变量和方法
注意:this不能在静态成员中使用
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp1
{
class Student
{
private string _name="灰太狼"; //姓名
public int _age=19; //年龄
public string _cardID = "110882198110252476"; //身份证号
//初始化学员的姓名
public void SetName(string _name)
{
this._name = _name;
}
//输出学员的姓名、年龄
public void Say()
{
Console.WriteLine("大家好!我叫{0},今年{1}岁。", this._name, this._age);
}
}
}
在这个示例中,该方法的参数_name和类成员变量_name名称相同,通过this关键字可以区分局部变量和成员变量。
三、C#属性
1.用方法保证数据的安全
Student stu = new Student();
stu._age = -2; //年龄
stu._cardId = "123456"; //身份证号码
这样赋值不会报错,但是年龄为-2和身份证号码为123456显然不符合逻辑,那么如何保证程序数据的安全性能?
class Student
{
private string _name;
private int _age;
public string _cardID;
public int GetAge()
{
return this._age;
}
///<summary>
///设置年龄并有相关判断
///</summary>
///<param name="age">设置年龄</param>
public void SetAge(int age)
{
if (age < 0 || age > 100)
{
this._age = 19;
}
else
{
this._age = age;
}
}
static void Main(string[] args)
{
Student student = new Student();
student.SetAge(-10);
Console.WriteLine("年龄是:{0}",student.GetAge());
student.SetAge(25);
Console.WriteLine("年龄是:{0}", student.GetAge());
Console.ReadLine();
}
}
运行结果:年龄是:19
年龄是:25
当把SetAge()方法参数设置为-10时,结果为19。这是因为在SetAge()方法中进行了判断。
虽然提出的问题被解决了,但是要写两个公用方法,微软提出了更加优化的解决方案-------属性。
2.用属性实现字段封装
①C#中类的成员
字段:私有化
方法
属性:get/set
②语法:
字段一般以下划线开头,属性则去掉下划线并且首字母要大写。
private string _name;
public string Name
{
get{ return _name; }
set{ _name = value; }
}
class Student
{
private string _name ="灰太狼";
private int _age;
public string _cardID;
public int Age
{
get
{
return _age;
}
set
{
if (value < 0 || value > 100)
{
_age = 19;
}
else
{
_age = value;
}
}
}
}
③属性的数据类型:定义类中的一个属性时,属性的数据类型必须与它所访问的字段类型一致。
④属性的访问类型:
只读属性:只包含get访问器
只写属性:只包含set访问器
读写属性:包含get和set访问器
⑤对象初始化器:
User user = new User(){属性=值,属性=值…};
四、值传递和引用传递
1.值传递
①基本数据类型:
形参所做修改不会影响实参
②引用数据类型:
形参对具体值的修改会影响实参
(如果形参修改了指向的地址,那么接下来形参做的任何一项改变都不会影响实参)
2.引用传递(地址传递):
①基本数据:形参所做修改会影响实参
②引用数据:在实参和形参前面多了一个关键字:ref
注意:在参数传递过程中,不管是基本/引用数据类型传递都是地址!!!
第四章:深入C#的String类
一、常用的字符串处理方法
1.属性:
Length:获取字符串的长度
2.方法
static Concat():连接
Equals():比较值(堆)
staitc Format():格式化代码
{数字}:占位符,从0开始
static IsNullOrEmpty(String):既可以判断空对象的字符串,又可以判断长度为0的字符串
static String.Join(连接符号, 要被连接的数组);
Split(char):以指定字符串拆分
IndexOf(string):从前往后找,返回int类型
LastIndexOf(string):从后往前找,返回int类型
Remove(开始下标):从开始下标到length-1的内容都被删除
Remove(开始下标,长度);
Replace(String old, String newStr):替换
Substring(int 开始位置):截取
Substring(int 开始位置, int 截取的长度):截取
ToLower():转换为小写
toUpper():转换为大写
Trim():去掉前后空格
TrimStart():去掉前面的空格
TrimEnd():去掉后面的空格
注意:String类中有多个方法,没啥技巧多去记多去练习。
二、类型转换
1.隐式类型转换
将取值范围小的数值类型转换为取值范围大的数值类型,相当于Java中的强制转换。
2.显示类型转换
将取值范围大的数值类型转换为取值范围小的数值类型,相当于Java中的自动转换。
3.Parse()方法:将字符串转换为其他类型,用法xxx.Parse(string)。
4.Convert类:任何基本类型之间的相互转换。
常用Convert类的类型转换方法:
方法 | 说明 |
---|---|
Convert.ToInt32() | 转换为整型 |
Convert.ToSingle() | 转换为单精度浮点型(float型) |
Convert.ToDouble() | 转换为双精度浮点型(double型) |
Convert.ToString() | 转换为字符串类型(string型) |
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
double myDouble = 85.63; //原始数值
int myInt; //转换后的整型
float myFloat; //转换后的浮点型
string myString;
Console.WriteLine("原始数值为double类型:{0}",myDouble);
//开始类型转换
myInt = Convert.ToInt32(myDouble);
myFloat = Convert.ToSingle(myDouble);
myString = Convert.ToString(myDouble);
//输出类型转换后的数据
Console.WriteLine("转换后:");
Console.WriteLine("int \t float \t string");
Console.WriteLine("{0}\t {1}\t {2}",myInt,myFloat,myString);
Console.ReadLine();
}
}
}
运行结果:
原初始数值为:double类型:85.63
转换后:
int float string
86 85.63 85.63