构造函数链接

时间:2011-09-27 13:01:02

标签: c# .net c#-4.0 constructor

我有以下代码:

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

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

显然这是Java方法,它在C#中不起作用。是否有任何选项不需要添加初始化方法?

6 个答案:

答案 0 :(得分:3)

你不能在C#中这样做。您必须在另一个构造函数中设置该属性。

理想情况下,您应该分离出对控制台的依赖性。

答案 1 :(得分: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);
}

答案 2 :(得分: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();
    }
}

答案 3 :(得分: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);
}

答案 4 :(得分: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();
        })
    {
    }
}

答案 5 :(得分:0)

您可以这样做:

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

public MapReader() : this (null) {}