使用“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
你的程序结构的方式很好,除了不需要使用ref
。 List
是一个引用类型 ,这意味着传递给函数的值实际上是一个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