当前位置: 移动技术网 > IT编程>开发语言>.net > 我的ASP.NET学习笔记010C#语言基础

我的ASP.NET学习笔记010C#语言基础

2018年08月07日  | 移动技术网IT编程  | 我要评论

平顶山市地图,唐伯虎的桃花诗,黑龙江省人事厅

cSharp_1_概述

名词描述

C#

是一门语言,语法与javascriptCC++java相近,这些语言都是比C语言的语系中发展而来。

 

.net framework

(Framework是框架的意思)asp.net软件的编译和运行平台,计算机必须安装了这个软件才可以运行我们编写的C#应用程序。不过windows7.0以后的操作系统都要自动安装了这个软件。

 

mono是由第三方团队开发的让C#程序代码运行于多平台的一个框架。相当于另一个.net framework

 

 

 

新建一个软件项目

.net中程序软件是项目的形式的存在的,一个项目就是包含软件中所有的代码、图片、样式、等等所有资源文件的集合。

 

新建一个C#控制台应用程序项目

“文件”菜单 à 新建 à 项目 à 在弹出的“新建项目”窗口中依次选择 à visual C# à 控制台应用程序 à 添加项目名称 à 选择项目的存储位置 à 选择建立新的解决方案à 还是要添加到当前已经打开的解决方案中

 

完成“控制台应用程序”的创建之后。就可以在“解决方案”面板中看到当前项目的所有文件了。

 

Mian主函数

 

其中,program.cs文件中的main主函数就是程序的入口函数,包括其中的代码,会被自动执行,而写在mian主函数之外的代码则没不会被执行,除非在main中对其进行调用。

 

Main注意 M 大写

修饰为static 

返回值为void或int 

