将变量作为对象进行转换会导致该变量丢失数据吗?

时间:2014-05-16 17:05:41

标签: c# object casting

说我有以下代码

...
PointPair newPoint = new PointPair(123, 432);
newData((Object) newPoint);
...

public override void newData(Object data)
{
    PointPair newData;
    if (data is PointPair)
        newData = (PointPair)data;
    else
        newData = new PointPair(0, 0);

    // Do stuff with newData
}

我的PointPair对象在投放/播放object期间会丢失数据/信息吗?

如果我使用objectObject,这有关系吗? (资本O)

4 个答案:

答案 0 :(得分:5)

  

我的PointPair对象在转换/转发对象期间会丢失数据/信息吗?

不,它不会。因为转换,根本不会更改您的对象。它会更改您的对象的方式,例如当您将其转换为object时,即使基础类型仍然存在PointPair您无法访问PointPair的成员,因为您的newPoint将被视为object

  

我使用object或Object是否重要?

不,因为object只是Object类的别名。

答案 1 :(得分:0)

你的两个问题的答案都是否定。你在投票时不会丢失数据的价值。 object是Object(http://msdn.microsoft.com/en-us/library/9kkx3h3c(v=VS.100).aspx

的别名 祝你好运!

答案 2 :(得分:0)

不,没有数据丢失。但是当您将引用类型转换为对象时,会有性能损失。编译器必须发出 castClass 操作码以将引用类型转换为所需类型,这是另一个要处理的指令。

答案 3 :(得分:0)

  

我的PointPair对象在转换/取消播放期间是否会丢失数据/信息   来自对象?

没有。因为PointPair是引用类型(因为所有C#类都是),所以PointPair变量保存对实际存储在托管堆上的对象的引用。存储引用所需的空间独立于对象的类,而转换只是告诉编译器您认为引用指向的对象类型。转换为object(在您的示例代码中实际上没有必要)说,"对待newPoint,好像我只知道它是object。" newData = (PointPair)data;中的强制转换( 必需)告诉编译器,"让我将data视为它真正的PointPair。&#34 ;

此行为与将long转换为int形成对比。值类型(如数字基元类型和C#结构)按值存储,它们占用不同的空间量。因此,将long转换为int意味着潜在的数据丢失,因为64位值将转换为32位值。

  

如果我使用对象或对象,这有关系吗? (资本O)

没有。正如其他人所说,object关键字只是Object的别名。