Почему мы не можем заблокировать тип значения?

Я пытался заблокировать переменную Boolean, когда столкнулся со следующей ошибкой :

'bool' is not a reference type as required by the lock statement

Похоже, что в операторах lock разрешены только ссылочные типы, но я не уверен, что понимаю почему.

Андреас в своем комментарии утверждает:

Когда объект [типа значения] передается от одного потока к другому, создается копия, поэтому потоки в итоге работают с двумя разными объектами, что безопасно.

Это правда? Значит ли это, что когда я делаю следующее, я фактически изменяю два разных x в методе xToTrue и xToFalse?

public static class Program {

    public static Boolean x = false;

    [STAThread]
    static void Main(string[] args) {

        var t = new Thread(() => xToTrue());
        t.Start();
        // ...
        xToFalse();
    }

    private static void xToTrue() {
        Program.x = true;
    }

    private static void xToFalse() {
        Program.x = false;
    }
}

(этот код сам по себе явно бесполезен в своем состоянии, он только для примера)


P.S: Я знаю об этом вопросе на Как правильно заблокировать тип значения. Мой вопрос не связан с как, а связан с почему.

51
задан Community 23 May 2017 в 02:10
поделиться