参数为字符串数组(C#中可选) 

应用程序开始执行的地方

 

 

 

扩展名.cs

C#程序代码文件的扩展名就是.cs

 

编译执行源代码 

F5:启动调试 

Ctrl+F5:开始执行(不调试) 

 

控制台输入输出语句

输出语句

控制台的相关操作都通过Console这个类完成,包括输入与输出操作 

常用输出方法介绍 

Console.Write(…)不换行输出 

Console.WriteLine(…)换行输出,在输出内容的末尾加一个换行符 

 

常用参数使用语法 

Console.WriteLine("您传入的第一个参数为:"+ss);

Console.WriteLine("您传入的第二个参数为:{0}", args[1]);

 

 

占位符

Console.WriteLine中的占位符写法{0}{1},其概念就好像是在字符串中留一个填空题中的空,由后面的参数来填。

控制台输入

程序一般有零到多个输入,有些输入是执行时由用户输入的 

使用Console.ReadXXX()系列的方法可以完成接收用户输入的操作 

常用方法 

Console.Read():一次返回一个字符(ASCII码) 

Console.ReadLine():返回用户在控制台输入的一行字符串,按回车结束。

注释

单行注释  //

多行注释  /*    */

 

通过快捷键来注释

选中需要注释的代码 à Ctrl+k Ctrl+c

通过快捷键来取消注释

选中需要取消注释的代码 à Ctrl+k Ctrl+u

 

练习:

1、在vs中创建一个控制台应用程序,用户手动输入男方姓名,输入女方姓名,输出信息“恭喜XX先生和XX女士,百年好和、白头偕老”。

 

2、在vs中创建一个控制台应用程序,模拟一个atm取款的功能,假设帐户原本有一千元,让用户输入一个数字,原帐户金额减去取款金额,将还剩多少钱显示出来。( C#中的字符串转整数 int.Parse(字符串)、声明整数类型是 int i = 1 ; )

 

 

C#中的数据类型

C#是一门强类型的编程语言,而javascript是一门弱类型的编程语言。

强类型语言是指该语言中的变量必须严格遵循类型的限制。就是说一个变量被声明之后,永远只能存储指定类型的数据。

 

C#中的整数类型

类型标识符

描述

可表示的数值范围

sbyte

8位有符号整数

-128 ~ +127

Byte字节

(bit位代表一个二进数)

8位无符号整数

0 ~ 255

Short短整型

16位有符号整数

-32768 ~ +32767

ushort

16位无符号整数

0 ~ 65535

int 整型

32位有符号整数

-2147483648 ~ +2147483647

uint

32位无符号整数

0 ~ 4294967295

long

64位有符号整数

-9223372036854775805 ~ +9223372036854775807

ulong

64位无符号整数

0 ~ 264-1

Char有时可以被当做整型来看待。

 

C#中变量的定义

C#中声明一个变量必须要同时声明这个变量的类型。

数据类型 变量名=变量值

比如:int i =10;

 

浮点类型

用于存储实数,浮点的数据类型包含两种:

单精度浮点型(float)

float类型是32

取值范围:在+ 1.5×10-45 ~ 3.4×1038之间,精度为7位数。

双精度浮点型(double)

double类型是64位宽。

取值范围:为+5.0×10-324 ~ 1.7×10308之间,精度为15~16位数

 

注意:floatdouble不适合用于进行高精度且频繁的运算,否则在处理小数的位数限制的最后一位时会自动的四舍五入,造成精度的损失。

 

小数类型(decimal

16个字节(128),主要为了满足高精度的金融、科学运算等领域。

小数类型数据的取值范围和精度如下:

     取值范围在+ 1.0×10-28 ~ 7.9×1028之间,精度为29位数。

 

数值类型的表示方法

C#中如果只写一个整数数字而不带代表的类型标识,那么这个整数数字会被自动自定为int类型。如果写一个带有小数的实数数字而不带代表的类型标识,那么这个实数数字会被自动自定为double类型。

可以用如下代码来证明:

Console.WriteLine((12).GetType().ToString());

Console.WriteLine((12.01).GetType().ToString());

 

 

通过类型标识符来定义数值的类型

123f 代表float类型数值123.0

      518u                 代表uint类型的数值518

      36897123ul      代表ulong类型的数值36897123

      22.1m               代表decimal类型的数值22.1

      12.68                代表double类型的数值12.68

      36              代表int类型的数值36

 

字符类型

在计算机中,一切数据最终都会被转换为二进制,字符也不例外,但是二进制只能用来存储数字,因此Char类型中存储的是一个字符在unicode码表中的位置编号。

字符类型的定义:

char 变量名 = ‘单个字符’ ;

注意:

1、 char类型的值必须用单引号括起来。

2、 单引号内的有效字符必须且只能是一个。

3、 值不能是单引号或反斜杠。

 

C#中的转义字符

 

 
   

 

Bool布尔类型

布尔类型只有两个值truefalse

bool c = 5>6;

c = true ;

Console.WriteLine(c);

 

 

GetType()方法

用于获取一个变量或数值的类型,示例:

float i = 100f;

Console.WriteLine(i.GetType().ToString());

 

Int16代表short

Int32代表int

Int64代表long

Singel代表flaot

 

引用类型

String字符串类型

用于保存字符和文本数据。String类型的值是包含在一对双引号之间的。

 

c#string 的本质是一个char类型的数组。

String可以直接被当成char类型的数组来用。

string i = "This is 665";

Console.WriteLine(i[1]);

 

Char类型的数组同样可以被转换为字符串

char[] cArr = {'H','e','l','l','o' };

string cStr = new string(cArr);

Console.WriteLine(cStr);

 

逐字字符串@

逐字字符串@用以避免书写转义字符串,将字符串中的特殊符号当成字符来对待。

string cStr = @"this is \n 665";

Console.WriteLine(cStr);

 

其写法就是在字符串前面加上一个@符号。

 

Object类型

C#中所有的对象、变量、类型,我们都可以称之为是object的子类。

 

对于任何一个变量、对象、类型,我们都可以将其存储在object类型的变量之中。

 

object obj = "this is \n 665";

obj = 123;

obj = true;

Console.WriteLine(obj);

 

 

练习:

编写程序实现下图效果:

使用合适的数据类型定义相关变量(255以下用byte、小数是float、身份证qq号可以用string

输出输入的结果

 
   

 

 

C#中的类型转换

数据类型在一定条件下是可以相互转换的。

C#允许使用两种转换的方式:隐式转换和显式转换。

隐式转换

隐式转换是自动完成的、不需要用户手动声明就可以完成的转换过程。

这种转换一般是“向上转换”,即由占存储空间小的数据类型向占存储空间大的数据类型转换。

示例:

byte bNum = 255;

short sNum = bNum;

int iNum = sNum;

long lNum = iNum;

float fNum = lNum;

double dNum = fNum;

string strNum = ""+dNum; //用字符串与数值相加的时候,数值类型会自动的被隐式转换为string

Console.WriteLine(strNum);

 

C#中变量的声明

变量只是一个容器,用于存储具体的数值,并且这个容器里的数值是可以变的。

声明变量的过程

数据类型 变量名;

比如:int iNum;

变量名 = 表达式;

比如:iNum = 5;

当然多数情况下我们将两步合为一步:

int iNum = 5;

同时定义多个同类型的变量

比如:

int a, b, c;

同时定义并赋值多个同类型的变量

比如:

int a=1, b=2, c=3;

 

显式类型转换

就是指必须由用户手动声明的转换过程。

强制类型转换

格式:  (类型名称)表达式

将表达式的值的类型转换为类型名称所标识的类型。

 

示例:int i = (int)’a’;

注意:在强制类型转换的过程中有可能对原本的数值造损失。

decimal dd = 12.3456m;

int iNum = (int)dd;

Console.WriteLine(iNum);

 

 

数据类型之间的转换

toString()

toString()将其他类型的数据转换为字符串。

几乎所有能够用文字描述的数据都可以转换为字符串。

转换格式:

变量或值.toString();

示例:

true.ToString()

intNum.ToString()

 

XXX.Parse(字符串)

将字符串转换为其他类型。XXX代表类型名称,比如doubleintbool

格式:

XXX.Parse(字符串)

示例:

string strNum = "123";

short sNum = short.Parse(strNum);

int iNum = int.Parse((123).ToString());

float fNum = float.Parse(strNum);

double ddNum = double.Parse(strNum);

decimal dcNum = decimal.Parse(strNum);

long lNum = long.Parse(strNum);

 

XXX.TryParse(字符串)

将字符串转换为其他类型的数体,在转换的过程中需要一个已赋值的临时变量,如果转换成功则临时变量中存放的就是转换之后的值,否则临时变量中保持原值不变。XXX代表类型名称,比如doubleintbool

格式:

XXX.TryParse(字符串,out 临时变量)

示例:

string strNum = "123";

decimal bTemp = 0;

decimal.TryParse(strNum, out bTemp);

Console.WriteLine(bTemp);

 

 

System.Convert类型转换工具

它为数据类型转换提供了一多种方法,可以将一个基本数据类型转换为另一种基本数据类型。

 

Convert的类型转换方法有包含:

ToBooleanToByteToCharToDateTimeToDecimalToDoubleToInt16ToUint32ToUint64等等。

示例:

char c = 'B';

int intNum = Convert.ToInt32(c);

Console.WriteLine(intNum);

char a = Convert.ToChar(intNum);

Console.WriteLine(a);

string strNum = intNum + "5";

short sNum = Convert.ToInt16(strNum);

Console.WriteLine(sNum);

float fNum = Convert.ToSingle(sNum);

Console.WriteLine(fNum);

 

 

as类型转换

通常as 用于引用类型之间的转换,示例:

object obj = "今天星期五";

string sTime = obj as string;

Console.WriteLine(sTime);

 

is关键字:判断变量或数值的类型

示例:

int sTime = 12345;

if (sTime is int)

Console.WriteLine("这是int");

else 

Console.WriteLine("不知道是什么");

 

 

练习:

1、 定义一个float类型的变量,并存入值123.31。(注意float类型数值的表示方法)

2、 定义一个char类型的变量cc,并存入字符c,将cc进行没类型转换并存入int类型变量i中,将i转换为字符串,并与字符串”51”连接并将结果存入string类型变量ss中,将ss转换为double类型并显示。

3、 将字符串”3.14”char类型数值”7”都转换为double类型并相加。

4、 将字符串”15784456” convert转换为ushort类型,并在控制台中显示出其类型。

5、 从字符串”35624”,取出第三个数字,并显示出来。

 

 

运算符与表达式

C#中的变量

变量的命名规则:

1)、由字母、数字或下划线"_"组成。(中文也可以被看作是字母)

         2)、必须由字母或下划线"_"开头,不能以数字开头

        3)、不能是c#中的关键字 如:int、string、bool、Main、class等

        4)、区分大小写  如:小写的a    大写的A 是两个变量

 

