2017-01-27 56 views
-2

我嘗試序列化我的列表,字符串和錯誤「‘弦’不包含一個構造函數參數0」「字符串」不包含帶0參數的構造函數 - 爲什麼? :/

[Serializable] 
class ComponentSerialization 
{ 

    public string komponent; 

    /** 
    * Konstruktor 
    */ 
    public ComponentSerialization(string v) { 
     ustawKomponent(v); 
    } 

     public void ustawKomponent(string v) { 
     this.komponent = v; 

    } 


     public string pobierzKomponent() { 
     string kom = new string(); 
     kom = this.komponent; 
     return kom; 
    } 

} 

爲什麼不工作? :/

+1

那麼,爲什麼是相當明顯的:'string'沒有構造函數需要0個參數,這就是爲什麼。 'new string()'基本上會創建一個空字符串,只需使用''「''或'String.Empty'。 – InBetween

+0

應該有一個「如何閱讀和理解Stacktraces」...... – Fildor

回答

1

更換

string kom = new string(); 
kom = this.komponent; 

string kom = this.komponent; 

沒有構造函數string類,所以你碰到這個錯誤

3

string沒有默認的構造函數(String Class - MSDN - 見Constructors部分 - 沒有參數的構造函數)所以,你會得到這個錯誤 - 你試着調用在String類中不存在的構造函數。

String類中的默認構造函數不是必需的。字符串是immutable。這意味着,當你嘗試改變它時,創建了一些字符串,但實際上你並沒有改變創建的字符串 - 你創建了一個新字符串。

在你的情況下,你不需要構造函數 - 你不需要創建對象,只需指定引用即可。

更改此:

string kom = new string(); 
kom = this.komponent; 

這樣:

string kom = this.komponent; 

此外,您還可以重構你的代碼多一點。這些行:

string kom = new string(); 
kom = this.komponent; 
return kom; 

只能由一個被替換爲:

return this.komponent; 
+0

「*因此,如果它是默認的構造函數,您將創建」無法更改的東西「*」。和?在很多情況下,空字符串仍然有用。這不是'string()'不存在的真正原因。它不是簡單地由於通過可重用性的效率而存在:字面上的''''將被實現,並且'string.Empty'是一個可以無限次使用的單個實例。它的原理與'ImmutableStack .Empty'相同。你只需要一個空的堆棧在一個不可改變的世界中。 – InBetween

+0

@InBetween,謝謝,我編輯了我的答案 –

2

由於string不可改變。這意味着你永遠不會改變string實例的內容。

在這兩條線

string kom = new string(); 
kom = this.komponent; 

在第一行中的初始化是無用的。新實例(如果它將被創建)將立即拋出,因爲你在下一行中分配this.komponent。所以,簡單地將其更改爲

string kom = this.komponent; 

因此,有爲參數的構造函數沒有用。如果您需要一個空字符串,請改爲使用string.Empty

+0

我提到不變性的原因是爲了回答這個問題_why_沒有無參數的構造函數是由設計人員提供的。沒有有用的場景,因爲您不會更改該實例的內容,並且空字符串已被「分配」並存儲在「string.Empty」中。 –

+0

是的,真的,刪除了評論。花了我一段時間才明白你實際上在回答「爲什麼沒有無參數的構造函數」,而不是「我的代碼爲什麼不編譯」,這是我認爲OP真正要求的。恐怕你的答案突然出現在OPs問題之前。 – InBetween

0

由於字符串是不可變的,所以沒有參數的構造函數不會有任何意義。相反,如果你想聲明一個沒有任何值的字符串,將它設置爲null。 也在你的情況下,函數pobierzKomponent是不必要的長。只是這樣做

public string pobierzKomponent() 
{ 
     return this.komponent 
} 

,甚至更好,因爲該字符串是公開聲明它爲財產public string Komponent{get;set;},並直接訪問它沒有任何getter函數

相關問題