gpt4 book ai didi

c# - c# 中 `this` 和 `ref` 的等效功能

转载 作者:行者123 更新时间:2023-12-03 21:14:51 24 4
gpt4 key购买 nike

如果我在一个类中有一个函数:

/* class snipped */
private void Expect(ref Utf8JsonReader reader, JsonTokenType t)
{
reader.Read();
/* snip */
}

由于对象正在被操作,因此通过引用传递,这与静态辅助函数有什么不同:
/*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()}");
}

最佳答案

您可以编写许多扩展方法,但它们真的相关吗?在扩展方法中编写每件事都会生成意大利面条式代码。

我会去in关键词。 in的预付款在 ref是您无法修改参数,但您不会获得副本(如“正常”参数)。您也可以将只读字段传递为 in范围。

private void Expect(in Utf8JsonReader reader, in JsonTokenType t)
{
reader.Read();
/* snip */
}

关于c# - c# 中 `this` 和 `ref` 的等效功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61488887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com