gpt4 book ai didi

c# - 将输出参数更改为返回值

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:39 24 4
gpt4 key购买 nike

我需要将“out”改为“return”,因为这样使用起来会更舒服,但我真的不知道如何将这些功能转换为使用“return”而不是“out”。我有公共(public)课,在这个课上我有 bool 方法

    public static bool GetParameter(this Dictionary<string, string> context, string parameterName, out int parameter) 
{
string stringParameter;
context.TryGetValue(parameterName, out stringParameter);
return int.TryParse(stringParameter, out parameter);
}

我像这样使用这个函数:

    private int _personID;
public void SomeFunction()
{
_classInstance.Context.GetParameter("PersonID", out _personID);
}

谢谢!

最佳答案

如果您不愿意使用 out 参数,我可以想到两个不错的选择。不过,我应该说,从你的问题来看,这似乎是最好的方法。

我通常认为避免这样的试用模型的原因只有两个:

  • 涉及异步调用时。例如,测试数据库中是否存在某些内容并在存在时将其返回,使用 out 参数效果不佳。
  • 当您流畅地做某事时,例如在 LINQ 中。

除此之外,它是一个很好用的模型,可以在不牺牲数据完整性(或对您可能期望的内容做出任何假设)的情况下传达大量信息。

这里的问题以及您返回 bool 当前状态的原因是处理错误。因此,您需要找到一种替代方法来处理它们。

此处的选择实际上取决于您期望的输入类型。

使用异常:

最简单的方法可能就是处理它们。让他们向上传播。如果找不到或无法解析某些内容,则抛出异常。

使用异常(exception)情况来指导常规申请流程通常被认为是不好的做法,但可以解释什么是“常规申请流程”。所以一定要看看你的数据和情况。

public static int GetParameter(this Dictionary<string, string> context, string parameterName) 
{
string stringParameter = context[parameterName];
return int.Parse(stringParameter);
}

使用空值:

如果您希望异常或多或少是常见的地方,您可以返回 null,并且只需将您的契约(Contract)设置为在发生非法事件时使用 null。不过,在调用方要小心处理!

与此类似的方法用于许多 IndexOf 函数,例如 string。它们返回 -1 而不是 null,但原理是相同的 - 拥有一个您知道永远不会出现在实际数据中的值,并设置您的契约(Contract),使其表示“这不起作用”。

这就是我之前提到数据完整性和假设时的想法。如果你想返回 yes 怎么办,字典确实包含一个空字符串,这应该意味着一个 null int。突然间,你不再能够传达这一点。所以是的,它有效,但这是你必须记住的决定。确保您的“失败”案例永远不会成为成功通过的结果。

public static int? GetParameter(this Dictionary<string, string> context, string parameterName)
{
string stringParameter;
if (!context.TryGetValue(parameterName, out stringParameter))
return null;

int ret;
if (!int.TryParse(stringParameter, out ret))
return null;

return ret;
}

返回具体类型:

这需要一些开销,但它具有 out 参数的所有好处,实际上并不需要它。

也就是说,我不确定我是否真的那么喜欢这一切。它为您提供的功能很棒,但是对于您使用它的目的,我感到非常沉重。但无论如何,它是另一种选择。

public class ParseResult
{
public ParseResult(bool IsSuccess, int Result)
{
this.IsSuccess = IsSuccess;
this.Result = Result;
}

public bool IsSuccess { get; set; }
public int Result { get; set; }
}

public static ParseResult GetParameter(this Dictionary<string, string> context, string parameterName)
{
int ret;
string stringParameter;
if (context.TryGetValue(parameterName, out stringParameter)
&& int.TryParse(stringParameter, out ret))
{
return new ParseResult(true, ret);
}
else
{
return new ParseResult(false, 0);
}
}

关于c# - 将输出参数更改为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29556440/

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