Наконец-то я это понял :-) Я опубликую свое мнение :-): -)
Сейчас ...
using (MyType something = new MyType())
метаэквивалентно
using (readonly MyType something = new MyType())
с readonly
, имеющим то же значение ключевого слова readonly
в объявлении класса / структуры.
Если MyType
является ссылкой, то это ссылка (а не ссылка)объект), который "защищен".Таким образом, вы не можете сделать:
using (readonly MyType something = new MyType())
something = null;
, но вы можете
something.somethingelse = 0;
в используемом блоке.
Если MyType
является типом значения, то readonly
«Модификатор» распространяется на его поля / свойства.Поэтому они не ввели новый тип «const-ness / readonly-ness» в using
, они просто использовали тот, который у них был.
Таким образом, вопрос должен быть: почему я не могу изменитьполя / свойства readonly
типов значений?
Обратите внимание, что если вы сделаете это:
public void Dispose()
{
Console.WriteLine("During dispose: {0}", n);
}
var sss = new MyStruct();
using (sss)
{
sss.n = 12;
Console.WriteLine("In using: {0}", sss.n); // 12
}
Console.WriteLine("Outside using: {0}", sss.n); // 12
Результат
In using: 12
During dispose: 0
Outside using: 12
, поэтому using
делает«Частная» копия sss
, и sss.n = 12
обращается к «оригиналу» sss
, в то время как Dispose
обращается к копии.