命名技巧:

1、驼峰命名法:当一个变量或函数、方法、类名由多个单词构成时,将每个单词的首字母大写,这我们就可以快速的区分单词之间的间隔。

 

2、在变量名的前面,我们可以用3个字母来表示变量的类型,比如:intflt(float)str(string)dcm(decimal)dat(dateTime)

 

3、接口一般以大写字母I 开头,bool类型一般以is开头。

 

位运算符

将十进制数字转换为二进制之后,再通过与、或、非等逻辑运算,对每个位上的二进制数字进行比较。

按位与&

示例:

int i = 11 & 7;

相当于:

1011

  & 0111

------------

0011

其结果为二进制的11,也就是十进制3

按位或|

示例:

int i = 11 | 7;

相当于:

1011

  I 0111

------------

1111

其结果为二进制的1111,也就是十进制15

位相等^

示例:

int i = 11 ^ 7;

相当于:

1011

  ^ 0111

------------

1100

其结果为二进制的1100,也就是十进制12

 

按位取反~

只操作一个数字,将该数字中为1的位变成0,为0的位变成 1

 

移位运算符

就是对二进制数,进行乘以10或除以10的操作。相当于给数字乘以十进制的2

int i = 11 <<1;

结果为22

 

三元运算符

由一个逻辑表达式来控制,逻辑表达式为true时返回第一个值,为false时返回第二个值。

