我已经看到这两个术语在各种在线解释中几乎可以互换使用,我查阅过的大多数教科书也不完全清楚其中的区别。
有没有一种清晰而简单的方法来解释你们所知道的差异?
类型转换(有时也称为类型转换)
在需要另一种类型的上下文中使用一种类型的值。
非转换类型转换(有时称为类型双关语)
一种不改变底层比特的变化。
强制
当周围的上下文需要一种类型的值时,编译器自动将该类型的值转换为另一种类型的值的过程。
发布于 2012-01-14 05:58:40
Type Conversion
单词conversion指的是隐式或显式地将值从一种数据类型更改为另一种数据类型,例如,将16位整数更改为32位整数。
单词用于表示隐式转换。
单词cast通常指的是显式类型转换(而不是隐式转换),而不管这是位模式的重新解释还是实数转换。
因此,强制是隐式的,强制转换是显式的,而转换是其中的任意一种。
以下是一些示例(来自same source):
强制(隐式):
double d;
int i;
if (d > i) d = i;转换(显式):
double da = 3.3;
double db = 3.3;
double dc = 3.4;
int result = (int)da + (int)db + (int)dc; //result == 9发布于 2012-01-14 06:29:59
正如您所注意到的,用法各不相同。
我个人的用法是:
发布于 2012-01-14 05:57:25
强制转换是将一个对象类型视为另一个类型的过程,强制是将一个对象转换为另一个对象。
请注意,在前面的过程中没有涉及转换,您希望将一个类型视为另一个类型,例如,您有三个不同的对象继承自一个基类型,并且您有一个方法将接受该基类型,在任何时候,如果您知道特定的子类型,您可以将其强制转换为它是什么,并使用该对象的所有特定方法和属性,这将不会创建该对象的新实例。
另一方面,强制意味着在内存中创建新类型的新对象,然后将原始类型复制到新类型,将两个对象都留在内存中(直到垃圾收集器取走其中一个或两者)。
作为示例,请考虑以下代码:
class baseClass {}
class childClass : baseClass {}
class otherClass {}
public void doSomethingWithBase(baseClass item) {}
public void mainMethod()
{
var obj1 = new baseClass();
var obj2 = new childClass();
var obj3 = new otherClass();
doSomethingWithBase(obj1); //not a problem, obj1 is already of type baseClass
doSomethingWithBase(obj2); //not a problem, obj2 is implicitly casted to baseClass
doSomethingWithBase(obj3); //won't compile without additional code
}由于baseClass
otherClass转换为基本类型,您需要提供自己的方法来从baseClass转换为baseClass,这将涉及创建类型为baseClass的新对象,并通过从obj3复制数据来填充该对象。一个很好的例子是Convert C# class,它提供了在不同类型之间进行转换的自定义代码。
https://stackoverflow.com/questions/8857763
复制相似问题