static LabelIO infer_d(Client client, StreamWriter sw)
{
// 错误 :1、 LabelIO results = client.wait_get_result(ref id)[0]
//
2 、LabelIO results = new LabelIO(client.wait_get_result(ref id)[0]);
}
解释:
wait_get_result() 返回值是 BatchLabelIO 类型的对象
所以如果使用 1 调用方法,返回值不会拥有那块内存所有权,且那块内存属于 BatchLabelIO
的临时对象
而 BatchLabelIO 的生存期(或者说上下文)是在这个函数内, 当这个函数结束后, 这个
BatchLabelIO 临时对象 ,最后一次引用也结束了 ,垃圾回收器会在某个非指定的时间销毁其实例
(引用 a)
此时,函数返回值就变成野指针了
背景知识:
a、无需销毁此前创建的类型实例。 引用和值类型的实例将自动销毁。 包含值类型的上下文销毁后,值类型的实例随之销毁。 在引用类型的最后一次引用被删除后,垃圾回收器会在某个非指定的时间销毁其实例。
b、用户定义类型不能重载赋值运算符。 但是,用户定义类型可以定义到其他类型的隐式转换。 这样,可以将用户定义类型的值分配给其他类型的变量、属性或索引器元素。 有关详细信息,请参阅用户定义转换运算符。
c、用户定义类型不能显式重载复合赋值运算符。 但是,如果用户定义类型重载了二元运算符 op,则 op= 运算符(如果存在)也将被隐式重载。
赋值运算符 – C# 参考 | Microsoft Learn
new 运算符 – C# 参考 | Microsoft Learn