格式:   逻辑表达式 ? 第一个值 : 第二个值 ;

示例:

string strResult = (11 <1)?"成立":"不成立";

 

 

运算符的优先级

1、括号:()、[]

2、一元运算符:!、+(正)、-(负)、++、--

3、乘除:*、/、%

4、加减:+(加)、-(减)

5、位移运算符:<<、>>

6、关系运算符:<><=>===、!=

7、位运算符:&  |  ^

8、逻辑运算符:&&|| (先运算逻辑与,再运算逻辑或)

9、三元运算符:?:

10、赋值运算:=、+=、-=、*=、/=、%=  (&=、|=、^=、~=) 

 

关于除法的说明

运算结果的类型和参与运算的类型中最高的类型一致,影响最大的是除法,整数除以整数结果还是整数,例如10/3的结果是3,而不是3.333 。所以必须要先将两个数字转换为浮点或decimal类型,再相除。

 

表达式的概念

就是用运算符或者方法将变量连接起来进行运算,终得到一个确定的结果的运算式。

 

条件判断语句

if

switch单值判断

示例:

string strInput=Console.ReadLine();

switch (strInput)

{

case "a":

Console.WriteLine("a级");

break;

case "b":

Console.WriteLine("b级");

break;

default: //当上面所有的条件都不满足时执行这里

Console.WriteLine("XXXXXX");

break;

 

注意事项:

1

控制表达式的数据类型可以是sbyte、byte、short、uint、long、 

ulong、char、string或枚举类型(后两种类型我们随后会讲到) 

2

每个case标签中的常量表达式必须属于或能隐式转换为控制表达式的类型 

3

如果有两个或者两个以上case标签中的常量表达式值相同,编译时将会报错 

4

switch语句中最多只能有一个default标签 

5

要求每个标签项后使用break语句或跳转语句goto(稍后将会讲到)

 

练习:

一、 请编写一个程序实现:输入一个长方形的长和宽,输出其长方形的面积

二、 输入一个华氏温度,要求输出摄氏温度;公式为:C=5/9(F-32)C表示摄氏温度,F表示华氏温度

三、 编写程序求圆的周长和面积,要求根据输入的圆的半径计算出圆的周长和面积(c:周长,s:面积,r:半径,π=3.14)

公式:c=2πr;  s=πr2

四、 编写程序求长方体的体积和表面积,要求根据输入的长方体长、宽、高计算出长方体的体积和表面积(L:长,W:宽,H:高,V:体积,S:表面积)

公式:v=l*w*h;   s=2(l*w+w*h+h*l);

五、 判断输入的年份是否为闰年,只需要满足下面条件之一即为闰年

a) 能被4整除,且不能被100整除

b) 能被400整除

 

