C# c参数为';参考';而参数声明为';价值';

C# c参数为';参考';而参数声明为';价值';,c#,resharper,ref,performance,C#,Resharper,Ref,Performance,上述两种方法在我的项目中引起了一些警告。我不确定我是否理解他们。警告是: 参数为“ref”,而参数声明为“value” 警告的位置是调用中的第一个参数(上下文)。有没有人认为这有什么问题,或者对这个问题有什么建议 这些双星号是产生警告的原因。我在编辑器上点击了“粗体”,它就这样做了,所以我就这么做了。星号不在我的代码中。BeginInvoke可能不希望出现ref参数。您的意思是ref context,即传递对该对象的引用(引用本身)。你能确认BeginInvoke的方法签名吗?在代理中使用ref

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

参数为“ref”,而参数声明为“value”

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


这些双星号是产生警告的原因。我在编辑器上点击了“粗体”,它就这样做了,所以我就这么做了。星号不在我的代码中。

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);
}