如何通过ref传递列表单元格?

时间:2015-07-13 17:16:15

标签: c#

情况:

我有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 中的技巧?

3 个答案:

答案 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