c#参数是'ref'而parameter声明为'value'

本文关键字:声明 value parameter 参数 ref | 更新日期: 2023-09-27 18:01:21

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调用中的第一个参数(上下文)。有人认为这有什么问题吗?或者对这个问题有什么建议吗?

那些双星号是警告的原因。我在编辑器上按了"加粗"键,它就这么做了,所以我就这么做了。星号不在我的代码中

c#参数是'ref'而parameter声明为'value'

使用ref与委托是一个坏主意,在我看来。(老实说,这通常是个坏主意。让你的方法只做一件事,只有一个结果。

我不认为它会工作-但显然它可以,只要你在调用EndInvoke时提供ref参数:

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吗?你能把委托的返回值改为新的上下文吗?

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

我认为你没有完全理解ref的工作原理。

首先,ref(或out)是方法签名的一部分,所以如果在方法中参数被指定为ref参数,那么必须使用ref,否则不能使用ref

其次:

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

ref没有做任何事情,因为您没有在任何地方使用context的新值。ref类似于out参数,只是它同时是"in"answers"out"。普通参数只能被认为是"in"(我正在编造术语"in")。