ASP.NET学习手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 C#语言基础

( 名师课堂:1小时58分钟)

学习任何一门语言都不能一蹴而就,必须遵循一个客观的原则。从基础学起,有了劳固的基础,再进阶学习有一定难度的技术就会很轻松。学习的过程,就好比一个婴儿的成长过程,不可能还没学习走路,就去参加世界锦标赛进行百米跨栏。所以一门语言的基础是一个人技术实力的根基,也好比一棵大树的树根,掌握的基础知识越牢固,树根扎得越深,面对再大的暴风骤雨也不会畏惧,正是这样的道理。本章将从初学者的角度考虑,将知识与实例配合,轻松了解C#语言基础,快速入门。通过本章的学习,可以掌握以下知识:

了解C#中数据类型、运算符的分类

掌握C#中数据类型的使用及类型转换

掌握常量和变量的使用

掌握各种运算符的使用方法

4.1 掌握数据类型

专题讲座:光盘\MR\Video\4\数据类型.exe

视频速递:为了更好地理解数据类型,读者可以参考本视频。

顾名思义,数据类型的表面含义是数据是属于哪种类型,就好像一个人是属于哪个民族一样。数据类型可分为值类型和引用类型。在程序执行时,操作系统都会分配一块内存给应用程序存储相关的数据。内存是有限的资源,若已填满数据,其他要存储的数据必须等某些数据不用、有多余的空间时才能存入,所以要根据数据特性及预估计范围选择一个适合的数据类型。

4.1.1 值类型

所有的值类型都隐式地继承自System.ValueType类,该类又继承自object类。任何类型都不可能派生自值类型,因此所有的值类型都是隐式密封的。

学习手册 注意

System.ValueType本身并不是值类型。相反,它是一个类类型,所有的值类型都自动派生自该类型。

值类型直接存储数据值,它主要包含整数类型、浮点类型以及布尔类型等。值类型在堆栈中进行分配,因此效率很高,使用值类型的主要目的是为了提高性能。值类型具有如下特性。

值类型变量都存储在堆栈中。

访问值类型变量时,一般都是直接访问其实例。

每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响其他变量。

复制值类型变量时,复制的是变量的值,而不是变量的地址。

值类型变量不能为null,必须具有一个确定的值。

简单类型是直接列出一系列元素构成的数据类型。C#语言中提供了一组已经定义好的简单类型。所有的简单类型均为.NET Framework系统类型的别名。例如,int是System.Int32的别名。简单类型可以分为整数类型、布尔类型、实数类型、结构类型和枚举类型等。

(1)整数类型

整数类型变量的值为整数,它的值有一定范围限制。C#中有几种整数类型,如表4.1所示。

表4.1 C#内置的整数类型

byte类型以及short类型是范围比较小的整数,如果正整数的范围没有超过65535,声明为ushort类型即可,当然更小的数值直接以byte类型进行处理即可。例如,如果要存储班级人数,范围在30~50人之间用byte即可。一是因为人数一定是“整数”,不可能有33.5人的情况,二是范围在30~50人之间,若用int(可存储-2147483648~2147483647之间的整数),存放班级人数绝对是绰绰有余,但一定会浪费内存空间。

【例4.1】 整数类型在实际开发中应用非常广泛,例如,在开发会员注册时,需要用户输入年龄、电话号码等。那么,年龄和电话号码就必须是整数类型,运行效果如图4-1所示。

图4-1 会员注册页面中需要输入整数类型的电话号码

学习手册 说明

在输入数据时,要对用户输入的数据进行验证,验证是否是整数类型。相关的内容将在第9章中进行讲解。

实例位置:光盘\\MR\\IInsttance\\4\\4..1

【例4.2】 为了让读者更好地理解整数类型,下面举个简单的例子。例如,第一章40页,第二章50页,计算总页码是多少?运行结果如图4-2所示。

图4-2 整数类型的应用

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            int UltimoMoney = 40;                            //声明整型变量并赋值
            int NowMoney = 50;
            int result;
            result = UltimoMoney + NowMoney;                    //计算两个整型变量相加
            Response.Write("第一章页码:" + UltimoMoney.ToString() + "<br>");
                                                                //将数据输出到页面中
          Response.Write("第二章页码:" + NowMoney.ToString() + "<br>");
            Response.Write("总页码:" + result.ToString());
        }

学习手册 说明

整数类型的应用还有很多,例如,计算仓库货物总数、统计员工工资、统计考勤人数和计算员工保险金额等,在本书以后的几章中整数类型也会经常出现。

(2)布尔类型

