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调用中的第一个参数(上下文)。有人认为这有什么问题吗?或者对这个问题有什么建议吗?
那些双星号是警告的原因。我在编辑器上按了"加粗"键,它就这么做了,所以我就这么做了。星号不在我的代码中
使用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")。