gpt4 book ai didi

c# - 具有 C# 8 可空引用类型的 TryGetValue 模式

转载 作者:太空狗 更新时间:2023-10-29 23:19:52 26 4
gpt4 key购买 nike

我正在尝试将一些代码移植到 C# 以启用可为 null 的引用类型,并且我在我们的代码中遇到了一些使用 TryGetValue 模式的函数。

也就是说,像这样:

public bool TryGetSession(string key, out Session session) {
session = null; // assign default
// code which looks for a session based on the key, etc
// return true or false if we found the session key
}

我们在这里试图表达的模式是“如果返回值为真,那么 session 是非空的。如果为假,那么甚至不要试图查看 session ,这是垃圾。

问题是我现在在 session = null 上收到警告,但我不得不将 something 放在那里,因为 out 参数必须由函数填充。

这里有好的答案吗?我的想法:

我可以放弃 TryGet 模式并接受可为空的引用类型(这是 Swift 等其他语言似乎在做的事情)例如

Session? GetSession(string key);

或者,我可以使用占位符值来实现我的“非空” promise ,例如

public bool TryGetSession(string key, out Session session) {
session = new InvalidSession(); // assign default
...
}

还有其他选择吗?

最佳答案

如果你像我一样来晚了一点,事实证明 .NET 团队通过一堆参数属性解决了这个问题,比如 MaybeNullWhen(returnValue: true)System.Diagnostics.CodeAnalysis 可用于 try 模式的空间。

返回一个 swift 风格的可为 null 的引用类型效果很好,但 try 模式允许您将错误之类的东西作为额外的输出参数返回。

public bool TryGetSession(string key, [NotNullWhen(returnValue: true)] out Session? session, [NotNullWhen(returnValue: false)] out string? error)
{
// etc
}


// This is okay:
if(TryGetSession("cheese", out var session, out var error))
{
var time = session.Time;
}

// But this is not:
_ = TryGetSession("cheese", out var session, out var error);
var time = session.Time;
// "CS8602: Dereference of a potentially null reference"

更多详情:

关于c# - 具有 C# 8 可空引用类型的 TryGetValue 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55526064/

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