布尔类型主要用来表示true/false值,一个布尔类型的变量,其值只能是true或者false,不能将其他的值指定给布尔类型变量,布尔类型变量不能与其他类型进行转换。

【例4.3】 将927赋值给布尔类型变量x,代码如下所示。

        bool x = 927;

这样赋值显然是错误的,编译器会返回错误提示“常量值927无法转换为bool”。布尔类型大多数被应用到流程控制语句当中。例如,循环语句或者if语句等。

实例位置:光盘\\MR\\IInsttance\\4\\4..2

【例4.4】 布尔类型在开发中被经常用到,例如,通过布尔类型可以判断登录用户身份等。本实例创建一个布尔类型的变量flag,并初始化为false。根据这个布尔型变量执行相应的if...else语句分支,运行结果如图4-3所示。

图4-3 布尔类型变量的应用

实现的代码如下所示:

        bool  flag=false;                                 //创建并初始化布尔类型变量
        if(flag)                                           //如果为true,则执行if分支
        {
            Response.Write ("我是中国人!");                //输出信息
        }
        else                                                //如果为false,则执行else分支
        {
            Response.Write ("你是美国人!");                //输出信息
        }

(3)实数类型

实数在C#中有单精度(float)和双精度(double)之分,它们的区别在于取值范围和精度不同。表4.2列出了这两种数值类型的描述信息。

表4.2 实数类型及描述

对于这两种浮点类型可以根据实际应用情况而定,比如贷款利率,即使是现金卡或地下钱庄,利率也不可能是天文数字,且小数位数顶多两三位,所以用float存储利率即可。

C#还专门定义了一种十进制(decimal)类型,它是适合金融和货币计算的128位数据类型。decimal类型可以表示从1.0×10-28到7.9×1028的范围内且具有28到29位有效数字的值。当定义一个变量并进行赋值的时候,使用m后缀来表示它是一个decimal类型,如下示例代码所示。

        decimal i =50.20m

学习手册 说明

这里如果省略了m后缀,那么变量被赋值之前将被编译器当成double型。

如果不做任何设置,包含小数点的数值都被认为是double类型,例如9.27,如果没有特别指定,这个数值的类型是double类型。如果要将数值以float类型来处理,就应该通过强制使用f或F将其指定为float类型。

【例4.5】 下面的代码用来将数值强制指定为float类型。

        float theMySum = 9.27f;                           //使用f强制指定为float类型
        float theMuSums = 1.12F;                          //使用F强制指定为float类型

如果要将数值强制指定为double类型,则需要使用d或D进行设置。

【例4.6】 下面的代码用来将数值强制指定为double类型。

        double myDou = 927d;                               //使用d强制指定为double类型
        double mudou = 112D;                               //使用D强制指定为double类型

学习手册 注意

程序中使用float类型时,必须在数值的后面跟随f或F,否则编译器会直接将其作为double类型处理。

(4)结构类型

利用上面介绍过的简单类型,我们在进行一些常用的数据运算、文字处理似乎已经足够了。但是我们会经常碰到一些更为复杂的数据类型。比如,通信录的记录中可以包含他人的姓名、电话和地址。如果按照简单类型来管理,每一条记录都要存放到三个不同的变量当中,这样工作量很大,也不够直观。有没有更好的办法呢?

在实际生活中,我们经常把一组相关的信息放在一起。把一系列相关的变量组织成为一个单一实体的过程,我们称为生成结构的过程。这个单一实体的类型就叫做结构类型,每一个变量称为结构的成员。前面我们讲的简单类型(int、double和bool)实际上都是结构类型,在C#中,结构类型采用关键字“struct”来声明。

实例位置:光盘\\MR\\IInsttance\\4\\4..3

【例4.7】 首先应用关键字“struct”创建一个结构类型Employee,分别存储员工姓名、年龄、部门和积分信息,之后在Page_Load事件中声明创建的结构类型Employee的变量E,最后输出指定的员工信息,运行结果如图4-4所示。

图4-4 结构类型应用实例

实现的代码如下所示:

(5)枚举类型

枚举类型是一种具有命名常量的独特的类型,枚举声明以关键字enum开始,然后定义枚举的名称、可访问性、基础类型和成员。其基本语法格式如下所示:

        访问修辞符enum枚举名:基础类型
        {
            枚举成员
        }

上述语法中的基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明byte、sbyte、short、ushort、int、uint、long或ulong类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是int(整型)。

枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。

