2011-09-27 132 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) {}