2016-12-29 44 views
0

这两种情况哪一种最正确?这种情况下rxBytes变量只被声明?C#:我总是实例化一个新的引用类型变量吗?

private void ParseRxData(RxMessage rxMessage) { 
    List<byte> rxBytes; 
    rxBytes = rxMessage.LengthBytes; 
    rxBytes.AddRange(rxMessage.Payload); 
    /* Do stuff with 'rxBytes' variable */ 
} 

或者这种情况下,rxBytes变量被实例化?

private void ParseRxData(RxMessage rxMessage) { 
    var rxBytes = new List<byte>; 
    rxBytes = rxMessage.LengthBytes; 
    rxBytes.AddRange(rxMessage.Payload); 
    /* Do stuff with 'rxBytes' variable */ 
} 

总之,是否有必要实例化一个变量,当它被赋值后立即被声明?

我是一个相当新的C#/ OOP程序员,所以我很抱歉如果我没有正确使用术语。

回答

1

简而言之,是否有必要在变量被声明后立即赋值时实例化一个变量?

没有 - 事实上,如果你初始化rxBytes到一个新的List<byte>,然后覆盖变量与rxMessage.LengthBytes,则从未使用过您创建的列表,将垃圾收集。您似乎将其分配为List<byte>,因此您可以使用不需要的var。你的第一个代码块是正确的方法。

你也可以这样做

var rxBytes = rxMessage.LengthBytes; 

但在功能上有声明在一行的变量并赋予它另一个值之间没有差别。

有没有什么办法可以设置等值符号“按值”?

那么引用类型的“值” 一个参考,但如果你只是想新的变量引用一个复制列表你可以做

var rxBytes = new List<byte>(rxMessage.LengthBytes); 
+0

嗯...这并不像我想的那样直截了当。看来使用任何一个块都会导致问题。由于rxMessage.LengthBytes是RxMessage类中的List 属性,因此似乎C#将对rxMessage.LengthBytes的引用复制到rxBytes。所以当将rxMessage.Payload添加到rxBytes时,我也将它们添加到rxMessage.LengthBytes。有没有什么方法可以用“按值”设置等号?否则,我必须使用rxBytes.AddRange(rxMessage。LengthBytes),在这种情况下,我还必须先用“new”初始化rxBytes。 – Oystein

+0

@Oystein查看我的更新。 –

1

下是完全合法的语法:

List<byte> rxBytes = rxMessage.LengthBytes; 

这并不是说需要实例化,只是一个分配。

当您使用new关键字创建新对象时,您正在为该对象分配内存。然而,在你的情况下,你为一个对象分配内存,并将对该对象的引用交给你的变量,然后立即分配该变量指向另一个对象。第一个对象立即变成孤儿,最终收集垃圾。

所以,真正的问题是,如果你能做的不仅仅是允许的话,这对负责任的编程来说是一个更好的做法。