使用"ref"关键字将List <Class>作为参数传递给C#

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

D S*_*ley 8

你的程序结构的方式很好,除了不需要使用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)