【例4.8】 创建一个枚举类型,声明三个枚举成员并分别赋值,代码如下所示:

        public enum ColorOfCar:uint                  //创建枚举类型
        {
            Red=-3,                                       //声明三个枚举成员,并赋值
            Green=-2,
            Blue=-1
        }

学习手册 说明

运行这样的示例代码会产生编译时错误,原因是-1、-2和-3不在基础整型uint(无符号整型)的范围内。

在枚举类型中声明的第一个枚举成员的默认值为0。以后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加1得到的。这样增加后的值必须在该基础类型可表示的值的范围内;否则,会出现编译时错误。

【例4.9】 创建一个枚举类型,声明三个枚举成员,并输出枚举成员的值,代码如下所示:

        public enum ColorOfCar:uint                        //创建枚举类型
        {
            Red,                                                //声明三个枚举成员
            Green,
            Blue
        }

枚举成员默认值分别为:Red的值为0;Green的值为1;Blue的值为2。

实例位置:光盘\\MR\\IInsttance\\4\\4..4

【例4.10】 首先应用关键字“enum”创建一个枚举类型TimeofDay,分别存储一天中早中晚三个时间段信息;之后声明一个Text类,在该类中分对TimeofDay枚举类型中的成员进行赋值操作,最后在Main函数中调用所创建的Text类输出相应的时间段信息,运行效果如图4-5所示。

图4-5 枚举类型应用

实现的代码如下所示:

4.1.2 引用类型

引用类型是构建C#应用程序的主要类型,引用类型的变量又称为对象,可存储对实际数据的引用。C#支持两个预定义的引用类型object和string,其说明如表4.3所示。

表4.3 C#预定义的引用类型及说明

学习手册 说明

尽管string是引用类型,但如果用到了相等运算符(==和!=),则表示比较string对象(而不是引用)的值。

在应用程序执行的过程中,引用类型以new创建对象实例,所有被称为“类”的都是引用类型,主要包括类、接口、数组和委托等。下面通过一个实例来演示如何使用引用类型。

实例位置:光盘\\MR\\IInsttance\\4\\4..5

【例4.11】 在平时的开发中,类是经常被用到的。所以,引用类型也变得尤为重要,读者要掌握创建引用类型对象的方法。例如,本实例中创建一个类C,在此类中建立一个字段Value,并初始化为0,然后在程序的其他位置通过new关键字创建对此类的引用类型变量,最后输出,如图4-6所示。

图4-6 如何使用引用类型

实现的代码如下所示。

        protected void Page_Load(object sender, EventArgs e)
        {
            int v1 = 0;                                    //声明一个int类型的变量v1,并初始化为0
            int v2 = v1;                                   //声明一个int类型的变量v2,并将v1赋值给v2
            v2 = 927;                                      //重新将变量v2赋值为927
            C r1 = new C();                              //使用new关键字创建引用对象
            C r2 = r1;                                     //使r1等于r2
            r2.Value = 112;                                //设置变量r2的Value值
            Response.Write("Values:"+ v1+","+ v2);         //输出变量v1和v2
            Response.Write("Refs:"+r1.Value+","+r2.Value); //输出引用类型对象的Value值
        }
        class C                                            //创建一个类C
        {
            public int Value = 0;                          //声明一个公共int类型的变量Value
        }

学习手册 注意

关于类我们在以后的章节中会进行详细介绍,读者可以参考本书第6章的内容。

4.2 认识常量和变量

专题讲座:光盘\MR\Video\4\常量和变量.exe

视频速递:常量和变量是开发中经常用到的,本视频会实际演示其用法。

常量又叫常数,它主要用来存储在程序运行过程中值不改变的数据。变量也就是可以变化的数据,每个变量都具有一个类型。麻雀虽小却五脏俱全,常量和变量的作用不可忽视。通过本节的学习,读者能够了解什么是常量和变量,以及如何使用常量和变量。

4.2.1 什么是常量

常量又叫常数,它主要用来存储在程序运行过程中值不改变的数据。常量也有数据类型,C#语言中,常量的数据类型有多种,主要有sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool和string等。

4.2.2 定义并使用常量

常量通过const关键字声明,常量必须在声明时初始化。例如,通过const关键字声明一个常量,代码如下所示:

        class Calendar1
        {
            public const int months = 12;
        }

上述代码中,常量months将始终为12,不能更改,即使是该类自身也不能更改它。常量必须属于整型(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool或string)枚举或对null的引用。

【例4.12】 可以同时声明多个相同类型的常量,代码如所示:

        class Calendar2
        {
            const int months = 12, weeks = 52, days = 365;
        }

实例位置:光盘\\MR\\IInsttance\\4\\4..6

