Как уменьшить этот код, используя анонимные методы или анонимные типы? - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть веб-сервис и некоторые методы, и я НЕ хочу использовать этот код ниже, который прекрасно работает, потому что я намереваюсь использовать его в многопоточном приложении, где static (я читал) не является поточно-ориентированным.

Итак, теперь я просто повторил код, который находится в статическом методе returnisTrue () ниже, в теле моего метода веб-службы "myWebMethod", в точках // 1 из 3, // 2 из 3 и // 3 из 3. Это отлично работает, но приводит к раздутому коду.Есть ли более компактный способ, использующий функциональное программирование или анонимные методы, или что у вас есть, что я могу использовать?

Обратите внимание, что компилятор задохнулся, когда я попытался создать класс внутри метода ... который бы решил моюпроблема.

Как я уже сказал, у меня теперь нормально работает код, но он раздут, так как я повторяю "статический" метод returnisTrue три раза.

Спасибо.

РЕДАКТИРОВАТЬ: в ответ на некоторые вопросы о том, как сделать мой поток статического метода безопасным, с которым я, скорее, не беспокоюсь, но в интересах получения решения, которое я включаю ниже.

Весь этот код на стороне сервера ввеб-сервис

// I cannot unfortunately use this static method below--not thread safe
static private bool returnisTrue()
{
  bool isTrue = false;
  // do a bunch of stuff here
  return isTrue;
}

public  bool myWebMethod (string XYZ)
{
  //public Class myClassReturnisTrue  { … }  //will not compile

  bool isTrueOrNot1 = returnisTrue(); //1 of 3

  /// more code here

  bool  isTrueOrNot2 = returnisTrue(); //2 of 3

  ///more code here

  bool isTrueOrNot3 = returnisTrue(); //3 of 3

  return isTrueOrNot1 && isTrueOrNot2 && isTrueOrNot3;
}
 // here is the static method 'returnisTrue' it looks something like this:


 static private bool returnIsTrue(string A, string B)
 {
 if (A.Length() < B.Length())
     {
return true;
     }
else
return false;

 }

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Что вы на самом деле делаете в своем статическом методе? Вы изменяете какое-либо глобальное состояние или работаете только с локальными переменными? Нет ничего плохого в использовании статических методов или даже переменных, если вы принимаете надлежащие меры, чтобы убедиться, что ваш код на самом деле поточно-ориентирован.

Как статические методы, так и методы экземпляров могут быть небезопасными в зависимости от того, что вы делаете в них. Основной вопрос, который нужно задать: есть ли у вас доступ к каким-либо данным, доступным между несколькими потоками в вашем методе? И если так, то почему бы не изменить ваш метод на поточно-ориентированный (например, с помощью блокировки).

Взгляните, например, на саму платформу .NET, которая содержит различные статические поточно-ориентированные методы.

Редактировать:

Хорошо, теперь, когда мы увидели ваш метод - он уже действительно потокобезопасен. Метод не осуществляет доступ к каким-либо общим данным, и в результате строки являются неизменяемыми и по своей природе поточно-ориентированными на поток

1 голос
/ 29 ноября 2011

вы должны иметь возможность использовать статические методы, если у вас lock критические разделы (возможно, вы захотите посмотреть их на msdn -> http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)

...