强制转换

c# -- is和as运算符

匿名 (未验证) 提交于 2019-12-02 22:09:29
  一、is运算符用于判断一个对象是否可以转换为指定的类型,不会抛出异常,返回bool值用来表示是否转换成功: if ( myObj is MyClass ) { //do... }   当满足以下任意一种情况时转换成功:   1.转换对象是目标类型的实例;   2.转换对象是派生自目标类型的类型的实例;   3.转换对象是实现目标接口的类型的实例;   在C#7.0以上版本中支持is模式匹配表达式和switch模式匹配表达式;   二、as运算符与强制转换类似,但不会抛出异常,如果转换不成功,会返回null,通常搭配判空操作一起使用: MyClass myObj = obj as MyClass ; if ( myObj != null ) { //do... }   1.as运算符仅可以用于目标类型为引用类型或可空类型的类型转换操作,在转换时一般不会创建新的对象(如果原对象为值类型且目标类型为引用类型,转换成功时则会产生装箱操作,产生新对象);对于目标类型为非可空类型的值类型,可以使用is运算符配合强制转换进行转换: if ( myObj is int ) { int myNum = ( int ) myObj ; //do... }   ※在泛型中,如果需要使用as运算符将对象转换为类型参数的类型,需要添加基类约束或类类型的约束: where T : BaseClass /

C# 装箱和拆箱

匿名 (未验证) 提交于 2019-12-02 22:06:11
Object类型是所有类型的基类,其下面有ValueType类型。什么结构啊,枚举啊,都继承ValueType,这些都是值类型。其他的什么类啊,数组啊,字符串啊等等都是引用类型。 简单的说,直接继承Object的都是引用类型,继承ValueType的都是值类型。 那样的话,像整形这样的结构按理说其实也是间接继承自Object的,那么按照里氏替换原则,整形转换成object应该没有问题吧。 像上面的代码,这个b还是值类型吗?如果是值类型,好像又和直接继承Object都是引用类型矛盾了啊。其实这就是“装箱”。A是值类型,变成b,而成了Object类型,其实就变成了引用类型,简单的说装箱就是将值类型转成引用类型。与之对应的拆箱,将引用类型变成值类型。 那不就是个类型转换吗?还整个什么拆箱和装箱这样难听的名字! 错!值类型和引用类型之间的转换与什么一般的子类转父类,父类转子类不一样,他这种转换可涉及到存储上的变化 double d = 2.8; object obj = d; //装箱操作,要尽量避免装箱 d=(double)obj; //拆箱操作,影响性能,要避免拆箱操作 隐式转换:不需要声明就能转换的转换 int i=221; long j=i; 显式转换:又称“强制转换” double x=25.0123; int y=(int)x; int y=Convert.ToInt32(x)

JAVA基础-----数据类型转换

匿名 (未验证) 提交于 2019-12-02 21:53:52
在进行编程的时候,常常会遇到数据类型转换的问题,现在就进行相应的总结。 八种基本数据类型 除了boolean类型以外所有的基本数据类型在进行不同数据类型的运算的时候都要进行类型转换。 一:自动类型转换 只要类型转换满足兼容类型,且为从低级别转向高级别(从小向大)转换,就可以进行自动类型转换。 **注意:**char类型,从其他类型转换到char类型需要进行强制类型转换。从char类型转换到其他类型是可以进行自动转换的,但转到byte和short需要进行强制转换。 二:强制类型转换 当需要将高级别的类型转换到低级别的类型的时候需要用到强制类型转换,但是这样做会损失精度。例如将float类型的数值2.1转换到int类型的数值时,就会转换成2,此时的精度就会损失。 注意: 强制转换类型的适用范围仍然是上面八个基本数据类型,强制转换类型一定要在兼容的类型中进行转换,强制转换不是将String类型转换成int型,如果想要转换上述两种类型需要使用跨数据类型的方法进行转化。 三:跨数据类型的转换 基本数据类型――包裹类型 2. char―――-Character(注意) 3. byte―――-Byte 4. short―――Short 5. int――――-Integer(注意) 6. long―――-Long 7. float―――-Float 8. double――Double

Java基础部分总结--01

匿名 (未验证) 提交于 2019-12-02 21:40:30
Java基础部分总结―01 1 类型转换 1-1基本数据类型转化 自动转换 将 取值范围小的类型 自动提升为 取值范围大的类型 。 转换规则 byte、short、char运算时直接提升为int。 public class Main { public static void main ( String [] args ) { int i = 1 ; double d = 2.5 ; System . out . println ( i + d ); //out 3.5 } } double 类型内存8个字节, int 类型内存4个字节。因此int类型的i被自动提升成了取值范围大的double。 强制类型转换 将 取值范围大的类型 强制转换成 取值范围小的类型。 转换格式 数据类型 变量名 = (数据类型)被转换数据值 public static void main ( String [] args ) { int i = 1 ; double d = 2.5 ; /* *i是int类型的,d是double类型的,两者相加int类型的i会自动提升为double类型的,因此结果为double类型的 * 当用int类型的result接收的时,会产生大范围向小范围的转化,需要使用强制转换。 * */ // int result = i + d; //错误 int result = (

c# 协变和逆变

一世执手 提交于 2019-12-02 19:30:39
C#可变性类型   可变性只支持引用类型,禁止用户定义的转换。 协变性   如果某个返回的类型可以由其子类替换,那么这个类型就是支持协变的 逆变性    如果某个参数类型可以由其父类替换,那么这个类型就是支持逆变的 可变性参数   只有接口和委托可以拥有可变的类型参数 in 参数是逆变 out 参数是协变 实例 public class A {} public class B:A 协变 子类变成父类 A b=new B();//协变可正常转换 逆变 父类变成子类 B b=new A();//这样会直接报错 B b=(B)(new A());//强制转换 泛型的协变和逆变 逆变   实例化参数是子类,泛型接口当中是父类,如果想要正常创建对象,需要在泛型参数上加上in标记 定义泛型接口 public interface IUserService<in T> { } 定义业务层实现接口 public class UserService: IUserService<A> { } 实例化 static void Main(string[] args) { IUserService<B> s =new UserService(); } 如果不加in的话,会报错 无法将类型“ConsoleApp6.IServer.UserService” 隐式转换为“ConsoleApp6.IServer

数据类型的总结

蓝咒 提交于 2019-12-02 16:43:44
数据类型分别有int bool str list tuple dict set 首先,我们分析int的功能 int: 在python2和python中的范围不同,以及在py2的除法中,只能得到整数,而在Py3当中可以得到小数 强制转换,int(要转换的类型)但是只能强制转换bool和字符串成整型 bool: 零和空字符串,空元组,空列表才能转换成False,bool(字符串,列表,元组,整型) str: 独有功能:upper/lower/splite/replace/isdigit/startswith/endswith/format/join/encode 公共功能:len /索引、切片,步长,for循环 索引: name="meet" print(name[0]) 索引的位置是从左到右数0,1,2,3,从右往左数,-1,-2,-3,-4. 切片: name=“computer” print(name[0:3]) 切片包括前一个数但不包括后一个数,比如这个是com,如果什么都不写可看成0到正无穷 步长: name= “interesting” print(name[0:5:2]) 步长往常不写的时候默认为1,为2表示隔一个数取一次,相当于走两步,正的步长表示从左往右走,负的步长表示从右往左走 大写:.upper() name = "ales" new_name = name

RuntimeException

放肆的年华 提交于 2019-12-02 12:40:40
一. 理解: runtime exception,也称运行时异常,我们可以不处理。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。 二. 常见的几种RuntimeException如下: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常。 IllegalArgumentException - 传递非法参数异常。

C语言中的4种强制类型转换!

半世苍凉 提交于 2019-12-02 11:39:35
前言 在C语言中,我们需要做类型转换时,常常就是简单粗暴,在C++中也可以用C式强制类型转换,但是C++有它自己的一套类型转换方式。 C式的显示类型转换 先来说说C式的强制类型转换,它的用法非常简单,形如下面这样 Type b =111; Typea a = (Typea)b; 只需要用括号将你要转换的类型扩起来,放在要转换的变量前面即可。 举个例子: #include<stdio.h> intmain(void) { inta =0x01020304; char*b = (char*)&a; inti =0; for(;i <4;i++) { printf("%02x\n",b[i]); } return0; } 编译运行输出结果: 04 03 02 01 如果你好奇为什么会是这样的结果,请参考 《字节序的那些事》 。 C++ 四种强制类型转换。 当然,C++也是支持C风格的强制转换,但是C风格的强制转换可能带来一些隐患,让一些问题难以察觉.所以C++提供了一组可以用在不同场合的强制转换的函数。 const_cast , static_cast , dynamic_cast , reinterpret_cast const_cast 常量指针被转化成非常量的指针,并且仍然指向原来的对象; 常量引用被转换成非常量的引用,并且仍然指向原来的对象; const_cast一般用于修改指针

隐式转换和强制转换

徘徊边缘 提交于 2019-12-02 08:17:43
隐式转换:    场景——数学运算符:+ - * /    规则:     +:当任意一边出现字符时,“+”会把数值类型转换成字符类型,此时 + 代表拼接     -、*、/:出现纯数字字符时,会转换成数值类型处理,出现非数字类型时,会出现“NaN”    场景——关系运算符:> < >= <= != == ===    规则:     当只有一边为纯数字字符时,会转换成数值比较     当两边全部是数字字符时,会按照字符串对比的规则对比(逐位比较,得到结果,停止比较)     ==:若有字符类型会转换成数值类型,比较的是值     ===:若有字符类型不会转换,比较的是值和数据类型,全等    场景——if语句:    规则:     0、“”、null、undefined、NaN在if的()内会转换为false 强制类型转换:    字符转数值:     parseInt():从左向右依次转换,能转则转,不能转停止;如果第一位就不能转,直接NaN;不识别小数点。     parseFloat():等同于parseInt,同时可以识别小数点     Math.round():严格转换,不允许出现任何非数字的字符,否则NaN;取最接近的整数     Number():严格转换,不允许出现任何非数字的字符,否则NaN;直接转换     -、*、/:利用数学运算符的隐式转换

6、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?-Java面试题答案

久未见 提交于 2019-12-01 02:17:04
先说一下Java的基本数据类型转换规则,大的数据类型转换为小的数据类型需要强制转换,反之可以自动转换。 赋值表达式等号两侧的转换的规则是右侧的向左侧的看齐,即右侧表达式要转换到和左边的类型一样。 第一题:short s1 = 1; s1 = s1 + 1; 错! s1 + 1,s1是short类型,1是int型,s1会自动转换为int型的1,与1相加后,得到int型的2,要向左侧的short类型的s1看齐,即需要通过强制类型转换。正确写法:s1 = (short) (s1 + 1); 第二题:short s1 = 1; s1 += 1; 正确! 执行s1+=1;其实执行的是s1 = (short) (s1 + 1); 其中会有一个强制转换的过程。 第三题:short s1=1,s2=1;short s3=s1+s2; 错误!这里是编译器从数据安全方面考虑,如果s1和s2都是较大的short类型数,可能会导致溢出,所以会要求强制转换到int。正确写法:short s3 = (int)s1 + s2; 来源: https://www.cnblogs.com/helenwq/p/11647569.html