以下是我的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" });
}
}
答案 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
{ }
}