C# c参数为';参考';而参数声明为';价值';
上述两种方法在我的项目中引起了一些警告。我不确定我是否理解他们。警告是: 参数为“ref”,而参数声明为“value” 警告的位置是调用中的第一个参数(上下文)。有没有人认为这有什么问题,或者对这个问题有什么建议C# c参数为';参考';而参数声明为';价值';,c#,resharper,ref,performance,C#,Resharper,Ref,Performance,上述两种方法在我的项目中引起了一些警告。我不确定我是否理解他们。警告是: 参数为“ref”,而参数声明为“value” 警告的位置是调用中的第一个参数(上下文)。有没有人认为这有什么问题,或者对这个问题有什么建议 这些双星号是产生警告的原因。我在编辑器上点击了“粗体”,它就这样做了,所以我就这么做了。星号不在我的代码中。BeginInvoke可能不希望出现ref参数。您的意思是ref context,即传递对该对象的引用(引用本身)。你能确认BeginInvoke的方法签名吗?在代理中使用ref
这些双星号是产生警告的原因。我在编辑器上点击了“粗体”,它就这样做了,所以我就这么做了。星号不在我的代码中。
BeginInvoke
可能不希望出现ref
参数。您的意思是ref context
,即传递对该对象的引用(引用本身)。你能确认BeginInvoke
的方法签名吗?在代理中使用ref
是个坏主意,我认为(老实说,这通常是个坏主意。让你的方法做一件事,得到一个结果。)
我认为它根本不起作用,但显然它起作用了,只要在调用EndInvoke
时提供ref
参数:
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
的大多数用法都是由于不理解。。。这里可能是这样吗?您真的需要第一个参数是ref
?您可以将委托的返回值改为新上下文吗?我认为您不完全了解ref
的工作原理
首先,ref
(或out
)是方法签名的一部分,因此如果在方法中参数被指定为ref
参数,则您必须使用ref
,否则您不能使用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
没有任何作用,因为您没有在任何地方使用context
的新值ref
类似于out
参数,只是它同时是“in”和“out”。正常参数可以被认为是“in”(我在编术语“in”)。BeginInvoke的签名与他所在的方法签名相同:BeginInvoke(RequestContext上下文、AsyncCallback回调、对象状态)…@JBenjamin,如果方法签名具有ref
是,则只能使用ref
,这是我的观点-ref
做了一些非常具体的事情,除非调用的方法也声明ref
,否则不应该使用它。如果这不合理,建议检查这些文档。这不是什么大问题,我仍然可以编译,这似乎不是问题,但我真的讨厌“未知”:)进程的类型是什么@本杰明:嗯,听起来像是一个非常难看的代表签名……好吧,幸运的是,我不能说这是我自己写的。:)但是,令人困惑是正确的…我总是在这里告诉团队,“为您的程序员同伴编程”。。。并不总是发生在调用BeginInvoke
之后,context
没有新的值。当您调用EndInvoke
时会出现这种情况。请参阅我的答案以获取示例。正是这种奇怪的情况使得对异步委托使用ref
不是一个好主意…@Jon我意识到,我想也许我没有说清楚。我的意思是,如果BeginInvoke
被定义为使用ref
参数,那么ref
参数将被修改,否则就不需要将其设置为ref
。是的,并且ref参数可能会被修改,并且根据OP的EndProcessRequest
方法,在EndInvoke
期间使用另一个ref
参数读取新值。因此,ref
确实起到了作用-它允许在EndInvoke
调用中获取新值。
public virtual IAsyncResult BeginProcessRequest(RequestContext context, AsyncCallback callback, object state)
{
return this.process.BeginInvoke(ref context, callback, state);
}