C # сбросить с оператором ref - PullRequest
0 голосов
/ 12 сентября 2018

Можно ли использовать оператор сброса C # 7 с оператором ref вместо out.

Пример:

int testInt;
if (!Int32.TryParse(AnyString, ref testInt)) {
   // do something
}

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Из документов :

В C # 7.0 отбрасывания поддерживаются в следующих назначениях контексты:

Деконструкция кортежей и объектов.
Сопоставление с шаблоном is и switch.
Вызов методов с параметрами out.
Автономный _, когда нет _ в области видимости.

int.TryParse явно ожидает out -параметр. Оператор, на которого вы ссылаетесь, не меняет этого.

Помимо этого ref подразумевает, что значение уже было инициализировано до некоторого значения для использования его в методе. Таким образом, ref эффективно используется, когда вам нужно предоставить значение и изменить его впоследствии, тогда как out просто ничего не делает с предоставленным значением, оно просто возвращает его. Вот почему вам нужно инициализировать переменную, переданную ref, где вам не нужно делать это для out -параметра.

Другими словами. Если у вас есть метод, который ожидает ref -параметр, вы можете использовать предоставленное значение и использовать его в своем методе:

void DoSomething(ref int i)
{
    var a = i + 1;
    i = a;
}

Это, очевидно, предполагает, что i имеет установленное значение.

С другой стороны, вы не можете ничего сделать 1044 * со значением, переданным как out внутри метода:

void DoSomething(out int i)
{
    var a = i + 1;  // won´t compile because i has not been set
    i = a;
}

Так почему оператор, на которого вы ссылаетесь, не работает для ref? Это просто то, что я сказал выше: использование ref предполагает, что вы инициализировали значение перед его передачей. Однако вы не можете инициализировать отброшенную переменную .

0 голосов
/ 13 сентября 2018

Вы не должны использовать ref здесь. Вместо этого вы должны использовать параметр out для сброса. Пример кода приведен ниже:

if(!int.tryParse(yourString, out string _)){//Do something}
0 голосов
/ 12 сентября 2018

То, что вы написали, не скомпилируется, поэтому я предполагаю, что вы используете это в качестве примера.Но ни один оператор сброса не может быть использован с ref.Я не уверен, почему вы тоже хотите.Если у вас есть сценарий использования, в котором вы хотите отказаться от вывода, просто используйте вместо него.

if (!Int32.TryParse(AnyString, out _)) {
   // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...