C#语言入门

mac2026-10-01  5

第一章:第一个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#中的数据类型

常用数据类型JavaC#举例整型intint年龄浮点型floatfloat成绩双精度型doubledouble圆周率布尔型booleanbool是否是少数民族

其他引用类型: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

最新回复(0)