C# 构造函数链接

C# 构造函数链接,c#,.net,c#-4.0,constructor,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#中不起作用。有没有不需要

我有以下代码:

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

    public MapReader(){
        Console.WriteLine("Input valid file name:");
        string name = Console.ReadLine();
        this(name);
    }
显然这是Java方法,在C#中不起作用。有没有不需要添加初始化方法的选项?

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

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

在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);
}

也许是这样的

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

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

我不太喜欢这种有副作用的构造函数的方法,你可以像这样模拟同样的东西:

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();
        })
    {
    }
}
公共类映射读取器
{
私有字符串文件名;
专用映射读取器(Func文件名)
{
this.fileName=fileName();
}
公共映射读取器(字符串文件名):此(()=>文件名)
{
}
公共地图阅读器():此(()=>
{
WriteLine(“输入有效文件名:”);
返回控制台ReadLine();
})
{
}
}

尽管我同意其他人的观点,即对控制台的依赖可能不是这个类的最佳选择,但这将起作用:

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();
    }
}
您可以这样做:

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

public MapReader() : this (null) {}

我认为这在Java中也行不通。对基类或同级构造函数的调用应该是构造函数体中的第一条语句。这不是设计问题吗?为什么向用户提供第二个构造函数?你提供了一个方法,这意味着它可以被使用,但是你生成了这个“无效文件名”,哦,我现在看到了。我的错,谢谢你指出。这是一个非常奇怪的解决问题的方法。默认的ctor仍然有副作用,因此您还没有消除这个问题。本质上,您传递的是一个延迟执行字符串,而您可以简单地传递一个字符串。另外,您似乎在语句lambda中缺少了一个“return”。是的,这是一种解决奇怪问题的奇怪方法。我的观点只是,这将模拟Java行为。我应该更清楚地指出这一点。