1. 强制类型转换操作符
强制类型转换操作符()
int x;
string s = (String)x;
例1:
string str1 = Console.ReadLine();
string str2 = Console.ReadLine();
//使用ReadLine读取到的是两个string类型的数据
//如果要进行计算,需要把两个string转换为int
int x = Convert.ToInt32(str1);
int y = Convert.ToInt32(str2);
Console.WriteLine(x + y);//打印两数的和
隐式类型转换
隐式(implicit)类型转换 代码中不用明确告诉编译器,编译器自动转换的,有以下三种1.不丢失精度的转换
进容量范围小的同类类型装入容量范围大的类型中 如将int装入long中、将float装入double,总集参见下表2.由子类向父类的转换
所以面向对象的编程语言都支持这种转换 “多态”就是基于这种隐式类型转换class Animal //创建类“动物”
{
public void Eat()
{
}
}
class Human : Animal //创建派生类“人类”,继承自“动物”类,以动物为基类
{
//一旦以“动物”为基类,动物的所有成员都会被“人类”所继承
public void Think()
{
Console.WriteLine("Who I am?");
}
}
class Teacher : Human ////创建派生类“老师”,继承自“人类”类,具有人类、动物所有的成员
{
public void Teach()
{
Consile.WriteLine("I teach programming.");
}
}
class Program
{
static void Main(string[] args)
{
Teacher t = new Teacher();
//子类像父类的隐式类型转换
}
}
由于Teacher是Human的子类,将Teacher装入父类型变量时,会进行隐式类型转换
t身上有【动物】【人类】【老师】的成员
而装入父类Human后,h身上只有【动物】【人类】的成员,没有【老师】的teach方法
//ushort的最大值为65535 uint x = 65536; //比ushot最大值还大1 ushort y = (ushort)x; //强制显性类型转换,要转换的目标类型写在圆括号中 //将32位大小的变量强行塞入16位大小的类型中,会取前面16位,舍弃后面16位,所以结果为0
所有显式类型转换:
注意:将有符号数装入无符号类型时,一定会发生数值的改变
有符号数最高位的1表示负号,而无符号类型会将其当作最高位数值
2.拆箱
3.使用Convert类的ToXXXX静态方法
Convert类是一个类型转换枢纽,内有大量现成的类型转换方法 ToString : 转换为string字符串 使用例1: 把输入的string文本转换为double类型并存入变量:double x = System.Convert.ToDouble(tb1.text);
函数的参数括号中写要转换类型的变量
使用例2:
把double类型数值转换为string类型并输出到文本框:
this.tb3.Text = System.Convert.ToString(result);
4.使用数值数据的ToString实例方法
使用例: 把double类型数值转换为string类型并输出到文本框:this.tb3.Text = result.ToString();
ToString是object(C#中所有类的基类)自带的四大基本方法之一,所有所有类型都有这个方法
5.使用类型的静态方法Parse
使用方法与使用Convert类下辖ToXXXXX方法几乎一模一样 例:把输入的string文本转换为double类型并存入变量:double x = double.Parse(this.tb1.Text);
但Parse方法有一个缺点,只能转换输入类型正确的值
若在double类型中输入了“ab”,其无法被转换为double,会报错
要转换为double必须输入的是和double一样的数值格式,如123、1e2(科学计数法中的100,10的二次方)
EX:为了弥补这个缺点,C#有另一个方法TryParse
double x = double.TryParse(this.tb1.Text);
TryParse有一个bool类型“输出参数”(待续)
自定义类型转换操作符
(转换操作符的重载)显式
class Program //程序主体
{
static void Main(string[] args)
{
Stone stone = new Stone();
stone.Age = 5000;
//调用操作符定义的类型转换方法
Console.WriteLine(wukongSun.Age);
}
}
class Stone //定义类:石头
{
public int Age;
public static explicit operator Monkey(Stone stone)
{ //定义一个将Stone类型转换为Monkey类型的类型转换操作符
//返回值为一个猴子变量,参数为一个石头变量
//explicit operator:显式类型转换操作符
Monkey m = new Monkey();
m.Age = stone.Age / 500; //石头的500岁转化为猴子的1岁
return m;
}
}
class Monkey //定义类:猴子
{
public int Age;
}
类型转换方法类似一个实例构造器,但不是写在转换目标类中,而是写在被转换的类中
隐式
将上面的显性转换方法中的 implicit operator Monkey(Stone stone) { //定义一个将Stone类型转换为Monkey类型的类型转换操作符 //返回值为一个猴子变量,参数为一个石头变量 //explicit operator:显式类型转换操作符 Monkey m = new Monkey(); m.Age = stone.Age / 500; //石头的500岁转化为猴子的1岁 return m; } 调用:Monkey wukongSUN = stone;
隐式类型转换方法在赋值时会自动调用
2.算数运算操作符
乘法 *
(1)整数乘法
包括所有不带小数点的数值变量,int、uint、long、ulong四种(2)浮点乘法
包括float、double,计算结果带小数点 浮点数中包括两个特殊值,无穷大(正无穷大、负无穷大)和NAN(not a number,不是一个数) X * 无穷大 = 无穷大 -X * 无穷大 = 负无穷大 0 * 无穷大 = NAN 无穷大 * 无穷大 = 无穷大 注意数值类型提升,int 乘 double的结果是double 当程序发现除号两边类型不一样时,会将结果的类型提升到不损失精度的类型除法 /
(1)整数除法
整除,结果也是整数 除数不能为0,否则会报错(2)浮点除法
两个数都是浮点数时进行浮点除法,结果有小数点值 正数除0得 正无穷大(PositiveInfinity) (极限思想) 负数除0得 负无穷大(NegativeIninity) 正无穷大 除 负无穷大 = NAN 例:double x = (double)5/4;
结果为double类型的1.25
因为类型转换操作符优先级高于除法,5先被变为double,然后去除int 4,得double 1.25
double x = (doub)(5/4);
结果为double类型的1
因为用括号改变了运算的优先级,先进行了除法
(3)decimal除法
待续取余 %
运算法则遵从下表 整数取余: 11 % 10 = 1 浮点数取余: 3.5 % 3 = 0.5 取余也会产生类型提升加法 + 和减法 -
加号可用来连接连个字符串 还可以用来操作委托(待续) 对无穷大和NAN的处理法则: 正无穷大 - 正无穷大 = NAN 加法、减法也会产生类型提升3.位移操作符 << 和 >>
能够将数据在内存中的二进制结果进行一定位数的平移int x = 7; //7的二进制为111
int y = x << 1; //将x在内存中向左移动一位
string strX = Convert.ToString(x,2).PadLeft(32,"0"); //转化为32位二进制字符串
string strY = Convert.ToString(x,2).PadLeft(32,"0");
Console.WriteLine(strX); //打印
Console.WriteLine(strY);
输出结果为
strX = 00000000000000111
strY = 00000000000001110 向左移动了一位
对应二进制数字,在没有溢出的情况下,左移 = 乘2 , 右移 = 除2
0000000111 = 7
0000001110 = 14
左移补进来的都是0
右移正数补进来0,负数补进来1
4.比较判断操作符 == != < > <= >=
< > <= >= 优先级更高 == != 优先级较低 关系运算符运算结果都是bool类型 还可用于char类型的比较 比如‘a’ > ‘A’ 使用的是unicode编码,其向下兼容ASCII码 但unicode是用16位表示,ASCII是用8位表示 字符串比较 不能比大小,但能用“==”、“!=”比是否相等 也可以用String.Compare(str1,str2); 比较 返回值是一个整数,若为0是相等,若为正值是第一个大于第二个,若为负值是第一个小于第二个4.类型检验操作符 is as
is操作符
Is 用来检验一个对象是不是一个类型的对象Teacher t = new Teacher();
var result = t is Teacher;
输出结果为true
若变量t中装的是NULL,检验结果会为false
Teacher t = new Teacher();
var result = t is Human;
输出结果为true
子类型的对象,是属于(is)父类的
object o = new Teacher();
if (o is Teacher)
if判断结果为true,父类型可以装子类型实例,并可通过判断
as操作符
object o = new Teacher();
Teacher t = o as Teacher; //类似一个强制类型转换
if(t != NULL)
{
t.Teach();
}
将父类(基类)对象以子类(派生类)的形式存入变量
5.位运算操作符
位与 &
两个二进制数对齐,按位求与位或 |
两个二进制数对齐,按位求或位异或 ^
异或:两位不一样时为真 两个二进制数对齐,按位求异或6.条件运算符
条件与 &&
条件或 ||
&&、||的短路效应
注:&&与||有短路效应 例:if(a++ > 3)
&&先判断右边,发现右边为假,此时无论左边为何值,结果都是假
此时程序会偷懒,直接不运行右边的表达式,因此
但很多地方需要NULL值,所以3.0之后C#更新了可空类型
是一种【泛型】,如下语句表示【可空的int】
由于可空类型特别常用,所以C#将其吸收为了关键字
Int? X 就等于 Nullable<int> x