hlf*_*rmn 0 c# pass-by-reference
朋友们!
所以我一直在写一个简单的程序.基本上,我有一个类(3个字符串,1个int,一些方法).我正在从文本文件初始化此类的对象的值.我正在使用List.问题是初始化是一个单独的功能.我在这个函数中声明并初始化了List BOTH.但是,我可能在其他功能中需要它,包括"Program.Main".
我应该制作一个"全球"课程并制作一个公开的List <Class>吗?我决定立即在我的Program.Main函数中声明它.但是,我不确定,List是通过值还是通过引用传递的.我在网上找到了一个页面,建议使用ref关键字.我现在有:
public Class FooClass
{...}
class Program
{
static void Main(string[] args)
{
List<FooClass> fooDB = new List<FooClass>;
initFromFile(ref fooDB);
}
private static initFromFile(ref List<FooClass> fooDB)
{
using (StreamReader ... )
{
while( ... )
{
...
fooDB.Add(new FooClass(args))
}
}
}//initFromFile
}//Program
Run Code Online (Sandbox Code Playgroud)
我应该继续像这样工作吗?还是有任何重要的建议?也许"参考"根本不是一个好习惯?
TLDR:我应该制作一个全局列表还是将其作为参考或其他方式传递(建议).如果通过引用传递,那么我应该使用ref关键字还是有另一种方式?
提前致谢,
~~~ hlfrmn
你的程序结构的方式很好,除了不需要使用ref. List<T>是一个引用类型,这意味着值传递给该函数实际上是(在C"指针"/C++术语)一个参照本发明的List<T>实例.因此,当函数返回时,对方法中列表的任何修改都将可用.
您要使用的唯一原因ref是您想要指向fooDB一个新实例:
private static initFromFile(ref List<FooClass> fooDB)
{
fooDB = new List<FooClass>; // if the parameter was not passed by reference
// this instance would not be used by the caller.
using (StreamReader ... ){
while( ... )
{
...
fooDB.Add(new FooClass(args))
}}
}//initFromFile
Run Code Online (Sandbox Code Playgroud)
编辑
更仔细地阅读问题的第一部分,似乎fooDB应该是一个初始化的类成员:
class Program
{
private static List<FooClass> fooDB;
static void Main(string[] args)
{
initFromFile();
foreach(FooClass f in fooDB)
{
// do something
}
}
private static initFromFile()
{
fooDB = new List<FooClass>();
using (StreamReader ... )
{
while( ... )
{
...
fooDB.Add(new FooClass(args))
}
}
}//initFromFile
}//Program
Run Code Online (Sandbox Code Playgroud)