2016-12-29 46 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關鍵字創建新對象時,您正在爲該對象分配內存。然而,在你的情況下,你爲一個對象分配內存,並將對該對象的引用交給你的變量,然後立即分配該變量指向另一個對象。第一個對象立即變成孤兒,最終收集垃圾。

所以,真正的問題是,如果你能做的不僅僅是允許的話,這對負責任的編程來說是一個更好的做法。