Передача свойства в качестве параметра "out" в С#

Предположим, что у меня есть:

public class Bob
{
    public int Value { get; set; }
}

Я хочу передать элемент Value в качестве параметра out, например

Int32.TryParse("123", out bob.Value);

но я получаю ошибку компиляции, аргумент "out" не классифицируется как переменная ". Есть ли способ достичь этого, или мне нужно будет извлечь переменную, à la:

int value;
Int32.TryParse("123", out value);
bob.Value = value;

Ответ 1

Вам нужно явно использовать поле и "нормальное" свойство вместо свойства, которое было автоматически реализовано:

public class Bob
{
    private int value;
    public int Value
    { 
        get { return value; } 
        set { this.value = value; }
    }
}

Затем вы можете передать поле в качестве параметра out:

Int32.TryParse("123", out bob.value);

Но, конечно, это будет работать только в одном классе, так как поле является частным (и должно быть!).

Свойства просто не позволяют делать это. Даже в VB, где вы можете передать свойство по ссылке или использовать его как параметр out, в основном существует дополнительная временная переменная.

Если вам не нужно возвращать значение TryParse, вы всегда можете написать свой собственный вспомогательный метод:

static int ParseOrDefault(string text)
{
    int tmp;
    int.TryParse(text, out tmp);
    return tmp;
}

Затем используйте:

bob.Value = Int32Helper.ParseOrDefault("123");

Таким образом, вы можете использовать одну временную переменную, даже если вам нужно сделать это в нескольких местах.

Ответ 2

Вы можете достичь этого, но не с помощью свойства.

public class Bob {
    public int Value { get; set; } // This is a property

    public int AnotherValue; // This is a field
}

Вы не можете использовать out на Value, но можете на AnotherValue.

Это будет работать

Int32.TryParse("123", out bob.AnotherValue);

Но в общих рекомендациях вам не нужно публиковать поле класса. Поэтому вы должны использовать временную переменную.