0
public virtual IAsyncResult BeginProcessRequest(RequestContext context, AsyncCallback callback, object state)
{
    return this.process.BeginInvoke(**ref context**, callback, state);
}

public virtual RequestContext EndProcessRequest(IAsyncResult result)
{
    RequestContext context = null;
    this.process.EndInvoke(**ref context**, result);
    return context;
}

上述两种方法在我的项目中引起了一些警告。我不确定我是否理解他们。警告是:

参数是 'ref' 而参数被声明为 'value'

并且警告的位置是 Invoke 调用中的第一个参数(上下文)。有没有人认为这有什么问题或对这个问题有一些建议?

那些双星号是警告的原因。我在编辑器上点击了“粗体”,它做到了,所以我就跟着它去了。星号不在我的代码中。

4

3 回答 3

7

IMO,与代表一起使用ref是个坏主意。(老实说,我想说这通常是个坏主意。让你的方法做一件事并产生一个结果。)

我认为它根本不起作用 - 但显然它确实起作用,只要您在ref调用时也提供参数EndInvoke

using System;

class Program
{
    delegate void Foo(ref int x, string y);

    static void SampleFoo(ref int x, string y)
    {
        Console.WriteLine("Incoming: {0}", x); // 10
        x = y.Length;
    }

    static void Main(string[] args)
    {
        int x = 0;
        int input = 10;
        Foo f = SampleFoo;
        IAsyncResult result = f.BeginInvoke(ref input, "Hello", null, null);
        f.EndInvoke(ref x, result);
        Console.WriteLine("Result: {0}", x); // 5
    }
}

这里的行为可能令人困惑......如果可能的话,我会避免它。

的大多数用途ref是由于不了解参数传递在 C#中的工作原理......这里有可能是这种情况吗?你真的需要第一个参数ref吗?您可以将委托的返回值改为新的上下文吗?

于 2011-07-05T19:06:46.003 回答
5

BeginInvoke可能不期望ref那里有一个参数。你在说ref context,即传递对该对象的引用(本身就是一个引用)。你能确认方法签名BeginInvoke吗?

于 2011-07-05T19:06:31.360 回答
1

我认为您并不完全了解其ref工作原理。

首先,ref(or out) 是方法签名的一部分,因此如果在方法中将参数指定为ref参数,则必须使用ref,否则不得使用ref

其次在:

public virtual IAsyncResult BeginProcessRequest(RequestContext context, AsyncCallback callback, object state)
{
    return this.process.BeginInvoke(ref context, callback, state);
}

ref不会做任何事情,因为您不使用任何地方的新值contextref就像一个out参数,只是它既是“in”又是“out”。普通参数只能被认为是“in”(我正在编造术语“in”)。

于 2011-07-05T19:14:42.447 回答