Если у меня есть функция внутри класса:
/* class snipped */
private void Expect(ref Utf8JsonReader reader, JsonTokenType t)
{
reader.Read();
/* snip */
}
, которая передается по ссылке, поскольку объектом манипулируют, отличается ли это от вспомогательной функции stati c:
/*static class snipped*/
static public void Expect(this Utf8JsonReader reader, JsonTokenType t)
{
reader.Read();
/* snip */
}
// call helper via reader.Expect(requiredToken)
Я спрашиваю в случае каких-либо невидимых нюансов, когда используется ref
, он в большой степени присутствует в коде вместе с Utf8JsonReader
и Memory<T>
объектами, передаваемыми между вложенными функциями.
Я ищем рефакторинг (и в этом случае было бы гораздо лучше, если бы методы расширения объекта-читателя были).
являются this
(метод расширения во внешнем классе) и ref
(передача по ссылке между функциями) функционально эквивалентно?
Обновление - ref this
требуется ??
В качестве обновления простое использование this
не сработало, в рамках функции ExpectNamedProperty
она вызывала бы reader.Expect
но при возврате объект вернется. Каким-то образом создается копия в стеке или что-то происходит.
Я даже не знал, что это была допустимая комбинация, ref this
работает, тогда как this
только не изменяет. Нужно уточнить, не делать что-то ужасное!
public static void Expect(ref this Utf8JsonReader reader, JsonTokenType t)
{
reader.Read(); // this mutation is never passed back to caller
}
public static void ExpectNamedProperty(ref this Utf8JsonReader reader, string expectedPropertyName)
{
reader.Expect(JsonTokenType.PropertyName, expectedPropertyName);
// at this point it is as if the function above was never called
var foundPropertyName = reader.GetString();
if (foundPropertyName != StreamFieldNames.Event)
throw new JsonException($"expected {StreamFieldNames.Event} found {foundPropertyName} at position {reader.Position.GetInteger()}");
}