Ответ 1
Er... Я не знаю, что такое протокол для предоставления ответов на ваши собственные вопросы, но статья, на которую ссылается Стивен Бекке, предоставила мне некоторые подсказки, чтобы вывести решение этой странной ситуации и вместо того, чтобы оставлять всех остальных в поиске каковы последствия, я думал, что делюсь своими выводами...
Итак, рассмотрим следующие веб-методы, определенные в моем WebService
[WebMethod]
public string Method1()
{
return "This is my return value";
}
[WebMethod]
public void Method2(out string strVal1)
{
strVal1 = "This is my value passed as an output";
//No return value
}
[WebMethod]
public void Method3(out string strVal1, out string strVal2)
{
strVal1 = "This is my strVal1 value passed as an output";
strVal2 = "This is my strVal2 value passed as an output";
//No return value
}
[WebMethod]
public string Method4(out string strVal1, out string strVal2)
{
strVal1 = "This is my strVal1 value passed as an output";
strVal2 = "This is my strVal2 value passed as an output";
return "This is my return value";
}
Теперь... согласно документу, первый параметр, определяемый как Out, если метод возвращает void, тогда первый параметр автоматически используется как возвращаемый параметр. Поэтому я бы получил доступ к каждому из моих методов следующим образом:
Метод1: общедоступная строка Method1() {}
var str = svc.Method1();
Console.WriteLine(str);
Метод2: public void Method2 (out string strVal1) {}
var str = svc.Method2();
Console.WriteLine(str);
Таким образом, вы получаете доступ к ним обоими точно так же..., что крайне сбивает с толку. Кто бы мог понять это, не сказав это кем-то другим? Это вне моего понимания, как это может быть хорошей идеей...
Метод3: public void Method3 (out string strVal1, out string strVal) {}
var str2 = String.Empty;
var str1 = svc.Method3(out str2);
Console.WriteLine(str1);
Console.WriteLine(str2);
Метод4: общедоступная строка Method4 (out string strVal1, out string strVal2) {}
var str1 = String.Empty;
var str2 = String.Empty;
var str3 = svc.Method4(out str1, out str2);
Console.WriteLine(str1);
Console.WriteLine(str2);
Console.WriteLine(str3);
Итак, как вы заметили - если сигнатура метода не предоставляет возвращаемое значение [, которое возвращает void], то первым параметром становится возвращаемое значение. Если он уже предоставляет возвращаемое значение, то это не так.
Это может быть очень запутанным для тех, кто не сталкивался с этим документом. Большое спасибо за предоставление этой ссылки Стивену - я действительно ценю это.
... и для тех, кто решил, что шаблон дизайна был хорошей идеей для написания в .NET Framework - я не могу думать, что бы вы полагали, что это хорошая идея... Мне очень не нравится вы очень интенсивно после всего этого.
ДОПОЛНЕНИЕ:
То, что я только что понял, заключается в том, что для добавления к путанице, если вы используете ref вместо out, тогда вы этого не сделаете, вы будете обрабатывать WebMethod точно так же, как если бы вы использовали их для вызова регулярный метод внутри вашего приложения:
[WebMethod()]
public void Method3(ref string strVal1, ref string strVal2)
{
strVal1 = "First argument return value";
strVal2 = "Second argument return value";
}
Теперь позвоните, чтобы использовать:
string val1 = String.Empty;
string val2 = String.Empty;
svc.Method3(ref val1, ref val2);
Console.WriteLine(val1);
Console.WriteLine(val2);
Эта несогласованность - это умение... тот факт, что он по дизайну непостижим для меня.