.net 为什么跟踪引用不为被引用对象指定值?
我不明白,当传递的变量在堆上时,为什么跟踪引用没有完成它的工作。代码如下:.net 为什么跟踪引用不为被引用对象指定值?,.net,c++-cli,tracking-reference,.net,C++ Cli,Tracking Reference,我不明白,当传递的变量在堆上时,为什么跟踪引用没有完成它的工作。代码如下: ref class DataContainer { public: property DateTime Time; }; DataContainer^ dc = gcnew DataContainer (); DateTime timeOnStack; // first call with output variable on the stack bool timeParsed
ref class DataContainer
{
public:
property DateTime Time;
};
DataContainer^ dc = gcnew DataContainer ();
DateTime timeOnStack;
// first call with output variable on the stack
bool timeParsed = DateTime::TryParseExact ("20160104132500184", "yyyyMMddHHmmssfff", CultureInfo::InvariantCulture, DateTimeStyles::None, timeOnStack);
// second call with output variable on the heap
timeParsed = DateTime::TryParseExact ("20160104132500184", "yyyyMMddHHmmssfff", CultureInfo::InvariantCulture, DateTimeStyles::None, (dc->Time));
第一个TryParseExact
调用使用本地初始化变量timeOnStack
放入解析的日期时间值,按预期工作并正确设置解析的日期:调用timeOnStack.ToString()
返回“1/4/2016 1:25:00 PM”
而第二个函数甚至返回true
它没有将正确的值设置为dc->Time
:calldc->Time.ToString()
返回“1/1/0001 12:00:00 AM”
这里我没有看到什么?传递跟踪引用(
ref
在C#中)是传递对象的本地存储地址,而不是传递对象。但是,在您的示例中,dc->Time
不是局部变量或字段,而是属性。请记住,在后台,属性是getter/setter方法对。这里的内容相当于dc->GetTime()
编译器正在接受您的方法调用,并将该方法调用的结果作为跟踪引用传递。没有将其转让回财产;这不是它的工作原理。接收方法调用结果并作为跟踪引用传递的临时局部变量不可用
如果您在C#中尝试此操作,您将得到一个错误属性或索引器可能无法作为out或ref参数传递。
C++/CLI允许执行此操作,但可能不是您所希望的
编译器可以选择实现一些语法糖:调用属性getter,分配给临时变量,然后调用setter。但是,C#和C++/CLI都选择不实现该功能,原因很充分:请参阅 传递跟踪引用(
ref
在C#中)是传递对象的本地存储地址,而不是传递对象。但是,在您的示例中,dc->Time
不是局部变量或字段,而是属性。请记住,在后台,属性是getter/setter方法对。这里的内容相当于dc->GetTime()
编译器正在接受您的方法调用,并将该方法调用的结果作为跟踪引用传递。没有将其转让回财产;这不是它的工作原理。接收方法调用结果并作为跟踪引用传递的临时局部变量不可用
如果您在C#中尝试此操作,您将得到一个错误属性或索引器可能无法作为out或ref参数传递。
C++/CLI允许执行此操作,但可能不是您所希望的
编译器可以选择实现一些语法糖:调用属性getter,分配给临时变量,然后调用setter。但是,C#和C++/CLI都选择不实现该功能,原因很充分:请参阅