1.编写小程序实现任意输入两个数,判断其大小并输出较大数!

2.编写小程序实现任意输入两个两位以上的整数,找出最后一位并且判断大小,输出判断结果!

3.编写小程序实现任意输入两个整数,第一个数要求是两位以上的整数,找出第一个数末尾那位数,用它除以第二个数,输出运算结果!

4.输出3的前面一个数字和后面一个数字!实际上就是将char类型的字符3转换为int类型,加一或减一之后再转回char类型。

5.编写小程序实现任意输入两个数,判断其大小;将大的一个数和10取模,将取摸的结果输出!

6.编写小程序实现任意输入两个数,判断其是否相等,如果相等,就输出“相等”,否则输出“不相等”!

7.编写小程序实现输入一个五位数,分别取出个位上的数、十位上的数、百位上的数、千位上的数、万位上的数,分别输出这五个数!

8.(思考题)任意输入一个三位整数,并且分别取出个位上的数,十位上的数,百位上的数;如果这三个数都不等于4并且取出的三位数之和等于8,则输出“恭喜你,中了八毛钱!”,如果不等8,则找出这三个数种最大的一个数,输出那个最大数和“下次继续努力吧!”这句活!

 

1.编写小程序实现任意输入两个数,求两个数的加、减、乘、除,并且分别输出结果。

2.编写小程序实现任意输入一个整数,输出该数字的最后一位。

3.编写小程序实现任意输入五个人的年龄,并求出平均年龄,并且输出。

4.编写小程序实现一种商品(数量,单价任意输入),输出总价.

5.在第四题的基础上实现三种商品的总价计算,输出应付多少钱。

 

1、使用三元操作符求三数的最大值。

2、使用三元操作符求三数的最小值。

3、输入一个四位数,分别求出个位,十位,百位,千位。

 

 

 

一、 输入一个五位以内的数字,输出该数字是几位数

二、 输入三条边,判断给定的三条边是否能组成三角形,如果能,再判断是等边三角形、等腰三角形还是普通三角形 

三、 输入5个数字,判断这5个数字是否存在重复的数字,如果存在则输出yes,否则输出no  

四、 编写一个小程序判断输入的正整数是否既是5又是7的整倍数.若是,则输出yes,否则输出no。 

五、 编写一个小程序,有一函数如下 

 

输入X 的值,输出对应Y 的值.

六、(思考题)编写一个小程序实现:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一: 

  1. 能同时被3,5,7整除; 
  2. 能被其中两个数整除(要指出那两个数);
  3. 能被其中一个数整除(指出那一个); 
  4. 不能被3,5,7任一个整除。

 

 

1、输入一个时间(整数),时间在6~10点之间输出“上午好”,在11~13点之间输出  “中午好”,在14~18之间输出“下午好”,其他情况输出“休息时间”。

2、使用IF语句,判断四数的最大值 。

3、从键盘输入两个数,然后输入一个运算符号,使用if语句和switch语句判断输入的运算符号是"+-*/%"中的哪一个,然后对输入的两个数进行相应的计算。

4、判断任意年份是不是闰年。(条件:能被4整除却不能被100整除或者能被400整除的年份是闰年)

 

 

第一题:

有一个函数:

y = x         (x<1)

y = 2x-1       (1<=x<10)

y = 3x-1       (x>=10)

写一程序,输入x,输出y值。

 

第二题:

3个整数abc,由键盘输入,输出其中最小的数。

要求:用if语句编写程序。

 

第三题:

企业发放的奖金根据利润提成。利润I小于或等于10万元的,奖金可提成10%;利润高于10万元,低于20万元(100000<I<=200000)时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%200000<I<=400000时,低于20万的部分仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I<=600000时,高于40万的部分按3%提成;600000<I<=1000000时,高于60万的部分按1.5%提成;I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。

要求:用ifswitch语句编写程序

 

第四题:

实现一个简单的四则运算计算器。

要求:参与运算的两个数值和运算的类型均从控制台输入,顺序为:第一个操作数、第二个操作数、运算类型;用switch语句编写程序。

 

 

循环与数组

关于VS的一些操作说明

运行

F5 调试 à 启动调用

Ctrl + F5: 调试 à 开始执行(不调试)

调试

断点

