1.NET是什么?
.NET是C#的运行环境
2.C#是什么?
C#是一门编程语言,高级计算机语言。
3.C#文件的后缀是什么?.cs
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#的注释有哪些? 单行:// 多行: 块注释:/**/ 文档注释:///
折叠:#region #endregion
1.C#中的数据类型
常用数据类型JavaC#举例整型intint年龄浮点型floatfloat成绩双精度型doubledouble圆周率布尔型booleanbool是否是少数民族其他引用类型:string,class,array数组,集合
2.C#中的变量
语法:数据类型 变量;
命名规则:
组成:英文字母、数字、下划线_
开头:只能以字母或下划线,不能以数字开头
不能使用的:不能是C#中的关键字
变量名应该使用驼峰命名法,类名使用帕斯卡命名法。
3.C#中的常量
语法:const 数据类型 常量名称 =值;
//例如一周有7天 public const int dayMax =7;Java中的常量:
语法:final 数据类型 常量名称 =值;
4.何时使用常量?
用于在程序中一旦设定就不允许被修改的值,例如圆周率的值在整个程序范围内一般是不能随意修改的。
语法:
数据类型[] 数组名 = 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(注意大写!)
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中的类和对象那章。
步骤:
1.设置断点
程序调试时常用的快捷键如下:
F5:开始调试
F9:设置或取消断点
F10:单步执行
2.监视变量值
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])中的大于号换成小于号就行了。
三大特性:封装,继承,多态
1、封装:
将内部的具体实现隐藏
2、继承:子承父
3、多态:多种形态
4、封装的实现: ①、抽取类,抽取类的成员:属性,方法
②、访问修饰符
public :公开
只要你知道有这个对象,你就可以使用public成员
protected:受保护的
a、有这个对象;b、类授予你访问的权限
private:私有
当前类以外的都不能访问
internal:默认的
5.封装的好处:
▲避免使用非法数据赋值
▲保证数据的完整性
▲避免类内部发生修改时,导致整个程序的修改
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关键字可以区分局部变量和成员变量。
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
注意:在参数传递过程中,不管是基本/引用数据类型传递都是地址!!!
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
