有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 11657|回复: 91
收起左侧

简单易懂的现代魔法:C#编程教程(二) 简单C#语法

[复制链接]

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
发表于 2012-4-4 18:24:36 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 丨端木丶荒冬 于 2012-4-11 22:54 编辑

其他教程地址: 读代码,学C语言 活动公告
                         传统教程导航帖

目录:               简单易懂的现代魔法:C#编程教程(一) C#与.Net与VS
                         简单易懂的现代魔法:C#编程教程(二) 简单C#语法
                        简单易懂的现代魔法:C#编程教程(三)


                                                           简单易懂的现代魔法:C#编程教程()
                                                   简单C#语法

上个帖子中为大家介绍了C#的基本知识,和VS2010的使用方法,并且我们就创建出了一个非常简单的小程序,

它只能弹出一个对话框.但是请不要小看它,它已经具备一个应用程序的基本框架了.

那么怎么样创建一个更复杂的程序呢?换句话说,我们怎么创建一个更绚丽的魔法世界呢?

很简单,如果看完这个系列的教程,我相信你就能创建一个实用的程序了,计算器,日历,文本处理器,甚至是一个简单的游戏.

先说一下整体的安排

在接下来的教程中,我们会以制作一个简单的Galgame程序为线索,讲解C#图形编程的相关知识.

下面我们列出我们将会接触到的内容:

1. 显示图片

2. 更换图片

3. 显示不同文字

4. 显示不同的界面

5. 接受鼠标和键盘的输入

6. 实现不同按钮相应的功能

7. 播放音频

8. 弹出不同的窗口(如读取存档,设置等等)


上面是我们要学习到的知识(相对于一个Galgame来说).相信你肯定会对其中的一项或几项感兴趣.

要学习以上的知识,首先你必须拥有最基本的编程知识,通俗的说就是编程的语法.

下面我就会简单的介绍下这些基本知识.也许会有点枯燥,但是却是很重要的一部分.

(如果你在看这篇帖子的时候,感觉到无聊并有导致你对编程失去兴趣的可能,就跳过这篇吧,只要记住在后面的帖子中有看不懂的地方,就来这篇帖子相应的地方看看)



变量与类型
变量,就是字面上的意思,在程序运行中可以变化的量.反之不能变化就是常量.

这里的变化指的是可不可以发生变化,不是会不会发生变化,这点要注意.

常量倒是用的不多.以后就不提常量了,因为除了可不可以变化外,它和变量基本没区别.

每一个变量都必须规定成一种类型的变量.类型有很多种,常用的例如,int,double,string,bool等等都是类型.

在使用一个变量,我们必须先定义,定义变量的语法如下:

            int a;
            double b;
            string c;
            bool d;
            int[] e;

前面是变量的类型,后面是变量名.变量名就是变量的名字.为了区分不同的变量,他们就必须有不同的名字.

而且取变量名有一定的规则:只能由字母,数字,汉字,下划线_组成,且数字不能放在最前面,且不能用C#的关键字.

定义了变量后我们就能对他进行操作.例如:

                             a=2;
                             b=2.222222;
                             c=”简单易懂的现代魔法”;
                             d=true;
                             e={1,2,3,4,5}
                             a=a+b;
                             b=b/2*a+e[2];
                             c+=”C#编程;

这些都是通过运算符号来操作变量的值.

相信这些大家都能理解,这里我只做简单的讲解,到后面用到的时候我会仔细的说明.

其中可能对[]有些不了解,他是数组的意思,int[]表示一个里面元素是整数的数组,数组一系列相同类型变量的集合.

