Я работаю в предположении, что у вас есть случай, когда вам действительно нужно знать, является ли это новым экземпляром, и что он собирается изменить ваш путь выполнения после возврата. Одним из способов является (хотя я содрогаюсь от этого) использование исключений (вариант 1). Но более вероятно, что вы захотите использовать опцию 2, чтобы просто перейти на возвращаемое значение.
public class SingletonForm : BaseFormcs
{
private static SingletonForm _instance;
//To stop new keyword from instantiation
private SingletonForm()
{ }
// ------- Option #1
// Use an OUT parameter for the instance, so it's set before the exception
public static void GetInstance(out SingletonForm form)
{
if (_instance == null)
{
_instance = new SingletonForm();
form = _instance;
return;
}
form = _instance;
throw new Exception("Form already exists"); // execution returns from here
// return isn't needed, since you threw an exception.
// You really, really shouldn't do this. Consider instead...
}
// -------- Option #2
// Same as above, but the return value tells you whether it's shiny and new
public static bool GetInstance(out SingletonForm form)
{
if (_instance == null)
{
_instance = new SingletonForm();
form = _instance;
return true; // yes, you created a new one
}
form = _instance;
return false; // no, you used an extant one
}
}
Этот второй вариант, вероятно, является вашей лучшей ставкой, поскольку он больше соответствует тому, что вы видите в Dictionary.TryGetValue (ключ KEY, значение VALUE).