【例4.13】 在开发中,一些频繁用到的且值不改变的经常被定义为常量。例如,在代码中经常将算术中的π定义为常量,因为这个值是不改变的。在本实例中计算圆的周长,运行结果如图4-7所示。

图4-7 计算圆的周长

实现的代码如下所示。

        protected void Page_Load(object sender, EventArgs e)
        {
            const double PI = 3.1415926;             //声明常量,存储π的值
            int r = 112;                                         //声明圆的半径
            double perimeter;                                    //存储圆周长
            perimeter = 2 * PI * r;                              //调用常量和半径计算圆周长
            Response.Write("圆的周长是:"+perimeter);            //输出周长
        }

常量可标记为public、private、protected或internal,这些访问修饰符定义用户访问该常量的权限。尽管常量不能使用static关键字声明,但可以像访问静态字段一样访问常量。未包含在定义常量类中的表达式必须使用类名、一个句点和常量名来访问该常量。

学习手册 注意

若要创建在运行时初始化的常量值,请使用readonly关键字。

编程准则:尽可能多地使用const

const关键字可以防止开发程序时错误的产生。例如,对于一些不需要改变的对象,使用const关键字将其定义为常量,可以防止开发人员不小心修改对象的值,产生意想不到的结果。将函数返回的指针类型定义为const指针,可以向其他人员表明不应该修改函数的返回值,如果不进行类型转换,显式地进行修改,则会出现编译错误。如果在定义函数时,不希望在函数体中修改参数值,应使用const关键字将参数定义为常量参数,防止用户修改参数值。在定义类的方法时,例如getXXX()等形式的方法用于获取类的信息时,应将方法定义为const方法,阻止用户在方法中修改成员变量的值,因为方法的作用是获取信息,而不是修改信息。总之,应尽可能多地使用const关键字(Use const whenever you need)。

4.2.3 什么是变量

变量也就是可以变化的数据,每个变量都具有一个类型,这个类型确定了该变量中可以存储哪些值。C#是一种类型安全的语言,C#编译器保证了存储在变量中的值总是具有合适的类型。变量的值可以通过进行赋值或++和--运算符来更改。

4.2.4 变量的声明和赋值

变量的作用非常重要,它代表一个特定的数据项或值。与常量不同,变量可以反复赋值。它就像一个盒子,存储着各种不同的数据。C#中规定,使用变量前必须声明。变量的声明同时规定了变量的类型和变量的名字。变量的声明采用如下规则。

        <type><name>;

使用未声明的变量是不会通过程序编译的。C#中并不要求在声明变量的同时初始化变量,即为变量赋初值,但为变量赋初值通常是一个好习惯。C#中可以声明的变量类型并不仅限于C#预先定义的那些。因为C#有自定义类型的功能,开发人员可以根据自己的需要建立各种特定的数据类型以方便存储复杂的数据。

声明变量非常简单,下面的例子便声明了一个整型变量a。

        int a;

【例4.14】 在声明变量的同时为变量赋初值,如下所示。

        bool b=true;

上述代码在声明布尔型变量的同时将其初始值设置为真(true)。

【例4.15】 在同一行中同时声明多个变量,如下所示。

        int b,c;
        int d=1,e=2;

每一个变量都有自己的名称,但C#规定不能用任意的字符作为变量名。变量的命名规则有以下几条,希望读者能够牢记。

变量的第一个字符必须是字母、下画线“_”或“@”。

后面的字符可以是字母、下画线或数字。

变量的名称不能使用C#的关键字。

C#的关键字如表4.4所示。

表4.4 C#关键字

另外需要注意的是C#区分大小写,使用变量时必须按照正确的大小写引用。如下面的变量虽然仅有大小写的区别,但在C#中代表不同的变量:mydata、Mydata、MYDATA。

编程信条:从变量命名开始培养写程序的好习惯

如果写程序的习惯不好,造成程序的可读性差,日后要维护或调试时,别人看不懂就算了,即使是你自己,隔个三五天再来看自己编写的程序可能就已经看不懂,更不要说修改或维护。英文有句话说:“Eat your dog food”,大体翻译过来就应该是“自食其果”的意思,所以培养一个好的编程习惯就从为变量取个好名字开始吧。基本上为变量选择名称时,最好使用有意义的名称,而不要为了少打几个字用简写或缩写。比如,与其用hAddr还不如用homeAddress更加明白、正确。

在声明了变量之后就可以在后面的程序中使用它们。无论在声明变量时是否对其初始化,之后都可以对其进行再次赋值。

