C#:我是否总是实例化一个新的引用类型变量?

时间:2016-12-29 06:16:56

标签: c#

这两种情况中哪一种最正确?这种情况下只声明了rxBytes变量?

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程序员,所以如果我没有正确使用术语,我会道歉。

2 个答案:

答案 0 :(得分:1)

以下是完全合法的语法:

List<byte> rxBytes = rxMessage.LengthBytes;

这不是实例化所必需的,只是一项任务。

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

所以,你要问的是,如果你能做到的话不仅是允许的,那么对于负责任的编程来说,这是更好的做法。

答案 1 :(得分:1)

  

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

否 - 实际上,如果您将rxBytes初始化为新的List<byte>,然后使用rxMessage.LengthBytes覆盖该变量,那么您创建的列表将永远不会被使用并将被垃圾回收。您似乎只为其分配List<byte>,以便您可以使用var这是不必要的。你的第一个代码块是正确的方法。

您也可以这样做

var rxBytes = rxMessage.LengthBytes;

但从功能上来说,在一行上声明变量并在另一行上为其赋值是没有区别的。

  

有没有办法设置等号&#34;按值&#34;?

好的参考类型&#34;值&#34; 引用,但如果您只是希望新变量引用列表的副本,则可以执行

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