访问数组中变量的时候用数组名[来访问,其中下标从0开始,如e[0] 表示上面的整数数组e第一个元素.



语句

C#里面有以下5种语句:

控制语句,函数调用语句,表达式语句,空语句,复合语句。
先说控制语句,控制语句是用来控制程序流程的语句,分为条件,循环,分支3种.


条件语句: if语句,语法如下

                      if(表达式语句)
                            语句1;
                      else
                             语句2;

条件语句通过判断括号里面表达式语句的真假值来决定执行哪一个语句,如果为执行语句1,如果为执行语句2.

其中else 语句2 并不是必须有的,可以省略,表示如果表达式是假的就什么都不做.

表达式语句通常是由运算符和变量,数字,括号组成,

例如a+b,a*(b+c),(a>b) &&(a!=0),

能得出的结果(数值或者逻辑值(true/false)).

其中还要用到除了算术运算符以外的逻辑运算符:>(大于),<(小于),==(等于),!=(不等于),&(),|(),!().


循环语句: for语句,语法如下:

                        for(表达式1;表达式2;表达式3)
        语句1;

循环语句是帮助我们重复做一件事情的语句.

对于for语句,首先执行一遍表达式1,通常我们在这里为我们的循环控制变量赋初值,

然后判断表达式2的真假,如果是真就继续执行,通常我们在这里放上我们的循环条件.

然后执行表达式3和语句1.在表达式3里面我们通常会改变我们的循环控制变量.

执行完后继续判断表达式2,如果是真就一直循环下去.

循环语句:while语句,语法如下:

                while(表达式)
                              语句1;

顾名思义,就是当表达式成立的时候就一直执行语句1.

分支语句:switch语句

                switch(表达式1)
{
                                      case 常量表达式1: 语句1;
                                      case 常量表达式2: 语句2;
                                      case 常量表达式3: 语句3;
                                      ……..
                                      default : 语句n;
}

执行的时候会根据表达式1的值来选择所执行的语句,如果case没有列出来表达式1所表达的结果,就会执行default所指定的语句n.

我们发现上面的语句中,通常只能执行一条语句.那怎么样在一个地方执行多条语句呢?

为了达到这一点,我就需要运用复合语句.符合语句是用一对大括号 { }所包裹起来的一条或多条语句的集合,

在执行的时候他们被看做是一条语句,以便插入在上面的控制语句当中.

顺便提一下注释语句,在任何语句前面打上//,计算机就认为//后面的文字是注释,在编译的时候不会去管他,同样的/*…..*/也有同样的效果.




函数

函数是由一条或者多条语句组成的语句块,

通常按照一定的逻辑组合起来,能够完成一定的任务.

计算机中的函数和数学中的函数一样,在同样的输入情况下,必定能获得相同的返回值或者效果.

函数和变量一样要先定义.下面是定义函数的语法:

[修饰符] 返回值类型    函数名(参数表)
{
                   /*函数所执行的语句*/
}

函数修饰符我们后面会讲.

每一个函数都有一个返回值类型,它可以是任意类型,例如int,bool,也可以是空,就是不返回任何值,我们用void表示.

函数名就是函数的名字啦,我们调用函数的时候,必须要靠函数名调用.

参数表是我们在调用函数的时候,传递给函数的一系列变量,函数按照这些变量的意义,进行各种各样的效果.

参数表可以有很多个参数,也可以没有参数.

例如我们编写一个求平方的函数:

public int 平方(int a)
{
                return a*a;
}

当我们在我们自己的程序中调用平方这个函数时,就能求一个数的平方.例如

m=平方(n);

这时候m的值就是n的平方.这里就是函数调用语句.

在程序中,我们经常要调用各种各样的函数,调用的方法就是函数名(参数1,参数2…参数n).



类与对象

下面就是面向对象程序设计的关键部分了,很多人都觉得面向对象不好理解,

其实很简单的,就是把现实世界中的思想方式运用到程序设计中来.

首先,什么是对象?世界一切具体的东西(物体,能量,甚至是思想)都是对象.

在前面提到的一个变量和一个常量都是对象.一个,一个桌子也是对象.

一个对象一般都具有一定的属性(姓名,岁数),也具有一定的行为(走路,睡觉),

相对应的,程序中的对象也拥有属性(成员变量),和行为(成员函数).

那什么是呢?把具有相同属性和行为对象,抽象地描述出来,就是.

对象和类的关系就像是一个人和人类的关系.

对象抽象描述,我们可以通过这个描述去创造出一个对象,这个过程叫做实例化 .

火球来说,火球术本身是一个,是看不见,摸不着的,是一个并不存在实体的概念,

但是每天都会有很多的魔法师都会用火球术创造很多的火球,那么这单个的火球就是对象,火球术就一个.

像我们前面用到的int,double,string都是,前面我们说的是类型,其实他们就是一个,分别抽象了整数,浮点数和字符串对象,

方便了我们利用他们创建各种变量,变量也是对象.

到这里相信大家应该对类和对象就有一个大概的了解了.下面来说编程里面是如何定义类和对象的.

下面是定义类得语法

[类修饰符] class 类名
{
       成员变量1;
       成员变量2;
       成员函数1;
       成员函数;
       …………………..
}

一个中一般包含多个变量和函数,我们把他们称为该类的成员变量成员函数.

关于修饰符,下面我会提及到.

为了理解,我们定义一个火球类.

首先我们要想想如何描述一个火球呢?

他应该有自身的大小,当前的速度,和爆炸的威力,以及目前的位置.然后他还应该有几种行为,

例如被施放出来,根据速度移动,以及碰到目标后爆炸等等.

有了这些想法,我们就要吧我们的火球类写出来了.

public class 火球
{
      public int 大小;
      public int 速度;
      public double 威力;
      public Point 位置;
      public void 施放()
      {
      /******/
      }
      public void 爆炸()
      {
      /******/
      }
      public void 移动()
      {
      /******/
      }
}

其中Point表示一个记录一个点位置,我们用一个Point的对象来记录当前的位置.

到这里我们已经完成了一个火球类的创建.但是我们是不能用它去攻击别人的,因为它只是一个抽象的概念,并不是实物.

所以我们需要下面的代码来创建一个真真正正的火球.

火球 火球1 = new 火球();

这和前面我们定义一个整数的时候有点不一样?因为int,double等类型有一个叫做字面量的东西,它使得我们可以直接用等于号给这些变量赋值,

而我们自己定义的和很多系统提供给我们的类是通常是没有字面量,这区别没必要知道,无所谓,只要知道引用类型创建变量需要new一下就好了.

new运算符的意义是创建一个类型的对象,我们定义了一个叫做火球1引用接受它所创造出来的这个对象,

所以火球1就是一个有实体的对象,我们就可以用它去攻击敌人了!

也许你会发现new后面那个火球带了一对括号(),这不是函数的调用吗?

没错,创建一个对象的时候必须要调用一个叫构造函数的函数.

但是我们并没有在类的定义中定义那个构造函数,因为系统会默认帮我们定义一个什么事都不做的构造函数.

当然我们也可以自己定义一个,做一些为变量赋初值等操作.注意哦,构造函数必须和类名相同

一个火球被制造出来的时候,一般会有一定的初速度,那么我们就把初速度赋值给对象的速度变量好了.

在类的定义中加入如下的函数.

public  火球()
{
             速度 = 10;
}

这样当我们每一次new一个新火球的时候,他们的速度都会变成10.另外构造函数可以有参数,也可以重载.

创造出火球之后,我们就要发射它啦

如何调用火球这个对象中的发射这个函数呢?

很简单,

        火球1.发射();

就行了.访问对象中的属性和函数都是通过  对象名.函数名(变量) 访问.

下面介绍面向对象程序设计的核心思想之一:继承.

继承是指一个另一个类复制所有的属性和行为.

我们把继承出来的类称为派生类(子类),被继承的类叫做基类(父类).

应该不难理解吧?我们还是拿上面火球类的例子继续说.

火焰专精的法师,不想和别的专精的法师一样用简单的火球术,他们在火球术的基础上,发明了另一种更强大的法术—炎爆术.

炎爆术是以火球术作为基础的,他具有所有火球术所具有的属性和行为,例如大小,移动等等.

但是他却具有火球术不具有的属性和行为,

首先,他的有一个持续时间的属性,并且他在命中目标后能持续性的造成伤害.

比火球术厉害多了不少,不是吗?

然我们来看看怎么写炎爆术:

public class 炎爆术 : 火球
{
      public int   持续时间;
      public void 造成持续伤害()
      {
          /******/
      }
}

这个冒号:),就代表了炎爆术类是从火球术继承而来.