我们启动调试的时候,程序的执行过程就会处于VS的控制和监督之下的,此时我们就可以用多种方式来观察的程序的运行状态。

 

所谓断点,就是让程序在执行到某行代码的时候暂停,让我们可以看到程序的状态。

F11逐语句执行

让程序一条一条的执行。

监视

在程序进入调试状态之后,会显示局部变量和监视窗口,在这些窗口中我们可以跟踪程序中出现的变量和对象的变化。

比如在监视窗口中,我们可以指定众多变量中需要监视的那个变量,并且可以对这个变量进行运算,或调用其属性与方法。

 

熟练的使用调试工具,能够极大的提高我们在编程时解决Bug的能力。

 

VS中的项目的管理

一个项目的构成

查看一个项目所包含的所有文件:

通过右击项目名称 à windows资源管理器中打开文件夹 à 就可以看到这个项目的文件了

 

其中:

文件:解决方案名称.sln 解决方案名称.suo 就是我们的解决方案文件,我们可以把它理解为是项目中所有项目和文件的一个目录清单。通过双击打开这个文件,我们就可以在VS中打开整个解决方案及软件项目。

 

解决方案中可以包含多个软件项目。每多包含一个项目,sln文件所在文件夹中就会多一个子目录

 

文件:项目名称.csproj c sharp project)就是有指C#所编写的软件项目。

 

扩展名为cs的文件,就是我们所编写的c#类文件。

 

目录bin:用户存放用户编写的代码运行之后,编译的结果,也就是exe可执行文件与dll动态链接库就放在此处。

对于控制台应用程序和winform桌面应用程序来说,这个文件夹复制到其他地方里面的exe文件也是可以直接运行的。

 

目录obj:用于存放引用的类库文件,不需要用户手动去维护它。

目录properties :用于存放当前程序集的配置参数和信息。

 

在一个解决方案中创建多个项目

打开当前项目 à  vs的“文件”菜单 à 添加 à 新建项目

 

启动项

在一个解决方案中允许包含多个项目。但一次只能执行一个项目。因此如果我们需要在解决方案中指定默认运行某一个项目的话,需要将这个项目设为启动项:

在项目名称右键菜单à设为启动项

 

运行非“启动项”的项目

在项目名称右键菜单 à 调试 à 启动新实例

在项目名称右键菜单 à 调试 à 进入并单步执行新实例(一开始就让程序一条一条的逐语句执行)

 

行号

显示行号:工具菜单 à 选项 à 文本编辑器 à 所有语句 à 打上“行号”前的对勾

 

选择一行代码:单击行号。

选择多行代码:在行号上拖动鼠标。

 

变量的重命名

 

Ctrl + r + r

改变指定变量位于多处的变量名

 

关于数据类型的补充说明

关于实数的运算

decimal deNum = 1.0m / 7.0m;

double dbNum = 1.0 / 7.0;

float fltNum = 1.0f / 7.0f;

Console.WriteLine(deNum);

Console.WriteLine(dbNum);

Console.WriteLine(fltNum);

此例中可以看出三种精度的实数运算中的差异。

注意:整形除以整形还是整数,即使你将结果放入小数类型中。

 

 

变量的作用域

在方法、if判断、for循环等范围内定义的变量,只能在其所定义的大括号{}内部起作用,超出范围之后就无法再调用了。

 

我甚至可以用 { } 制造一个单纯的作用域。

{

int num = 5;

}

 

 

循环

While循环

do while循环

至少会被执行一次

do

{

Console.WriteLine("这是一个循环");

string ss = Console.ReadLine();

if (ss == "stop")

i = 2;

} while (i == 1);

 

for循环

int ii = 0;

for (int i = 1; i <= 100; i++)

{

ii += i;

}

Console.WriteLine(ii);

 

for循环的简略写法

简略写法下for循环可以直接被当成while来使用

int i = 0;

for (; i < 10; )

{

i++;

Console.WriteLine(i);

}

 

这个for循环中我们省略了“循环变量的定义”与“步长计算的部分”。

同时使用多个循环变量

for (int i =0, j=3 ; i < 10 || j<30 ; i++,j+=3 )

{

Console.WriteLine("当前i的值是{0}  j的值是{1}",i,j);

}

 

其中,ij

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网