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行为。我应该更清楚地指出这一点。