我目前正在使用C#,但我认为这个问题与所有OO语言相同。
我有一个方法,位于我的“ServersList”类中。在此方法中,我使用反序列化填充ServersList。
以下是方法:
public ServersList fillList(ServersList serversList)
{
//ServersList serversList = new ServersList();
XmlSerializer serializer = new XmlSerializer(typeof(BusinessObjects.ServersList));
using (StreamReader reader = new StreamReader("Resources/XMLServers.xml"))
{
serversList = (BusinessObjects.ServersList)serializer.Deserialize(reader);
}
return serversList;
}
我不知道在Main.cs中创建ServersList是否更好,使用此SereversList作为参数调用我的方法并返回结果,或者在没有参数的情况下调用函数并直接在其中创建ServersList(就像我一样)在注释行中)
对不起,如果我的问题看似愚蠢或者其他什么,我对OOP很新,我真的不知道哪种方法最好。谢谢你的帮助!
答案 0 :(得分:2)
我认为没有任何目的可以通过一个空列表,因为你无论如何也不会使用它的价值。它只会让未来的读者和维护者感到困惑,特别是在用户方面。我也会把它变成静态的。比较一下:
var serversList = new ServersList();
serversList = serversList.fillList(serversList);
对此:
var serversList = ServersList.LoadFromResources("Resources/XMLServers.xml");
就个人而言,我宁愿这样写:
public static ServersList LoadList(string _FileName)
{
using (StreamReader reader = new StreamReader(_FileName))
{
return (BusinessObjects.ServersList)serializer.Deserialize(reader);
}
}
顺便说一句,这将是Factory pattern的典型例子。
答案 1 :(得分:0)
如果只在方法内部需要它,请在方法中创建并初始化它。无论如何,对象都会被保存在堆上,而对它的引用将被保存在堆上(在类中声明时)或堆栈上(如果在方法体内声明)。这与此无关。
绝对没有理由将引用的副本传递给方法而不打算从中读取并在内部修改它。
答案 2 :(得分:0)
看看这一行:
serversList = (BusinessObjects.ServersList)serializer.Deserialize(reader);
方法Deserialize
已创建新列表并替换您拥有的列表。这会使参数无效,也会显示注释行。
我的建议是将方法更改为:
public ServersList CreateServersList();
实施:
XmlSerializer serializer = new XmlSerializer(typeof(BusinessObjects.ServersList));
using (StreamReader reader = new StreamReader("Resources/XMLServers.xml"))
{
return (BusinessObjects.ServersList)serializer.Deserialize(reader);
}
这样,反序列化创建的列表将直接返回给调用者。
答案 3 :(得分:0)
您不仅 需要将此作为参数传递,而且它实际上是一个非常糟糕的主意。这意味着该方法正在对初始列表执行某些操作,可能会修改其内容,而实际创建一个完全新实例并返回它。
考虑这段代码,例如:
public string DoStuff(string text)
{
text = "Something else";
return text;
}
您甚至无需使用返回值即可轻松调用此方法:
var text = "My text";
// this compiles
DoStuff(text);
// but the original variable was not changed
Console.WriteLine(text);
但是,请考虑至少删除硬编码字符串并从配置文件中获取它:
public static ServersList LoadServersList()
{
var serializer = new XmlSerializer(typeof(ServersList));
var configFile = ConfigurationManager.AppSettings["ServerListPath"];
using (var reader = new StreamReader(configFile))
{
return (ServersList)serializer.Deserialize(reader);
}
}
答案 4 :(得分:0)
Befor调用反序列化你的方法,serversList指向方法参数保留内存,但是当进行Deserialize时,serversList指向在serializer.Deserialize()方法中创建的新ServersList对象。然后你不需要让他参与功能的参数。