【例4.16】 声明两个变量,并对其进行赋值。

        Int a=0;                                   //定义整型变量a,并为其赋初值0
        Double b;                                  //定义双精度型变量B,未赋初值
        a=256;                                     //为整型变量a赋值为256
        b=12.28;                                   //为双精度型变量度b赋值为12.28

实例位置:光盘\\MR\\IInsttance\\4\\4..7

【例4.17】 常量和变量在开发中都是不可缺少的,在编程中至关重要。例如,声明一个变量并初始化为0,然后通过一个循环改变其值,并输出到页面,运行结果如图4-8所示。

图4-8 改变变量的值

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            int flag = 0;                           //声明一个变量并初始化
            for (int i = 0; i < 5; i++)               //通过for循环改变变量的值
            {
                Response.Write(flag.ToString());      //输出改变后变量的值
                flag++;                               //变量加1
            }
        }

学习手册 说明

关于for语句,我们将在第5章进行介绍,请读者参看第5章的内容。

4.2.5 变量的作用域

变量的作用域就是可以访问该变量的代码区域。一般情况下,可以通过以下规则确定变量的作用域。

只要字段所属的类在某个作用域内,其字段也在该作用域内。

局部变量存在于表示声明该变量的块语句或方法结束的封闭花括号之前的作用域内。

在for、while或类似语句中声明的局部变量存在与该循环体内。

【例4.18】 使用for循环将0~20的数字显示出来。然后在for语句中声明变量i,此时i就是局部变量,其作用域只限于for循环体内,代码如下所示。

4.3 如何实现类型转换

专题讲座:光盘\MR\Video\4\类型转换.exe

视频速递:通过本视频读者可以更好地掌握ASP.NET中的类型转换。

类型转换就是将一种类型转换成另一种类型,转换可以是隐式转换或者显式转换,本节将详细介绍这两种转换方式。

4.3.1 隐式类型转换

隐式类型转换就是不需要声明就能进行的转换。进行隐式类型转换时,编译器不需要进行检查就能安全地进行转换。

【例4.19】 整型转换为货币类型和单精度类型,代码如下所示:

        int i=123;
        decimal money=i;                                       //数字转货币
        float f=i;                                             //整型转单精度

下面是隐式类型转换,如表4.5所示。

表4.5 隐式类型转换表

学习手册 说明

从int、uint、long或ulong到float,以及从long或ulong到double的转换可能导致精度损失,但不会影响它的数量级。其他的隐式转换不会丢失任何信息。

【例4.20】 将int类型的值隐式转换成long类型,代码如下所示。

        int i = 123;                          //声明一个整型变量i并初始化为123
        double b = i;                         //隐式转换成double类型

4.3.2 显式类型转换

显示类型转换也可以称为强制类型转换,它需要在代码中明确地声明要转换的类型。如果在不存在隐式转换的类型之间进行转换,就需要使用显式类型转换。表4.6列出了需要进行显式类型转换的数据类型。

表4.6 显式类型转换表

在C#语言中,若要将某个表达式显式转换为特定数据类型,可使用显式强制转换调用转换运算符,将数据从一种类型转换为另一种类型。

【例4.21】 使用显式转换将一个单精度值转换为一个整数值。

        float f = 123.45;
        int i = (int)f;

        float f = 123.45
        int i =Convert.ToInt32(f);

学习手册 注意

在进行数据类型的转换编程时,最好显式地给出转换的类型。这样既方便程序的阅读和维护,也不易导致错误。

4.4 使用C#中运算符

专题讲座:光盘\MR\Video\4\C#中运算符.exe

视频速递:本视频主要对C#中的运算符进行详细讲解,读者能够更直观地了解其用法。

C#中的运算符是用来对变量、常量或数据进行计算的符号,它主要用来指挥计算机进行什么样的操作。可以将运算符理解为交通警察的命令,用来指挥行人或车辆等不同的运动实体(运算数据),最后达到一定的目的。C#中的运算符包括算术运算符、赋值运算符和关系运算符等,本节将对这几种运算符进行详细介绍。

4.4.1 算术运算符

C#中有6种算术运算符,如表4.7所示。

表4.7 算术运算符

1.加法运算符

加法运算符(+)通过两个数相加来执行标准的加法运算。

实例位置:光盘\\MR\\IInsttance\\4\\4..8

【例4.22】 在实际开发中,使用加法运算符可以进行标准的加法运算,例如,开发网页计算机器、计算工资等。在本实例中,声明两个整型变量M1和M2,并将M1赋值为927,然后使M2的值为M1与M1相加之后的值,运行结果如图4-9所示。

