В целом out
является то, что он гарантирует (ну, на уровне C# хотя бы ... не уровень ИЛ), чтобы перезаписать это значение. Целью этого является избежать ненужных заданий, при этом разрешая «определенное задание».Например:
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"
}
'default (int) == 0' –
Вам не нужно инициализировать i, заменить первую строку на' int i; ', и код должен по-прежнему работать. –