使用集合和 Ref 关键字
Using Collections and Ref Keyword
我正在阅读有关 ref
关键字的 MSDN 页面,并使用集合而不是 int 修改示例,如下所示:
public static void Main(string[] args)
{
List<int> elements = new List<int>();
Method(elements);
foreach(int val in elements)
{
Console.WriteLine(val);
}
}
static void Method(List<int> addelements)
{
addelements.Add(1);
addelements.Add(20);
}
为什么没有 ref
关键字我可以在方法之外看到添加到集合中的整数?当它只是 int val
时,我需要参考来查看方法所做的更改,但是 List<int>
不是这样,这是为什么?
更新:
还有一个问题,我现在理解了ref
关键字和Lists
。考虑到这一点,正在做以下多余的事情:
public static void Main(string[] args)
{
List<int> elements = new List<int>();
elements = Method(elements);
foreach(int val in elements)
{
Console.WriteLine(val);
}
}
static List<int> Method(List<int> addelements)
{
addelements.Add(1);
addelements.Add(20);
return addelements;
}
在c#中有引用类型和值类型两种对象。 (不安全情况下的指针类型)
传入函数时:
1) Refs 通过引用传递 // 不需要 ref
2) 值通过副本传递 // 你可以在这里使用 ref 来防止这种行为
static void Method(List<int> addelements) // list is referance type
列表是引用类型,它是整数的容器,所以如果容器是可变的,你可以改变它...
第二个问题:
取决于您在该方法中所做的事情...
1) 如果您想以后重用该方法,那将是个好主意
2) 如果您在该列表上有大量代码行,您可以使其更具描述性,将它们作为具有描述性名称的方法分开并按顺序调用它们,而不是在一个方法体中执行... (有点释放眼睛和大脑的压力:))
C#中有两种类型:引用类型和值类型(还有一种pointer type,但只用于不安全的上下文)
值类型直接包含值,而引用类型包含对数据的引用。
当将值类型的变量作为参数传递时,该方法接收原始对象的副本,因此在该方法内部所做的任何修改都会不坚持。
值类型由所有数值类型组成,bool
和枚举以及structs
您自己定义。
(值的主要类型是结构和枚举,因为数值和 bool
被实现为 struct
)。
Note that you can still pass a value type by reference by using the ref
keyword.
将引用类型作为参数传递时,该方法会收到引用的副本,因此该方法将使用同一个对象。因此 在方法内部所做的任何修改都将保留。
In C#, string
has a special behavior. It is passed by reference and is immutable (it cannot be modified - if you modify a string
object, the new value is copied into another object and your old variable references your new value.)
每个用户定义的class、接口和委托都是通过引用传递的。
此外,每个数组都是通过引用传递的。
因此,在您的情况下,您传递了一个 List<int>
,它是 class 的一个实例,因此它是通过引用传递的。
希望这能澄清一些事情。
祝你好运!
根据新问题更新
正如@fafase所说,你在那里做了两件事:
- 当您向列表添加元素时(在方法中),您正在修改原始列表。
- 当你return相同的引用时,所以当你这样做时:
elements = Method(elements);
您实际上从方法中将 elements
分配给您 return 的列表( 这与您首先传递的相同,因为它是通过引用传递的)
简而言之,如果您只需要修改列表,只需在 void
方法中进行,就像在原始问题中一样。
我正在阅读有关 ref
关键字的 MSDN 页面,并使用集合而不是 int 修改示例,如下所示:
public static void Main(string[] args)
{
List<int> elements = new List<int>();
Method(elements);
foreach(int val in elements)
{
Console.WriteLine(val);
}
}
static void Method(List<int> addelements)
{
addelements.Add(1);
addelements.Add(20);
}
为什么没有 ref
关键字我可以在方法之外看到添加到集合中的整数?当它只是 int val
时,我需要参考来查看方法所做的更改,但是 List<int>
不是这样,这是为什么?
更新:
还有一个问题,我现在理解了ref
关键字和Lists
。考虑到这一点,正在做以下多余的事情:
public static void Main(string[] args)
{
List<int> elements = new List<int>();
elements = Method(elements);
foreach(int val in elements)
{
Console.WriteLine(val);
}
}
static List<int> Method(List<int> addelements)
{
addelements.Add(1);
addelements.Add(20);
return addelements;
}
在c#中有引用类型和值类型两种对象。 (不安全情况下的指针类型) 传入函数时:
1) Refs 通过引用传递 // 不需要 ref
2) 值通过副本传递 // 你可以在这里使用 ref 来防止这种行为
static void Method(List<int> addelements) // list is referance type
列表是引用类型,它是整数的容器,所以如果容器是可变的,你可以改变它...
第二个问题: 取决于您在该方法中所做的事情...
1) 如果您想以后重用该方法,那将是个好主意
2) 如果您在该列表上有大量代码行,您可以使其更具描述性,将它们作为具有描述性名称的方法分开并按顺序调用它们,而不是在一个方法体中执行... (有点释放眼睛和大脑的压力:))
C#中有两种类型:引用类型和值类型(还有一种pointer type,但只用于不安全的上下文)
值类型直接包含值,而引用类型包含对数据的引用。
当将值类型的变量作为参数传递时,该方法接收原始对象的副本,因此在该方法内部所做的任何修改都会不坚持。
值类型由所有数值类型组成,bool
和枚举以及structs
您自己定义。
(值的主要类型是结构和枚举,因为数值和 bool
被实现为 struct
)。
Note that you can still pass a value type by reference by using the
ref
keyword.
将引用类型作为参数传递时,该方法会收到引用的副本,因此该方法将使用同一个对象。因此 在方法内部所做的任何修改都将保留。
In C#,
string
has a special behavior. It is passed by reference and is immutable (it cannot be modified - if you modify astring
object, the new value is copied into another object and your old variable references your new value.)
每个用户定义的class、接口和委托都是通过引用传递的。 此外,每个数组都是通过引用传递的。
因此,在您的情况下,您传递了一个 List<int>
,它是 class 的一个实例,因此它是通过引用传递的。
希望这能澄清一些事情。
祝你好运!
根据新问题更新
正如@fafase所说,你在那里做了两件事:
- 当您向列表添加元素时(在方法中),您正在修改原始列表。
- 当你return相同的引用时,所以当你这样做时:
elements = Method(elements);
您实际上从方法中将 elements
分配给您 return 的列表( 这与您首先传递的相同,因为它是通过引用传递的)
简而言之,如果您只需要修改列表,只需在 void
方法中进行,就像在原始问题中一样。