不同的类型转换方式。有什么不同

时间:2010-02-25 17:34:12

标签: c# .net types type-conversion casting

我试图在类型转换方法之间找到区别。

例如

方法1

public byte fun()
{
   object value=1;
   return (byte)value; // this gives me error
}

方法2

public byte fun()
{
   object value=1;
   return byte.Parse(value.ToString()); // this runs 
}

方法3

public byte fun()
{
   object value=1;
   return Convert.ToByte(value); // this runs
}

这三者之间有什么区别。 他们如何在内部工作。 这里的值类型和参考类型是什么。 哪个函数可以将值类型转换为ref类型,反之亦然

修改2

当我写这行时,默认情况下int32,byte或其它什么数据类型'1'将被处理。

  

对象值= 1;

3 个答案:

答案 0 :(得分:8)

这里有很多问题。

方法1失败,因为您无法在单个操作中执行unbox和强制转换。您将“值”设置为盒装整数。当您尝试进行强制转换时,您将取消装箱整数并尝试在单个操作中强制转换为一个字节,但这会失败。这确实有效,顺便说一句:

return (byte)( (int)value) ); // Unbox, then cast, in two operations

方法2的工作原理是因为您将整数转换为字符串,然后使用byte.Parse将其转换为字节。这非常昂贵,因为它来自/来自字符串。

方法3有效,因为它看到值中的对象是IConvertible(int),并使用适当的转换操作转换为byte。在这种情况下,这可能是一种更有效的方法。由于“value”存储了一个int,并且int支持IConvertible,因此Convert.ToByte将基本上进行空检查,然后调用Convert.ToByte(int),这非常快(它确实绑定了检查,并且直接转换)。 / p>

我建议阅读Eric Lippert的帖子标题为Representation and Identity。它详细介绍了铸造,并解释了方法1失败的原因......

答案 1 :(得分:1)

// This is a direct cast. It expects that the object
// in question is already allocated as the data type
// indicated in the cast
(byte)value;

// This is a direct code conversion. It takes the argument
// and runs through code to create a new variable of the
// type byte. You'll notice if you include this in different
// code that value will still be an object but your new
// data will be a byte type
byte.Parse(value.ToString());

// This will convert any object similarly to the byte.Parse.
// It is not as fast because it does not have a definitely
// typed parameter (as parse has string). So it must go 
// through a couple of extra steps to guarantee the conversion
// is smooth.
Convert.ToByte(value);

直接铸造总是最快的。它假定类型已经建立并分配,因此它所要做的就是在内存中切换其引用类型。转换方法是代码转换,因此需要更多时间。我不知道基准测试,但Parse稍快一些,因为它处理特定的输入和特定的输出(字符串 - >字节)。转换是转换方法中最慢的,因为它缺乏相同的特异性。

答案 2 :(得分:0)

这里是我的镜头:

方法1

这是一种类型转换,即该值必须是可以无意义或显式转换为字节的类型。此外,值不得超出字节的范围。

调用失败,因为编译器没有任何信息它应该从哪个类型的对象转换,因此无法执行隐式或显式转换。做

int obj = 1;
byte b = (byte) obj; 

byte b = (byte) (int) obj;

的工作原理。第二个选项使用expedit拆箱(因此提供所需信息),如Reed Copsey的评论和帖子中所述。 Reed Copsey的评论提供的link详细解释了这一点。

对于自定义对象强制转换,使用隐式和显式转换的运算符是在类上定义的静态方法。对于object,不存在隐式或显式操作(请参阅link以了解原因),而int存在这些操作。

方法2

在这里,您要解析字符串,字符串的值必须是一个字节范围内的数字。在这里,您还可以使用TryParse来检查转换是否成功。

方法3

使用Convert类的类型转换。这是支持大多数常见类型的最灵活的方法。这里,值必须可以转换为数字,并且值必须在字节的边界内。 Convert类使用IConvertible在不同类型之间进行转换,因此是可扩展的。