Другим способом решения этой проблемы является ведение списка строк, которые представляют методы, которые были вызваны. Строки даже не должны быть именем метода, они просто должны быть уникальными для каждого метода.
Тогда у вас может быть вспомогательный метод с именем ShouldIRun
, который принимает уникальную строку функции и проверяет, существует ли она в списке. Если это так, то метод возвращает false
, а если нет, то метод добавляет строку в список и возвращает true
.
Приятно то, что вам не нужно поддерживать кучу переменных состояния, вы можете использовать это с любым количеством методов, а сами методы не нуждаются в сложной логике - они просто запрашивают помощник, если они должны бежать или нет!
public class Program
{
private static List<string> CalledMethods = new List<string>();
static bool ShouldIRun(string methodName)
{
if (CalledMethods.Contains(methodName)) return false;
CalledMethods.Add(methodName);
return true;
}
// Now this method can use method above to return early (do nothing) if it's already ran
static void OnlyCalledOnce()
{
if (!ShouldIRun("OnlyCalledOnce")) return;
Console.WriteLine("You should only see this once.");
}
// Let's test it out
private static void Main()
{
OnlyCalledOnce();
OnlyCalledOnce();
OnlyCalledOnce();
GetKeyFromUser("\nDone! Press any key to exit...");
}
}
Выход