Я только что написал установщик свойств, и мне пришла в голову мысль, почему нам не нужно return
результат set
, когда свойство может быть задействовано в цепочке операторов =
, то есть:
var a = (b.c = d);
(я добавил скобки для ясности - но на практике это не имеет значения)
Я задумался - откуда компилятор C # получает значение, присвоенное a
в приведенном выше примере?
Логика говорит, что она должна быть результатом операции (b.c = d)
, но поскольку она реализована методом void set_blah(value)
, она не может быть.
единственные другие опции:
- Перечитать
b.c
после присвоения и использовать это значение Повторно использовать d
Редактировать (после ответа и комментариев Эрика) - есть третий вариант, который делает C #: используйте значение, записанное в b.c
после того, как произошли какие-либо преобразования
Теперь, на мой взгляд, правильное прочтение приведенной выше строкикод
установить a
на результат установки b.c
на d
Я думаю, что это разумное прочтение кода - поэтому я подумалпроверим, действительно ли это то, что происходит с немного надуманным тестом - но спросите себя, считаете ли вы, что оно должно пройти или не пройти:
public class TestClass
{
private bool _invertedBoolean;
public bool InvertedBoolean
{
get
{
return _invertedBoolean;
}
set
{
//don't ask me why you would with a boolean,
//but consider rounding on currency values, or
//properties which clone their input value instead
//of taking the reference.
_invertedBoolean = !value;
}
}
}
[TestMethod]
public void ExampleTest()
{
var t = new TestClass();
bool result;
result = (t.InvertedBoolean = true);
Assert.IsFalse(result);
}
Этот тест не пройден .
Более тщательное изучение IL, сгенерированного для кода, показывает, что значение true
загружается в стек, клонируется с помощью команды dup
, а затем оба выталкиваются в двух последовательных назначениях.
Этот метод отлично работает для полей, но мне кажется ужасно наивным для свойств, где каждое на самом деле является вызовом метода, где фактическое конечное значение свойства не гарантируется как входное значение.
Теперь я знаю, что многие люди ненавидятвложенные задания и т. д. и т. д., но факт заключается в том, что язык позволяет вам выполнять их, и поэтому они должны работать как положено.
Возможно, я действительно толстый, но для меня это предполагаетправильная реализация этого шаблона компилятором (.Net 4 кстати).Но тогда мое ожидание / чтение кода неверно?