我有以下代码:
public MapReader(string fName) {
FileName = fName;
}
public MapReader(){
Console.WriteLine("Input valid file name:");
string name = Console.ReadLine();
this(name);
}
显然这是Java方法,它在C#中不起作用。是否有任何选项不需要添加初始化方法?
答案 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) {}