虽然我们没有定义其他的那些属性,但是它却火球术所有的属性和函数.

并且它比火球术多了一个持续时间属性造成持续伤害的函数.

然后我们就可以创造一个比火球厉害得多的炎爆去攻击敌人了!

补充一点,前面我们所说的修饰符,就是你们看到的public之类的,他描述了类或者是函数的访问权限,

例如public,private, protected和是不是静态变量(静态函数)(static).

所谓静态static),指的是它属于这个类变量(函数),而不是属于该类的对象的.

打个比方说,人类的总数,这个属性是描述人类这个的,单个的人并没有总数这个概念.

这些修饰符是可有可无的,视情况需要加在类(函数)的定义前面,默认是private和非静态函数.






上面就是这次的全部知识,这次我介绍了C#的基本语法,

虽然你可能觉得无聊,也可能没有看懂,但是没关系!因为这些都是理论知识,

在后面的实例中我们会要经常用到他们,用的时候你就能很轻松地理解他们了!

其实我也觉得这次的内容很枯燥无聊,都不想写了…

但是他们毕竟是基础,在后面的学习过程中,如果有这方面的问题,就可以到这里面来找.当然我更推荐去上次说的那3个地方找.


另外说明一点,为了提高大家的兴趣,也是为了节省时间,

上面的介绍并不是C#的全部语法,很多重要的语法我都没有说明,例如重载,泛型,委托等等.

