gpt4 book ai didi

.net - int.TryParse 覆盖作为输出参数传递的整数值

转载 作者:行者123 更新时间:2023-12-01 07:10:50 26 4
gpt4 key购买 nike

我有这个代码...

var i = int.MinValue;
var s = string.Empty;
int.TryParse(s, out i);

TryParse声明,值在 i变量被覆盖( as zero )并且我之前的值丢失了。

这是一个错误吗?如果否,是否有任何实现细节说明为什么需要重新初始化作为 out 传递的变量?范围

最佳答案

整点out是它保证(嗯,至少在 C# 级别......不是 IL 级别)覆盖这个值。这样做的目的是为了避免不必要的分配 ,同时允许“确定分配”。例如:

int i; // note: not assigned
var s = string.Empty;

// here "i" is not "definitely assigned"
int.TryParse(s, out i);
// here "i" is "definitely assigned"

这个想法是你使用返回值,例如:
if(int.TryParse(s, out i)) {
// here "i" makes sense; feel free to use it
} else {
// here you shouldn't use the value of "i"
}

在您的特定情况下,您可以重新订购:
if(!int.TryParse(s, out i)) i = int.MinValue;

特别要注意(至少在 C# 中)方法 必须赋值,然后 不能 使用传入的值;例如:
static void Foo(out int i) {
return; // error: hasn't assigned to i
}
static void Bar(out int i) {
int j = i; // error: cannot read from "i" until Bar has assigned a value
i = j;
}
static void Baz(out int i) {
i = 0; // note that after this assignment, code in Baz can read from "i"
}

对比 ref ;路过时 ref值,它是 需要 在调用者处明确分配。该方法本身可能会或可能不会查看传入值(按其选择),并且可能会或可能不会分配新值(按其选择)。例如:
int i;
SomeMethod(ref i); // illegal - "i" is not definitely assigned

int i = 0;
SomeMethod(ref i); // legal

和:
static void Foo(ref int i) {
return; // perfectly legal to not look at "i" and/or not assign "i"
}
static void Foo(ref int i) {
i = i + 1; // perfectly legal to look at "i" and/or assign "i"
}

关于.net - int.TryParse 覆盖作为输出参数传递的整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16685813/

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