【发布时间】:2009-05-14 08:32:20
【问题描述】:
我正在实现一个 TryParse(string s, Out object result) 方法。 如果解析失败,我不想触及 out 参数,因此任何先前的结果都将保持不变。 但是VS2k8不会让我。无论如何,我都必须设置 out 对象的值。
为了取悦编译器,我应该只输入 result = result 吗?我错过了什么吗?
【问题讨论】:
我正在实现一个 TryParse(string s, Out object result) 方法。 如果解析失败,我不想触及 out 参数,因此任何先前的结果都将保持不变。 但是VS2k8不会让我。无论如何,我都必须设置 out 对象的值。
为了取悦编译器,我应该只输入 result = result 吗?我错过了什么吗?
【问题讨论】:
分配 null (或更一般的 default(T) )。你必须分配一个值,这就是“out”的意思。
【讨论】:
false,则调用代码甚至不应该真正查看此值。
您对 result = result 的建议不起作用,因为它是一个 out 参数 - 它并没有明确指定以开始,因此在 您已经 指定之前您无法读取它的值给它一个价值。
result = null;
绝对是使用object out 参数的正确方法。基本上将default(T) 用于您拥有的任何类型T。 (default 运算符在泛型方法中很有用 - 对于非泛型代码,我通常只使用 null, 0 等等。)
编辑:根据 Boris 的评论,可能值得详细说明 ref 参数和 out 参数之间的区别:
输出参数
参考参数
【讨论】:
result = null;
【讨论】:
只需输入一些默认值。例如 Int32.TryParse 方法置零。
【讨论】:
如果您不想分配值,则可以使用 ref 而不是 out,尽管这必须由调用者初始化。
【讨论】:
您可以在应该设置结果的代码之前抛出异常。
【讨论】: