Nef*_*zen 18 c# pointers reference keyword
我想给我正在制作的课程提供一个链接列表.我希望该类写入该列表(例如通过.addLast()).
我应该使用ref关键字吗?
我对在C#中使用ref和out关键字的位置感到有些困惑,因为所有类都在堆上动态分配,我们实际上使用指针进行大多数操作.
当然,out和ref关键字作出原语和结构感.
另外,如果我不直接发送列表,但发送包含列表的类?(它是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.
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)