Подтвердить что ты не робот

Являются ли С# автоматически реализованными статические свойства потокобезопасными?

Я хотел бы знать, являются ли С# автоматически реализованные свойства, например public static T Prop { get; set; }, потокобезопасными или нет. Спасибо!

4b9b3361

Ответ 1

Это не так. Это декомпиляция с помощью Reflector:

private static string Test
{
    [CompilerGenerated]
    get
    {
        return <Test>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        <Test>k__BackingField = value;
    }
}

Ответ 2

В разделе 10.7.4 спецификации С# указано:

Когда свойство указано как автоматически реализуемое имущество, скрытое фоновое поле автоматически доступный для объекта, и Аксессоры реализуются для чтения из и напишите в это фоновое поле. следующий пример:

public class Point {
  public int X { get; set; } // automatically implemented
  public int Y { get; set; } // automatically implemented
}

эквивалентно следующему объявлению:

public class Point {
  private int x;
  private int y;
  public int X { get { return x; } set { x = value; } }
  public int Y { get { return y; } set { y = value; } }
}

Это то, что мы обещаем, и то, что вы получаете. Точка авто недвижимости - это сделать самую основную, простую, дешевую вещь; если вы хотите сделать что-то более интересное, тогда вы должны написать "реальное" свойство.

Ответ 3

Нет. Вы должны обернуть их механизмами блокировки потоков.

object _lock = new object();
public static Main(string[] args)
{
    lock(_lock)
    {
         Prop = new T();
    }


    T val = null;
    lock(_lock)
    {
         val = Prop;
    }
}

Ответ 4

Я так не верю. Я считаю, что это просто синтаксический сахар для:

private static T _prop;
public static T Prop
{
    get { return _prop; }
    set { _prop = value; }
}

Ответ 5

Синхронизация не обеспечивается с автоматическими свойствами, включая статические свойства.

Если вам нужна полная безопасность потоков, вы захотите использовать свои собственные свойства с помощью поля поддержки и самостоятельно выполнить синхронизацию.

Ответ 6

Для полноты, полевые события do встроены в потокобезопасность, но в этом они одни. Автоматически реализованные свойства не имеют таких функций. Вы можете, однако, сделать что-то вроде:

public static double SomeProp
{   // ### NOT RECOMMENDED ###
    [MethodImpl(MethodImplOptions.Synchronized)] get;
    [MethodImpl(MethodImplOptions.Synchronized)] set;
}

Проблема заключается в том, что он заблокирует Type, который является плохой вещью. Я лично выполнил бы свою собственную синхронизацию.

Ответ 7

Нет, они не потокобезопасны. Статические свойства, столь же уязвимые, как статические поля, относятся к concurrency проблемам.