Информация об изменениях

Сообщение Re: lock(this) или нет? от 25.09.2016 20:58

Изменено 29.09.2016 20:46 VladD2

Здравствуйте, RQ, Вы писали:

RQ>Добрый день,


RQ>в продолжение этой темы lock(this) — почему плохо? появился дополнительный вопрос. На просторах интернета был найден пример (воспроизвожу по памяти, но вроде бы ничего не напутал):


RQ>
RQ>public class A : B
RQ>{

RQ>    public IReadOnlyList<int> Foo { get; set;}

RQ>    public int Bar { get; set; }

RQ>    public A()
RQ>    {
RQ>        this.Init(this);
RQ>    }
RQ>}

RQ>public abstract class B
RQ>{
RQ>    private A a;

RQ>    protected void Init(A a)
RQ>    {
RQ>        this.a = a;
RQ>    }

RQ>    public void Update(IEnumerable<int> foo, int bar)
RQ>    {
RQ>        lock(this.a)
RQ>        {
RQ>            this.a.Foo = foo;
RQ>            this.a.Bar = bar;
RQ>        }
RQ>    }
RQ>}
RQ>


RQ>Вопросы:


RQ>1. lock(this.a) в данном случае эквивалентен lock(this) со всеми вытекающими последствиями?

RQ>2. на ваш взгляд имеет ли подобный вариант наследования право на жизнь — спрашиваю, потому что мне интуитивно не нравится такая конструкция, но сформулировать, что именно мне не нравится, я не могу.

RQ>PS продолжать тот топик не стал, вроде бы вопрос другого характера, если поступил не правильно извиняюсь.


This указывает на текущий экземпляр класса и не важно в коде базового класса или подкласса.

 protected void Init(A a)
        {
            Console.WriteLine(this==a);
            this.a = a;
        }


Выводит true.
Re: lock(this) или нет?
Здравствуйте, RQ, Вы писали:

RQ>Вопросы:


RQ>1. lock(this.a) в данном случае эквивалентен lock(this) со всеми вытекающими последствиями?

RQ>2. на ваш взгляд имеет ли подобный вариант наследования право на жизнь — спрашиваю, потому что мне интуитивно не нравится такая конструкция, но сформулировать, что именно мне не нравится, я не могу.

RQ>PS продолжать тот топик не стал, вроде бы вопрос другого характера, если поступил не правильно извиняюсь.


This указывает на текущий экземпляр класса и не важно в коде базового класса или подкласса.

 protected void Init(A a)
        {
            Console.WriteLine(this==a);
            this.a = a;
        }


Выводит true.