图4-9 加法运算符计算两数之和

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            int M1 = 927;                                //声明整型变量M1,并赋值为927
            int M2;                                      //声明整型变量M2
            M2 = M1 + M1;                              //M2的值为M1与M1相加之后的值
            Response.Write (M2.ToString());
        }

2.减法运算符

减法运算符(-)通过从一个表达式中减去另外一个表达式的值来执行标准的减法运算。

实例位置:光盘\\MR\\IInsttance\\4\\4..9

【例4.23】 在开发库存管理系统时,就是用减法运算符计算出库后的库存数量。本实例首先声明两个decimal类型的变量R1和R2,并分别赋值为1112.82和9270.81,然后再声明一个decimal类型的变量R3,使其值为R2减去R1之后得到的值,运行结果如图4-10所示。

图4-10 减法运算符计算两数之差

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            decimal R1 = (decimal)1112.82;             //声明整型变量R1,并赋值为1112.82
            decimal R2 = (decimal)9270.81;             //声明整型变量R2,并赋值为9270.81
            decimal R3;                                //声明整型变量R3
            R3 = R2- R1;                             //R3的值为R2减去R1得到的值
            Response.Write (R3.ToString());
        }

3.乘法运算符

乘法运算符(*)将两个表达式进行乘法运算并返回它们的乘积。

实例位置:光盘\\MR\\IInsttance\\4\\4..10

【例4.24】 在开发人力资源管理系统时,通过乘法运算符计算员工月工资。本实例首先声明两个整型变量int1和int2,并分别赋值为10和20。再声明一个整型变量Mul,使其值为int1和int2的乘积,运行结果如图4-11所示。

图4-11 乘法运算符计算两数之积

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            int int1 = 10;                             //声明整型变量int1,并赋值为10
            int int2 = 20;                             //声明整型变量int2,并赋值为20
            int  Mul;                                  //声明整型变量Mul
            Mul = int1 * int2;                      //使Mul的值为int1和int2的乘积
            Response.Write (Mul.ToString());
          }

4.除法运算符

除法运算符(/)执行算术除运算,它用除数表达式除以被除数表达式而得到商。

学习手册 注意

被除数表达式的结构不能为0,否则将会出现异常。

实例位置:光盘\\MR\\IInsttance\\4\\4..11

【例4.25】 在开发人力资源系统时,作者就是通过除法运算符计算公司员工的人均收入的。在本实例中首先声明两个整型变量cs1和cs2,并分别赋值为45和5。再声明一个整型变量result,使其值为cs1除以cs2得到的值,运行结果如图4-12所示。

图4-12 除法运算符计算两数之商

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            int cs1 = 45;                          //声明整型变量cs1,并赋值为45
            int cs2 = 5;                           //声明整型变量cs2,并赋值为5
            int result;                            //声明整型变量result
            result = cs1 /cs2;                  //使result的值为cs1除以cs2得到的值
            Response.Write (result.ToString());
        }

5.求余运算符

求余运算符(%)返回除数与被除数相除之后的余数,通常用这个运算符来创建余数在特定范围内的等式。

实例位置:光盘\\MR\\IInsttance\\4\\4..12

【例4.26】 求余运算符在实际开发中应用还是比较广泛的,例如,通过求余运算符判断某个数字是奇数还是偶数。本实例通过求余运算符挑选出0~30之内的所有偶数,并输出显示,运行结果如图4-13所示。

图4-13 求余运算符判断是否为偶数

实现的代码如下所示:

        protected void Page_Load(object sender, EventArgs e)
        {
            for (int i = 0; i <= 30; i++)              //for语句循环0~30的所有数字
            {
                if (i % 2 == 0)                      //通过求余运算符判断数字与2的余数是否为0
                {
                    Response.Write(i.ToString()+",");  //如果余数是0则说明是偶数
                }
            }
        }

知识解读:什么是一元运算符和二元运算符

在C#中,接受一个操作数的运算符称为“一元”运算符,例如增量运算符(++)或new。接受两个操作数的运算符称为“二元”运算符,例如算术运算符 +、-、*、/。条件运算符 ?: 接受三个操作数,是C# 中唯一的三元运算符。

4.4.2 赋值运算符

赋值运算符有= 、 += 、-= 、*= 、/= 、 %= 、&= 、|= 、^= 、<<= 、>>=、??等。C#语言中可以对变量进行连续赋值,这时赋值操作符是右关联的,这意味着从右向左操作符被分组,如x=y=z等价于x=(y=z)。如果操作符两侧的操作数类型不一致,应先进行类型转换。给变量赋值的式子称为赋值表达式,赋值表达式的值用于给变量赋的值。常用的赋值操作符的运算对象、运算法则及运算结果如表4.8所示。

