使用ref与C类#

Nef*_*zen 18 c# pointers reference keyword

我想给我正在制作的课程提供一个链接列表.我希望该类写入该列表(例如通过.addLast()).

我应该使用ref关键字吗?

我对在C#中使用refout关键字的位置感到有些困惑,因为所有都在堆上动态分配,我们实际上使用指针进行大多数操作.
当然,outref关键字作出原语和结构感.

另外,如果我不直接发送列表,但发送包含列表的类?(它是internal必需的),我还需要使用ref吗?或者如果我在函数之间传递它,ex:

void A(ref LinkedList<int> list){
    B(list);
}

void B(ref LinkedList<int> list){
    _myList = list;
}
Run Code Online (Sandbox Code Playgroud)

Nol*_*rin 28

这是ref在C#中使用关键字的常见误解.它的目的是通过引用传递值或引用类型,并且只需要在需要直接引用实际参数的特定情况下,而不是参数的副本(无论是值还是引用本身) .在任何情况下,都不要将引用类型引用通过混淆.

Jon Skeet撰写了一篇关于C#中参数传递的优秀文章,它比较和对比了值类型,引用类型,传递值,传递引用(ref)和输出参数(out).我建议你花点时间仔细阅读这些内容,你的理解应该变得更加清晰.

引用该页面中最重要的部分:

价值参数:

默认情况下,参数是值参数.这意味着在函数成员声明中为变量创建了一个新的存储位置,它以您在函数成员调用中指定的值开始.如果更改该值,则不会更改调用中涉及的任何变量

参考参数:

引用参数不传递函数成员调用中使用的变量的值 - 它们使用变量本身.不是在函数成员声明中为变量创建新的存储位置,而是使用相同的存储位置,因此函数成员中的变量值和引用参数的值将始终相同.引用参数需要ref修饰符作为声明和调用的一部分 - 这意味着当你通过引用传递某些东西时它总是很清楚.让我们看看前面的例子,只是将参数更改为参考参数:

总结一下:在阅读了我的回复和Jon Skeet的文章之后,我希望您会看到在您的问题的上下文中使用关键字没有任何必要ref.

  • 按值传递一个类*会复制该值.这里的关键是"值"实际上是对象的*引用* - 所以你只是创建一个指向堆上相同对象(引用类型)的新引用. (5认同)

Jon*_*n B 16

对于你正在做的事情,你不需要使用ref.如果您确实使用ref传递了列表,那么您将允许调用者更改您引用的列表,而不仅仅是更改列表的内容.


Spe*_*ort 11

您需要在引用类型中使用ref的唯一情况是您要在函数内创建新对象.

示例#1:ref不需要关键字.

// ...
   List myList = new List();
   PopulateList(myList);
// ...
void PopulateList(List AList)
{
   AList.Add("Hello");
   AList.Add("World");
}
Run Code Online (Sandbox Code Playgroud)

示例#2:ref必要的关键字.

// ...
   List myList;
   PopulateList(ref myList);
// ...
void PopulateList(ref List AList)
{
   AList = new List();
   AList.Add("Hello");
   AList.Add("World");
}
Run Code Online (Sandbox Code Playgroud)