Являются ли автоматически реализованные статические свойства C # потокобезопасными? - PullRequest
22 голосов
/ 15 января 2010

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

Ответы [ 7 ]

51 голосов
/ 16 января 2010

Раздел 10.7.4 спецификации C # гласит:

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

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; } }
}

Это то, что мы обещаем, и это то, что вы получаете. Смысл авто свойств заключается в том, чтобы сделать самую простую, дешевую вещь; если вы хотите сделать что-то более изворотливое, вам следует написать «реальное» свойство.

15 голосов
/ 15 января 2010

Похоже, нет.Это декомпиляция с Reflector:

private static string Test
{
    [CompilerGenerated]
    get
    {
        return <Test>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        <Test>k__BackingField = value;
    }
}
6 голосов
/ 15 января 2010

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

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


    T val = null;
    lock(_lock)
    {
         val = Prop;
    }
}
4 голосов
/ 16 января 2010

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

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

Проблема в том, что он заблокирует Type, что плохо . Лично я бы реализовал собственную синхронизацию для этого.

4 голосов
/ 15 января 2010

Для автоматических свойств не предусмотрена синхронизация, в том числе статические.

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

4 голосов
/ 15 января 2010

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

private static T _prop;
public static T Prop
{
    get { return _prop; }
    set { _prop = value; }
}
2 голосов
/ 15 января 2010

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

...