表4.8 赋值操作符的运算规则

在C#语言中,所有赋值和自反赋值操作符的优先级都一样,比所有其他操作符的优先级都低,是优先级最低的操作符。

实例位置:光盘\\MR\\IInsttance\\4\\4..13

【例4.27】 赋值运算符应用非常广泛。本实例实现的是当输入用户名之后,通过赋值运算符“=”将输入的用户名赋值给字符串变量,并输出,运行结果如图4-14所示。

图4-14 赋值运算符为变量赋值

实现的代码如下所示:

        protected void btnlogin_Click(object sender, EventArgs e)
        {
            string name = string.Empty;            //声明一个字符串变量
            name = txtname.Text.Trim();        //通过赋值运算符将输入的用户名赋值给变量
            Response.Write("登录用户:"+name);     //输出字符串变量存储的值
        }

4.4.3 关系运算符

关系运算符可以实现对两个值的比较运算,并且在比较运算之后会返回一个代表运算结果的布尔值。常见的关系运算符及说明如表4.9所示。

表4.9 关系运算符及说明

下面对这几种关系运算符进行详细讲解。

1.相等运算符

要查看两个表达式是否相等,可以使用相等运算符(==)。相等运算符对整型、浮点型和枚举类型数据的操作是一样的,它只简单地比较两个表达式,并返回一个布尔结果。

实例位置:光盘\\MR\\IInsttance\\4\\4..14

【例4.28】 通过相等运算符判断登录用户是否为合法用户。主要思路是通过相等运算符将输入的用户名和密码与合法的进行比对,如果相等,则说明合法。运行结果如图4-15所示。

图4-15 判断登录用户是否合法

实现的代码如下所示:

        protected void btnlogin_Click(object sender, EventArgs e)
        {
            string name = txtname.Text;                      //获取输入的用户名
            string pwd = txtpwd.Text;                        //获取输入的密码
            if (name == "mr" && pwd == "mrsoft")             //通过相等运算符判断是否合法
            {
                Response.Write("登录成功");                  //如果合法输出提示信息
            }
            else                                             //如果不合法
            {
                Response.Write("登录失败");                  //输出错误提示
            }
        }

2.不等运算符

不等运算符(!=)是与相等运算符相反的运算符,有两种格式的不等运算符可以应用到表达式中,一种是普通的不等运算符(!=),另外一种是相等运算符的否定!(a= =b)。通常,这两种格式可以计算出相同的值。

实例位置:光盘\\MR\\IInsttance\\4\\4..15

【例4.29】 在会员注册时,登录用户名一定不能为空,那么,在后台代码中如何判断其是否为空呢?此时,不等运算符就派上用场了,只有当登录用户名不为空的情况才允许注册,运行结果如图4-16所示。

图4-16 不等运算符判断是否输入用户名

实现的代码如下所示:

        protected void btnreg_Click(object sender, EventArgs e)
        {
            if (txtname.Text.Length != 0) //如果文本框中文本的长度不等于0说明输入了用户名
            {
                                              //此处是用户注册的相关代码
            }
            else                              //否则,说明没有输入用户名
            {
                txtname.Text="请输入用户名";
            }
        }

3.小于运算符

如果要比较一个值是否小于另外一个值,可以使用小于运算符(<)。当左边的表达式的值小于右边表达式的值时,结果是真,否则结果是假。

实例位置:光盘\\MR\\IInsttance\\4\\4..16

【例4.30】 会员注册时,输入的年龄不能太小。例如,年龄不能为18岁以下,因为18岁才符合成年人的年龄,所以对输入的年龄要进行判断。本实例就是使用小于运算符判断输入的年龄是否小于18,运行结果如图4-17所示。

图4-17 小于运算符判断输入的年龄是否小于18

实现的代码如下所示:

        protected void btnreg_Click(object sender, EventArgs e)
        {
            if (int.Parse(txtage.Text) < 18)                 //判断输入的年龄是否小于18
            {
                Response.Write("年龄输入有误");              //如果小于18则输出提示信息
            }
        }

4.大于运算符

如果比较一个值是否大于另外一个值,可以使用大于运算符(>)。当左边的表达式的值大于右边的表达式的值时,结果是真,否则结果是假。

实例位置:光盘\\MR\\IInsttance\\4\\4..17