用到的时候我会讲,毕竟本帖的目的是带你们快速的开发出一个小程序以提高你们的兴趣,一开始讲那么多理论只会吓退一些读者.

C#入门的经典书籍<C#入门经典>就有将近1000页,你可以想象得出我省略了多少.

如果你非常有兴趣学习C#,我推荐你去读那本书,或者<C#高级编程>.相信你能收获很多知识.

我希望大家记住:类就是类型,对象就是变量(常量).

        下次,我告诉大家我列出的galgame功能的其中2项,如何响应键盘和鼠标操作,与按钮的响应.

        作业:复习下今天的所讲述的知识就行,毕竟没什么需要动手的地方.如果你愿意就自己定义几个类,和函数试试看.

          作业记得贴上代码和成功运行的图!!

另外如果你觉得galgame除了我列出的那些功能外,还应该具有什么功能,你可以在下面回帖,我会回去研究下.


后面是一点广告

首先,欢迎对编程有兴趣或者已经从事IT工作以及相关专业的同学加入论坛的ooxx研究院的群 纯技术研究所(118213378)

本群有各种NB人士,有相关的问题都可以在其中交流。

然后是Runa游戏引擎征集中文名,不局限于音译.同时欢迎有兴趣的同学参与到引擎的开发中来.

Runa是基于Ruby和XNA的游戏引擎,目前处于制作阶段,将在4月份出第一个演示用的DEMO.

对于演示程序有好的建议的同学请联系我,以及招募各种画师,程序员等等.

