В качестве альтернативы отличному ответу Мотти, вы также можете Set
переменную, чтобы соответствовать вашему начальному описательному объекту, а затем расширить его по мере необходимости:
Set myPage = Browser("StackOverflow").Page("name:=StackOverflow", "html id:=PageID")
, после чего вы можете использовать
myPage.WebEdit("name:=asdfgh")
во всем остальном коде, пока объект myPage
остается в области видимости ...
Это выглядит довольно хорошим мне.
Посмотрите Реализацию Шаблона "одиночка" в C# для большего количества информации.
Править: Должен, вероятно, поместить возврат в блокировке, все же.
Это более информационно, чем что-либо еще.
То, что Вы отправили, является перепроверяемым алгоритмом блокировки - и что Вы отправили, будет работать, насколько я знаю. (С Java 1.5 это работает там, также.) Однако это очень хрупко - если Вы понимаете какой-либо бит превратно его, Вы могли бы представить очень тонкие условия состязания.
Я обычно предпочитаю инициализировать одиночный элемент в статическом инициализаторе:
public class Singleton
{
private static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get { return instance; }
}
private Singleton()
{
// Do stuff
}
}
(Добавьте статического конструктора, если Вы хотите немного дополнительной лени.)
Тот шаблон, легче разобраться, и в большинстве случаев, это делает точно также.
Существует больше детали на моей одноэлементной странице реализации C# (также связано Michael).
Что касается опасностей - я сказал бы, что самая большая проблема состоит в том, что Вы теряете тестируемость. Вероятно, не слишком плохо для входа.
Singleton имеет потенциал, чтобы стать узким местом для доступа к ресурсу, воплощенному классом и вызвать последовательный доступ к ресурсу, который мог иначе использоваться параллельно.
В этом случае это не может быть плохой вещью, потому что Вы не хотите нескольких объектов, пишущих в Ваш файл в тот же момент, и несмотря на это я не думаю, что Ваша реализация будет иметь тот результат. Но это - что-то для знания.
Вы используете перепроверяемую блокировку, что считают антишаблоном. Википедия имеет шаблоны с и без ленивой инициализации для различных языков.
После создания одноэлементного экземпляра необходимо, конечно, удостовериться, что все методы ориентированы на многопотоковое исполнение.
Лучшее предложение состояло бы в том, чтобы установить регистратор на однопоточном шаге установки, таким образом, это, как гарантируют, будет там при необходимости в нем. В службе Windows OnStart является великолепным местом, чтобы сделать это.
Другой опцией, которую Вы имеете, является к используемому Система. Поточная обработка. Взаимно блокируемый. CompareExchange (T %, T, T): T метод для выключения. Это менее сбивает с толку, и это, как гарантируют, будет работать.
System.Threading.Interlocked.CompareExchange<Logging>(_instance, null, new Logging());
Необходимо удостовериться, что каждый метод в регистраторе безопасно выполнить одновременно, т.е. что они не пишут в общее состояние без надлежащей блокировки.
Существует некоторая дискуссия относительно необходимости сделать первую проверку для нулевого использования Thread.VolatileRead (), если вы используете шаблон блокировки с двойной проверкой и хотите, чтобы он работал на всех моделях памяти. Пример дебатов можно прочитать по адресу http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/b1932d46-877f-41f1-bb9d-b4992f29cedc/ . [1222 Тем не менее, я обычно использую решение Джона Скита сверху.
Я думаю, ориентированы ли Регистрирующиеся методы экземпляра на многопотоковое исполнение нет ничего для волнения о.