使用“ref”关键字将List 作为参数传递给C#

朋友们!

所以我一直在写一个简单的程序。 基本上,我有一个类(3个字符串,1个int,一些方法)。 我正在从文本文件初始化此类的对象的值。 我正在使用List。 问题是初始化是一个单独的function。 我在这个函数中声明并初始化了List BOTH。 但是,我可能在其他function中需要它,包括“Program.Main”。

我应该制作一个“全球”课程并制作一个公开的List 吗? 我决定立即在我的Program.Main函数中声明它。 但是,我不确定,List是通过值还是通过引用传递的。 我在网上找到了一个页面,建议使用ref关键字。 我现在有:

public Class FooClass {...} class Program { static void Main(string[] args) { List fooDB = new List; initFromFile(ref fooDB); } private static initFromFile(ref List fooDB) { using (StreamReader ... ) { while( ... ) { ... fooDB.Add(new FooClass(args)) } } }//initFromFile }//Program 

我应该继续像这样工作吗? 还是有任何重要的建议? 也许“参考”根本不是一个好习惯?

TLDR:我应该制作全局列表还是将其作为参考或其他方式传递(建议)。 如果通过引用传递,那么我应该使用ref关键字还是有另一种方式?

提前致谢,

~~~ hlfrmn

你的程序结构的方式很好,除了不需要使用refList是一个引用类型 ,这意味着传递给函数的值实际上是一个List实例的引用(C / C ++术语中的“指针”)。 因此,当函数返回时,对方法中列表的任何修改都将可用。

使用ref的唯一原因是你想将fooDB指向一个新实例

 private static initFromFile(ref List fooDB) { fooDB = new List; // 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 

编辑

更仔细地阅读问题的第一部分,似乎fooDB应该是一个初始化的类成员

 class Program { private static List fooDB; static void Main(string[] args) { initFromFile(); foreach(FooClass f in fooDB) { // do something } } private static initFromFile() { fooDB = new List(); using (StreamReader ... ) { while( ... ) { ... fooDB.Add(new FooClass(args)) } } }//initFromFile }//Program 

通用列表是reference types因此您不需要使用ref关键字。如果您在方法列表中进行更改,则会影响您的实际列表。

除非您尝试直接在initFromFile函数内设置initFromFile值,否则不需要将其作为ref参数传递。 请注意,.NET中的类是引用类型 ,因此当您将列表传递给方法时,方法参数引用传入的同一实例(而不是值类型 )。 ref参数用于修改传递给方法引用的参数和变量的值。 在典型的.NET开发中,几乎不需要使用ref参数。

只需正常传递它,它将工作:

 static void Main(string[] args) { List fooDB = new List; initFromFile(fooDB); } private static initFromFile(List fooDB) { using (StreamReader ... ) { while( ... ) { ... fooDB.Add(new FooClass(args)) } } } 

鉴于上面的代码示例,我建议你的initFromFile()方法只返回列表,即

 public Class FooClass {...} class Program {static void Main(string[] args) { var fooData = initFromFile(); } private static List initFromFile() { var fooDB = new List(); using (StreamReader ... ){ while( ... ) { ... fooDB.Add(new FooClass(args)) }} return fooDB; }//initFromFile }//Program