C#WCF返回带/不带REF / OUT的参数

时间:2013-04-25 05:27:53

标签: c# wcf out ref

以下是我的WCF服务代码的简化版本。此代码工作正常,并返回数据。

我的问题是,这只有在我通过ref或out传递customers对象时才有效。如果我修改整个代码以便传递客户对象WITHOUT ref或out i中的计数变量为0。

如果List是一个引用变量,为什么这与ref / out一起工作,如果没有ref / out就不能工作。

另请注意,我将无法从方法返回值,因为我必须返回多个值。

客户代码:

List<Customer> customers = null;
ClientProxy proxy = new ClientProxy();
proxy.GetCustomers(ref customers);
int i = customers.Count;

服务代理:

public class ClientProxy
{
    public void GetCustomers(ref List<Customer> customers)
    {
        INWGetCustomers proxy = new ChannelFactory<INWGetCustomers>("netNamedPipeBinding").CreateChannel();
        proxy.GetCustomers(ref customers);
    }
}

服务合同&amp;数据合同:

[DataContract]
public class Customer
{
    [DataMember]
    public System.String CustomerId;

    [DataMember]
    public System.String CompanyName;
}

[ServiceContract(Namespace = "http://www.temp.com")]
public interface INWGetCustomers
{
    [OperationContract()]
    void GetCustomers(ref List<Customer> customers);
}

服务代码:

public class NWGetCustomersService : INWGetCustomers
{
    public void GetCustomers(ref List<Customer> customers)
    {
        customers = new List<Customer>();
        customers.Add(new Customer() { CustomerId = "1", CompanyName = "A" });
        customers.Add(new Customer() { CustomerId = "2", CompanyName = "B" });
        customers.Add(new Customer() { CustomerId = "3", CompanyName = "C" });
        customers.Add(new Customer() { CustomerId = "4", CompanyName = "D" });
    }
}

2 个答案:

答案 0 :(得分:1)

这是因为在此上下文中使用ref或out强制将列表视为输出参数。它不是真正通过引用传递,因为对象是在服务器和客户端之间发送的。如果查看WSDL,您将看到.NET如何生成此代码

总结:它与客户端和服务器上的对象不同,因此列表是引用变量并不重要

答案 1 :(得分:0)

始终我们必须记住,对象的引用是按值传递的。调用方法时,它将拥有自己的引用值副本。如果方法内的参考值发生变化,它将不会反映在外部变量中。 (我的意思是如果创建了新实例并且相关参考值被分配给方法变量,那么它将不会更新到外部变量)。这就是为什么你必须在你的方法中添加ref。执行以下代码段。然后使用方法签名和调用者中添加的ref关键字修改代码。你可以意识到差异。

namespace ParameterSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = null;
            GetValue(customer);
            Console.WriteLine("In Main Method : Is customer Null? >>  " + (customer == null));
            Console.Read();
        }
        public static void GetValue(Customer customer)
        {
            customer = new Customer();
            Console.WriteLine("Inside GetValue Method : Is customer Null ? >>  " + (customer == null));
        }
    }
    class Customer
    { }
}