Runa引擎交流群(2715634)
秋声赋([email protected]

因为对外推送的缘故.编辑了一下帖子.请谅解.BY:落幕 @秋声赋
https://www.gn00.com/t-37919-1-1.html

评分

参与人数 8宅魂 +9 宅币 +134 贡献 +14 元气(技能点) +7 收起 理由
天空蓝青草绿 + 1 + 3 打算试试~
shangmiku + 1 + 1 = =
alienwareflo + 1 + 3 先标记起~辛苦了~
煞笔 + 1 + 2 Σ( ° △ °|||)︴ 碉堡了
Sonivy.Ray + 5 + 20 这篇好难~
hcl + 40 + 4 + 2 o(* ̄▽ ̄*)ブ 发糖
Moen + 25 GJ
丨端木丶荒冬 + 40 + 10 + 5 Σ( ° △ °|||)︴ 碉堡了

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

2

主题

17

好友

5603

积分

序章

积分
5603
发表于 2012-4-4 21:54:08 | 显示全部楼层
沙发
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

58

主题

229

好友

3万

积分

第二章

积分
36384
发表于 2012-4-5 00:19:50 | 显示全部楼层
碉堡了、爱你~
[url=http://weibo.com/hinatashuishui]男なら、谁かのために强く
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

0

主题

26

好友

2万

积分

第一章

积分
26934
发表于 2012-4-5 00:37:44 | 显示全部楼层

                               
登录/注册后可看大图
虽不知,但觉厉
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

89

主题

238

好友

6283

积分

序章

积分
6283
发表于 2012-4-5 12:31:38 | 显示全部楼层
碉堡了 好快啊  = = 然后 最好把一个系列的帖子链接起来,比如现在编辑你第一个帖子 然后把这个帖子的链接放上去 ,以后多了  在每个帖子都放个目录这样最好  先给分了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

94

好友

1万

积分

第一章

积分
18966
发表于 2012-4-5 16:31:26 | 显示全部楼层
本帖最后由 Moen 于 2012-4-5 16:44 编辑

首先嘛,int, double, Point(System.Drawing.Point)这些不是类,而是结构,哪怕结构实际上是类派生出来的。这类和结构的概念分不清的话,某些地方会让人头疼的。(比如装箱拆箱)

实例代码有点问题,关键字区分大小写的

火球 火球1 = new 火球();

这和前面我们定义一个整数的时候有点不一样?因为整数是一个值类型,

表述错了,因为整数还有其它的基元类型有字面量,一般的类没有字面量,所以要用new创建一个对象。举个例子,Point结构是个值类型,但是它要用new来创建

修饰符还漏了internal, sealed这些(请原谅我吧=1251= )


PS:有点想进群
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
 楼主| 发表于 2012-4-5 17:12:14 | 显示全部楼层
本帖最后由 秋声赋 于 2012-4-5 17:34 编辑
Moen 发表于 2012-4-5 16:31
首先嘛,int, double, Point(System.Drawing.Point)这些不是类,而是结构,哪怕结构实际上是类派生出来的。 ...

首先
非常感谢能认真看这篇帖子~~

既然是入门嘛
类和结构的区别并不是很大,还有几个修饰符也没讲
后面那个值类型的话 你说得对 我已经修改了
大小写是因为我偷懒在word里面打的....

那就赶紧加群啊,非常欢迎
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

92

主题

94

好友

2万

积分

第一章

积分
24727
发表于 2012-4-5 18:24:46 | 显示全部楼层
前排先插入~~
请叫我字母菌
回复 支持 反对

使用道具 举报

该用户从未签到

163

主题

73

好友

4万

积分

第二章

积分
45516
发表于 2012-4-5 19:38:20 | 显示全部楼层
说的真好
如果当时java老师有这么说我就不用那么辛苦了
[url=http://www.gn00.com/forum-110-1.html]<font color="DarkOrange">跟着船长起航
回复 支持 反对

使用道具 举报

该用户从未签到

163

主题

73

好友

4万

积分

第二章

积分
45516
发表于 2012-4-5 20:32:46 | 显示全部楼层
我又来交作业啦!!啦啦啦啦
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace second
{
    public class 胸
    {
        private int a;
        public 胸()
        { }
        public int B()
        {
            return a * a;
        }
        public int C()
        { return a * a * a; }
        public void set(int i)
        { a = i; }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {
            label1.Text = "点我干嘛啊!!你妹!";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "我只是来交个作业而已~~"+"\n"+"现在请你输入你的胸围!";
            button1.Text = "你确定?";
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int j,q,p;
            string output;
            胸 breast = new 胸();
            j = Int32.Parse ( this.textBox1.Text);
            breast.set(j);
            p = breast.B();
            q = breast.C();
            output = "你的胸围是:" + j + "\r\n";
            output += "你胸围的平方是:" + p + "\n" + "你胸围的立方是:" + q;
            MessageBox.Show(output);
        }
    }
}



[url=http://www.gn00.com/forum-110-1.html]<font color="DarkOrange">跟着船长起航
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

4

好友

558

积分

New Game

积分
558
发表于 2012-4-5 22:44:03 | 显示全部楼层
火球 小秋生=new 火球();
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
 楼主| 发表于 2012-4-5 22:47:07 | 显示全部楼层
本帖最后由 秋声赋 于 2012-4-6 00:17 编辑
小收 发表于 2012-4-5 22:44
火球 小秋生=new 火球();

小受 小受1号=new 小受("弱");
小受[] E大后宫=new 小受[long.max];
List<小受>  E大后宫预备军团=new List<小受>();

还有你们改帖子的时候注意点啊。。。
别给改乱了。。。。
上一个就少了一大段东西。。。

点评

= =不会吧……表示我就动了开头啊…第一个分隔符下的东西我点都没有点过……OTL…真是不好意思  发表于 2012-4-6 07:35
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

20

好友

1万

积分

第一章

积分
13123
发表于 2012-4-6 14:41:18 | 显示全部楼层
#25!第二章也顺利学完了,#30!可是VS还没下完。。。。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

103

主题

145

好友

3万

积分

第二章

小透明

积分
31661

国庆70周年纪念

发表于 2012-4-6 14:59:57 | 显示全部楼层
orz发现一直用VC6.0现在不会用VS2010了。。。
[url=http://www.gn00.com/forum-1070-1.html]<font color=&quot;Red&quot;>对于社区有任何疑问
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
发表于 2012-4-6 15:29:21 | 显示全部楼层
本帖最后由 LonghronShen 于 2012-4-6 16:05 编辑

// Please compile with /clr
#include <cstdlib>
using namespace System;
using namespace System::Collections::Generic;
public ref class 小受
{
private:
    String^ m_Name;
   
public:
    小受(String^ name)
    {
       this->Name = name;
    }
   
    String^ SelfIntroduction()
    {
       return this->m_Name;
    }
   
    property System::String^ Name
    {
       void set(System::String^ value)
       {
           this->m_Name = value;
       }
       System::String^ get()
       {
           return this->m_Name;
       }
    }
   
};
int main( int argc, char* argv[] )
{
    auto E大后宫 = gcnew List<小受^>(System::Int16::MaxValue);
    小受^ 小受1 = gcnew 小受("");
    E大后宫->Add(小受1);
   
    for( int i = 0; i < E大后宫->Count; i++ )
    {
       Console::WriteLine(E大后宫[i]->SelfIntroduction());
    }
   
    system("pause");
   
    return 0;
}
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-4-24 20:00 , Processed in 0.430546 second(s), 41 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表