情况:
我有def index
@products = Product.all.where(:product_category_id == 1)
end
。我需要通过引用将特定索引传递给函数,因为我遍历它们并且我需要更改受影响的那个。以下是我尝试/使用的方法
方法1
List<DataGridView> temp
然而,我可以这样做:
方法2
functionA(ref temp[0]);
A property, indexeur or access to a dynamic member cannot be passed as ref or out (free traduction)
这项工作。是否有办法使用我的方法1 而不是使用方法2 中的技巧?
答案 0 :(得分:1)
根据您的评论,您似乎只想更改列表中项目的属性,而不是更改列表以引用其他项目。在这种情况下ref
不是必需的,因为DataGridView
是一个引用类型 - 这意味着当您将一个变量传递给一个函数时,实际上是将一个引用传递给一个对象(是不与&#34;传递参考&#34;)相同。
只需从方法签名和调用语法中取出ref
,就可以了。
如果做想要更改列表中的对象,则需要将列表传递给方法并以某种方式识别要更新的对象(例如索引):
public void functionA(List<DataGridView> list, int index)
{
list[index] = {some new object}
}
请注意,在这种情况下不需要ref
,因为List<T>
也是引用类型。
答案 1 :(得分:1)
类似的问题也曾多次提出过,以下链接应该有所帮助:
What is the use of "ref" for reference-type variables in C#?
Idea仍然是ref或out关键字就像对引用的引用,比如指向指针的指针,因此它们可以用于将引用更改为一个不同的分配。在常规情况下,它将通过值传递引用,因此即使可以更改字段和属性的值,但也无法更改原始内存引用。
我们不能对属性,索引器使用ref关键字,因为它无法确定它们是否已经实现了setter或只读,因此你需要复制到变量,就像你所做的那样,没有这样的问题,无论是否可写,请查看以下讨论:
C# property and ref parameter, why no sugar?
正如已经建议更改DataGridView中的值,您可以传递简单类型,它可以修改对象的可访问属性/字段
答案 2 :(得分:0)
为此,我实现了一个 Generic Wrapper 来保存引用,其中引用可以通过两种方式之一初始化,传递对象本身或List和索引,并且具有吸气剂和二传手
public class Ref<T>
{
private T _ref;
private IList<T> list;
private int index;
public Ref(T _ref)
{
this._ref = _ref;
}
public Ref(IList<T> list, int index)
{
this.list = list;
this.index = index;
}
public void set(T _ref)
{
if (this._ref == null)
{
this.list[index] = _ref;
}
else
{
this._ref = _ref;
}
}
public T get()
{
if (this._ref == null)
{
return this.list[index];
}
else
{
return this._ref;
}
}
}
而不是通过引用传递,传递所需类型的Ref