2011-09-27 128 views
0

我有以下代碼:構造函數鏈

public MapReader(string fName) { 
     FileName = fName; 
    } 

    public MapReader(){ 
     Console.WriteLine("Input valid file name:"); 
     string name = Console.ReadLine(); 
     this(name); 
    } 

顯然,這是Java的方法,這是不工作在C#。是否有任何不需要添加方法進行初始化的選項?

+2

我不認爲這可以在Java中工作。調用基類或兄弟構造函數應該是構造函數體中的第一條語句。 –

+4

是不是有設計問題?你爲什麼要爲你的用戶提供第二個構造函數?你提供了一個方法,這意味着它可以被使用,但是然後你生成這個「無效的文件名」 – MBen

+0

哦,我現在看到它。我的壞,謝謝你指出。 – jnovacho

回答

3

你不能在C#中做到這一點。您必須在其他構造函數中設置該屬性。

理想情況下,應該分離出控制檯上的依賴關係。

2

在C#中,你不能使用這種方法。
試試這個:

private void setParam(string name) { 
    FileName = name; 
} 

public MapReader(string fName) { 
    setParam(fName); 
} 

public MapReader() { 
    Console.WriteLine("Input valid file name:"); 
    string name = Console.ReadLine(); 
    setParam(name); 
} 
0

也許這樣的事情?

public MapReader(string fName) 
{ 
    FileName = fName; 
} 

public static MapReader FromConsole() 
{ 
    Console.WriteLine("Input valid file name:"); 
    string name = Console.ReadLine(); 
    return new MapReader(name); 
} 
0

我不太喜歡具有側面影響的構造類似的方法,你可以模擬這樣同樣的事情:

public class MapReader 
{ 
    private string fileName; 

    private MapReader(Func<string> fileName) 
    { 
     this.fileName = fileName(); 
    } 

    public MapReader(string fileName) : this(() => fileName) 
    { 
    } 

    public MapReader() : this(() => 
     { 
      Console.WriteLine("Input valid file name:"); 
      return Console.ReadLine(); 
     }) 
    { 
    } 
} 
+0

這是一個解決問題的非常奇怪的方法。默認的ctor仍然有副作用,所以你還沒有消除這個問題。基本上,當你只是傳遞一個字符串時,你傳遞一個*延遲執行*字符串。此外,您似乎在語句lambda中缺少「返回」。 –

+0

是的,這是一個奇怪的方式來解決一個奇怪的問題。我的觀點只是這會模擬Java的行爲。我應該更清楚地指出。 –

2

雖然我與其他人有一個依賴同意控制檯可能不是最適合這個類,這會工作:

class MapReader 
{ 
    public string FileName { get; private set; } 
    public MapReader(string fName) 
    { 
     FileName = fName; 
    } 

    public MapReader() : this(ObtainNameFromConsole()) 
    { 

    } 

    private static string ObtainNameFromConsole() 
    { 
     Console.WriteLine("Input valid file name:"); 
     return Console.ReadLine(); 
    } 
} 
0

你可以這樣做:

public MapReader(string fName) { 
    if (fName == null) 
    { 
    Console.WriteLine("Input valid file name:"); 
    fName = Console.ReadLine(); 
    } 
    FileName = fName; 
} 

public MapReader() : this (null) {}