2010-06-18 2 views
8

Когда метод определен с параметром out, почему мне нужно указывать ключевое слово out при его вызове. Его уже существует в определении метода, и среда выполнения должна знать, что любой переданный параметр будет выходным параметром.Почему нам нужно использовать ключевое слово out при вызове метода

Было бы разумно, если компилятор примет аргумент с ключевым словом или без него, с другой семантикой, но если вы ДОЛЖНЫ добавить ключевое слово, чтобы скомпилировать код, что использовать? Разве компилятор не должен обрабатывать его автоматически?

То же самое для исх

+6

Я думаю, это, чтобы сделать код более читаемым. – mohang

ответ

3

Может быть потому, что C# позволяет писать перегруженные так:

class X 
{ 
    public void Y(int i) { ... } 
    public void Y(out int i) { ... } 
} 

В этом случае компилирует не может понять, что метод с keywork out должен быть вызван, если вы не пишете это ключевое слово, если вы звоните метод. И вообще вы должны написать out, когда метод объявлен с этим ключом.

И, конечно, когда вы пишете out, когда вы вызываете метод, вы точно знаете, что этот variale можно изменить в методе. Это очень читаемо.

MSDN Article

11

Это действительно отлично подходит для чтения. Также это поможет вам избежать неожиданного поведения. При вызове метода с параметром out вы обязательно узнаете, что значение передаваемой переменной можно изменить.

+0

Не просто «можно изменить», если вы передадите параметр с «out», он будет изменен. Параметры вывода должны быть установлены до возвращения метода. – lxalln

+1

Да значение мачты должно быть задано в блоке тела метода, но я имею в виду, что вы можете установить одно и то же значение, чтобы никакие изменения не были замечены. – Incognito

7

Этого требования нет для компилятора. f (x, out y) мгновенно сообщает, кто читает код, который y будет перезаписан после того, как f вернется, без необходимости искать определение f, сохраняя при этом ментальные циклы процессора.

0

Это хороший момент, возможно, он имеет отношение к читаемости. позволяет сказать, у нас есть метод с двумя параметрами, например, так

bool TryGetString(string input, out string output) 

без указания из параметров, просто простой взгляд на кого-то, вызывающее этот метод, он не будет делать полным с тех пор.

0

, когда вы вызываете метод с ключевым словом out, ваш код вызова точно знает, что он передан по ссылке. В некоторых случаях вы можете столкнуться с методом в сторонней библиотеке, который имеет ключевое слово out в определении в то время, когда вы вызываете этот метод, вы не знаете, передан ли аргумент по ссылке или значению. Таким образом, вы вынуждены использовать out в вызывающем методе для чтения.