【例4.31】 会员注册时,输入的年龄不仅不能太小,同时也不能无限大,所以要对其进行限制。例如,年龄不能大于80,当然年龄的上限读者可以自己根据实际情况设置,本实例就是使用大于运算符判断输入的年龄是否大于80,运行结果如图4-18所示。

图4-18 大于运算符判断输入的年龄是否大于80

实现的代码如下所示:

        protected void btnreg_Click(object sender, EventArgs e)
        {
            if (int.Parse(txtage.Text) > 80)                   //判断输入的年龄是否大于80
            {
                Response.Write("您年龄大了,要注意休息!");    //如果大于80输出提示信息
            }
        }

4.4.4 情景应用1:开发简单计算器

实例位置:光盘\\MR\\IInsttance\\4\\4..18

【例4.32】 本实例通过算术运算符开发一个简单的加法运算器,输入两个数字之后,单击“计算”按钮,会将两个数字之和显示出来,如图4-19所示。

图4-19 简单的加法计算器

实现的代码如下所示:

        protected void btnresult_Click(object sender, EventArgs e)
        {
            int num1 = int.Parse(txtnum1.Text.Trim());        //获取输入的第一个数字
            int num2 = int.Parse(txtnum2.Text.Trim());        //获取输入的第二个数字
            txtresult.Text = (num1 + num2).ToString();  //通过加法运算符计算两数之和
        }

4.4.5 情景应用2:开发简单登录

实例位置:光盘\\MR\\IInsttance\\4\\4..19

【例4.33】 会员注册和登录对于经常上网的朋友来说并不陌生,本实例根据关系运算符开发一个简单的登录功能,如图4-20所示。

图4-20 简单的登录功能

实现的代码如下所示:

        protected void btnlogin_Click(object sender, EventArgs e)
        {
            if (txtname.Text == "mr" && txtpwd.Text == "mrsoft")
                                              //判断输入的用户名和密码是否正确
            {
                ClientScript.RegisterStartupScript(this.GetType(), "", "alert('登录成功');",
                true);
            }
        }

4.5 实战练习

4.5.1 输入出生年份判断生肖属相

题目描述

平时上网时,有很多网站都可以在线根据输入的出生年份查找相应的生肖属相。那么,这个功能是如何开发的呢?其实,开发起来并不复杂。读者可以尝试自己开发该功能,作者开发了一个小程序,能够实现该功能,仅供读者参考,效果如图4-21所示。

图4-21 输入出生年份判断生肖属相

技术指导

开发本实例时,首先声明字符串数组变量,用来存储生肖属相(存储顺序为猴鸡狗猪鼠牛虎兔龙蛇马羊)。输入的出生年份除以12取模,余数是几则在字符串数组中找到对应的属相。

紧急救援

如果你在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。

救援通道http://www.mrbccd.com/ASP.NET/loveASP.NET/4.5.1

4.5.2 求最大公约数

题目描述

最大公约数即能被两个整数整除的最大整数,例如,24与15两个数的最大公约数为3,本实例实现在两个文本框中输入数字,然后单击“求最大公约数”按钮,输出计算出来的最大公约数,效果如图4-22所示。

图4-22 求最大公约数

技术指导

求最大公约数可以用求余法实现。即用两个数中较大的数除以较小的数求余,然后使用除数除以余数求余,直到余数为0时,之前的除数也就是两个数的最大公约数。

紧急救援

如果你在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。

救援通道:http://www.mrbccd.com/ASP.NET/loveASP.NET/4.5.2

4.5.3 求最小公倍数

题目描述

本实例通过多种运算符相结合,实现计算最小公倍数。运行程序,在两个文本框中输入数字,然后单击“求最小公倍数”按钮,输出计算出来的最小公倍数,效果如图4-23所示。

图4-23 求最小公倍数

技术指导

最小公倍数可以通过两个数的乘积除以这两个数的最大公约数得到。例如,12与9的最大公约数为3,则这两个数最小公倍数的计算方法为12*9/3,计算的结果就是这两个数的最小公倍数。

紧急救援

如果你在做本例题的过程中遇到困难或疑惑,可以按照下面救援通道提供的网址获取本例题的源码和技术文档。

救援通道:http://www.mrbccd.com/ASP.NET/loveASP.NET/4.5.3

4.6 本章小结

本章首先对C#语言进行了简单介绍,接着对C#语言中的基本语法进行了讲解,其中包括数据类型、常量、变量、数据类型转换、运算符等内容。学习完本章后,读者应该对C#基础语法有一个清晰的认识,并能在实际中简单应用。