Re[3]: Как передать null в out параметр ? (и возможно ли эт
От: _FRED_ Черногория
Дата: 11.08.09 10:53
Оценка: :))) :))) :))
Здравствуйте, Аноним, Вы писали:

_FR>>Никак. Заводить dummy-переменные и передавать их:


А> Обидно.


А>Возможно, Microsoft исправит это в следующей версии .NET


Обязательно.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Как передать null в out параметр ? (и возможно ли эт
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.08.09 11:46
Оценка: 55 (6) :)
Здравствуйте, <Аноним>, Вы писали:

А>Да, действительно, предложенный вами вариант делает то, что мне нужно, вполне можно использовать расширения.


А>Однако, чисто теоретически, интересует возможность в будущих версиях дотнета вместо out-параметра подставлять что-то типа defaultValue или специальной "пустой" памяти под переменную. Я вот тут, кстати, ответил, зачем я задал этот вопрос: http://rsdn.ru/forum/dotnet/3501146.1.aspx
Автор:
Дата: 12.08.09

А, такое-то можно сделать хоть сейчас, безо всяких теоретических будущих версий дотнета.
Держи:
public static class Dummy<T>
{
    public static T Value;
}

Применять по необходимости:
Foo1(out Dummy<int>.Value);
Foo2(out Dummy<A>.Value);
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Как передать null в out параметр ? (и возможно ли это ?
От: Lloyd Россия  
Дата: 11.08.09 10:53
Оценка: 17 (3) +2
Здравствуйте, Аноним, Вы писали:

А>Я пытался на место out параметра поставить null, но компилятор ругается: Cannot convert '<null>' to ...



А>Как обойти ?


public static AExtensions {
    public static void Foo1(this A a) {
        int x;
        a.Foo1(out x);
    }
    public static void Foo2(this A a) {
        A x;
        a.Foo2(out x);
    }
}
Re[5]: Как передать null в out параметр ? (и возможно ли эт
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.09 08:25
Оценка: 9 (1)
Здравствуйте, samius, Вы писали:
S>Я бы к полю добавил [ThreadStatic] атрибут.
А, собсно, зачем? По идее, чтение из него должно быть запрещено — поэтому нам всё равно, сколько потоков сваливают в поле мусор.
Конечно, есть риск, что в Foo делаются предположения о значении переменной в процессе исполнения:
void Foo(out int a)
{
  a=0;
  for (var i = 0; i < 10; i++)
    a += i;
}

Но, вообще говоря, ошибка — именно в Foo, а не в Dummy: нельзя закладываться на то, что у тебя эксклюзивное владение out параметром. С тем же успехом мы могли нарваться на неожиданное поведение и в единственном потоке — если Foo вызывает какой-нибудь callback:
public void Foo(out int a, Predicate<int> breakCondition)
{
  a = 0;
  for(var i=0; !breakCondition(i); i++)
    a += i;
}

....

int crash;
Foo(out crash, i=> {crash = 0; return i>=10;});

Поэтому сам по себе ThreadStatic, имхо, не шибко поможет. Хотя...
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Как передать null в out параметр ? (и возможно ли эт
От: mrjeka Россия  
Дата: 11.08.09 14:17
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Возможно, Microsoft исправит это в следующей версии .NET

Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы.
Если Вам не требуется именно этот функционал, может стоит задуматься о необходимости этого параметра?
Re[6]: Как передать null в out параметр ? (и возможно ли эт
От: Lloyd Россия  
Дата: 11.08.09 15:00
Оценка: +1
Здравствуйте, mrjeka, Вы писали:

E>>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.


M>Я просто плохо представляю ситуацию, когда есть необходимость в метод передавать null по out.


А null и не надо передавать. Просто компилятор мог бы сгенерить локальную переменную и передавать ее адрес.
Re[6]: Как передать null в out параметр ? (и возможно ли эт
От: samius Япония http://sams-tricks.blogspot.com
Дата: 13.08.09 08:39
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, samius, Вы писали:

S>>Я бы к полю добавил [ThreadStatic] атрибут.
S>А, собсно, зачем? По идее, чтение из него должно быть запрещено — поэтому нам всё равно, сколько потоков сваливают в поле мусор.
S>Конечно, есть риск, что в Foo делаются предположения о значении переменной в процессе исполнения:
S>
S>void Foo(out int a)
S>{
S>  a=0;
S>  for (var i = 0; i < 10; i++)
S>    a += i;
S>}
S>

Именно. Внутри метода out параметр выглядит (да и ведет себя) "почти" как обычный параметр и может быть использован как локальная переменная.

S>Но, вообще говоря, ошибка — именно в Foo, а не в Dummy: нельзя закладываться на то, что у тебя эксклюзивное владение out параметром.

Да, нельзя. Но кто об этом задумывается или задумавшись об этом помнит всегда?

S>Поэтому сам по себе ThreadStatic, имхо, не шибко поможет. Хотя...

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

Вообще, мне идея с Dummy<T> понравилась, но только как ход мысли. Я бы не стал использовать такую штуку в повседневной жизни для экономии на стэке или просто ради удобства.
Re[6]: out и ref параметры - это ЗЛО
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 13.08.09 09:42
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Конечно, есть риск, что в Foo делаются предположения о значении переменной в процессе исполнения:


void Foo (ref int x, ref int y)
{
  x = 1;
  y = 2;
  if (x == 1) {/* интересно, попадем ли мы сюда? */}
}

.....
Foo(ref i, ref i)
....



Общий вывод — при использовании ref и out параметров нельзя быть уверенным ни в чем....
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re[7]: out и ref параметры - это ЗЛО
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.09 09:58
Оценка: +1
Здравствуйте, xvost, Вы писали:

X>Общий вывод — при использовании ref и out параметров нельзя быть уверенным ни в чем....

Почему? Можно много в чём быть уверенными.
void Foo(ref int x, ref int y)
{
  var x_ = x;
  var y_ = y;
  x_ = 1;
  y_ = 2;
  if (x_ == 1) {/* интересно, попадем ли мы сюда? Капитан Неуверенность */}
  {
    Console.WriteLine("Я думаю, попадём! Капитан Очевидность");
  }
  
  // работа метода типа завершена; пора вернуть результат потомкам
  x = x_;
  y = y_;
  // тут мы, конечно, не можем быть уверены за алиасы. Но это уже caller-проблем, потому что наша логика была изолирована от возможного алиасинга.
}
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: out и ref параметры - это ЗЛО
От: _FRED_ Черногория
Дата: 13.08.09 10:49
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>Относительно сабжа:

_FR>

out и ref параметры — это ЗЛО

_FR>А как, для примера, эффективно реализовать без "out" IDictionary<,>.TryGetValue?

Сам же себе и отвечу: через Option и т.п., но в шарпе нет удобной поддержки для него
Действительно, будь удобная поддержка [в языке] туплов-опшенов, out-ref действительно нужно было бы выбросить хотя бы из употребления.
Help will always be given at Hogwarts to those who ask for it.
Как передать null в out параметр ? (и возможно ли это ?)
От: Аноним  
Дата: 11.08.09 10:32
Оценка:
У меня есть некоторые функции Foo1 и Foo2:

class A
{
public void Foo1(out int x){ /* ... */ }

public void Foo2(out A a) { /* ... */ }
}


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

Я пытался на место out параметра поставить null, но компилятор ругается: Cannot convert '<null>' to ...


Как обойти ?
Re: Как передать null в out параметр ? (и возможно ли это ?
От: _FRED_ Черногория
Дата: 11.08.09 10:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так вот, возвращаемые через out параметры я получать не хочу. Также не хочу объявлять специально для этого переменные, чтобы получать ненужные мне параметры.

А>class A
А>{
А>  public void Foo1(out int x){ /* ... */ }
А>  public void Foo2(out A a) { /* ... */ }
А>}

А>Я пытался на место out параметра поставить null, но компилятор ругается: Cannot convert '<null>' to ...
А>Как обойти ?

Никак. Заводить dummy-переменные и передавать их:
A a = /**/;

int dummy;
a.Foo1(out dummy);

A unused;
a.Foo2(out unused);
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как передать null в out параметр ? (и возможно ли эт
От: Аноним  
Дата: 11.08.09 10:48
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Никак. Заводить dummy-переменные и передавать их:


Обидно.

Возможно, Microsoft исправит это в следующей версии .NET
Re[4]: Как передать null в out параметр ? (и возможно ли эт
От: Ellin Россия www.rsdn.ru
Дата: 11.08.09 14:19
Оценка:
Здравствуйте, mrjeka, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Возможно, Microsoft исправит это в следующей версии .NET

M>Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы.
M>Если Вам не требуется именно этот функционал, может стоит задуматься о необходимости этого параметра?
Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.
Re[4]: Как передать null в out параметр ? (и возможно ли эт
От: Lloyd Россия  
Дата: 11.08.09 14:30
Оценка:
Здравствуйте, mrjeka, Вы писали:

А>>Возможно, Microsoft исправит это в следующей версии .NET

M>Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы.

Они вроде как уже что-то похожее реализовали для работы с COM-овскими ref-параметрами.
Re[5]: Как передать null в out параметр ? (и возможно ли эт
От: mrjeka Россия  
Дата: 11.08.09 14:57
Оценка:
Здравствуйте, Ellin, Вы писали:

E>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.


Я просто плохо представляю ситуацию, когда есть необходимость в метод передавать null по out.
Re[7]: Как передать null в out параметр ? (и возможно ли эт
От: mrjeka Россия  
Дата: 11.08.09 15:26
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, mrjeka, Вы писали:


E>>>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.


Я бы на всех лица посмотрел, если MS это исправит. И аргументы интересно было бы услышать.

M>>Я просто плохо представляю ситуацию, когда есть необходимость в метод передавать null по out.


L>А null и не надо передавать. Просто компилятор мог бы сгенерить локальную переменную и передавать ее адрес.




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

Я пытался на место out параметра поставить null, но компилятор ругается: Cannot convert '<null>' to ...


Вопрос, зачем тогда в методе этот параметр передается через out? Если это метод сторонней библиотеки и исправить это нельзя, то пишите обертки этих методов.
Re[2]: Как передать null в out параметр ? (и возможно ли эт
От: mrjeka Россия  
Дата: 11.08.09 15:30
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>
L>public static AExtensions {
L>    public static void Foo1(this A a) {
L>        int x;
L>        a.Foo1(out x);
L>    }
L>    public static void Foo2(this A a) {
L>        A x;
L>        a.Foo2(out x);
L>    }
L>}
L>


Я извиняюсь , но приведите пример использования этого.
Re[3]: Как передать null в out параметр ? (и возможно ли эт
От: QrystaL Украина  
Дата: 11.08.09 18:17
Оценка:
M>Я извиняюсь , но приведите пример использования этого.

Там должно быть так:

public static class AExtensions {
    public static void Foo1(this A a) {
        int x;
        a.Foo1(out x);
    }
    public static void Foo2(this A a) {
        A x;
        a.Foo2(out x);
    }
}
Re[3]: Как передать null в out параметр ? (и возможно ли эт
От: midcyber
Дата: 11.08.09 19:18
Оценка:
Здравствуйте, mrjeka, Вы писали:

M>Я извиняюсь :shuffle: , но приведите пример использования этого.


Так:
a.Foo1();
a.Foo2();


Можно и обертку, возвращающую значение, если создание объекта A кушать много не просит
public static A Foo2(this A a) 
{
  A x = default(A);
  a.Foo2(out x);
  return x;
}
Re[4]: Как передать null в out параметр ? (и возможно ли эт
От: Аноним  
Дата: 11.08.09 22:07
Оценка:
Здравствуйте, midcyber, Вы писали:

M>Здравствуйте, mrjeka, Вы писали:


M>>Я извиняюсь , но приведите пример использования этого.


M>Так:

M>
M>a.Foo1(); //Это вызов
M>a.Foo2();
M>


class A
{
public void Foo1(out int x){ /* ... */ }

public void Foo2(out A a) { /* ... */ }
}

Вот так было. Топикастер не желает создавать объекты А за ненабностью их использования.
И что получили?


public static class AExtensions {
    public static void Foo1(this A a) {
        int x;
        a.Foo1(out x);//Требуется объяление метода Foo1 в классе А
    }
    public static void Foo2(this A a) {
        A x;
        a.Foo2(out x);//Требуется объяление метода Foo2 в классе А
    }
}



И даже если там поправить чтобы работало
Создали объект, который создавать не хотелось и вызвали расширеный метод


a.Foo1();
a.Foo2();



И что выиграли?
Re[5]: Как передать null в out параметр ? (и возможно ли эт
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.08.09 22:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>class A
А>{
А>public void Foo1(out int x){ /* ... */ }

А>public void Foo2(out A a) { /* ... */ }
А>}
А>

А>Вот так было. Топикастер не желает создавать объекты А за ненабностью их использования.
Топикстартер не желал объявлять переменные. Про создание объекта A он ничего не говорил, тем более что без создания объекта A не получится вызвать методы экземпляра.

А>И что получили?


А>
А>public static class AExtensions {
А>    public static void Foo2(this A a) {
А>        A x;
А>        a.Foo2(out x);//Требуется объяление метода Foo2 в классе А
А>    }
А>}
А>


А>И даже если там поправить чтобы работало

А>Создали объект, который создавать не хотелось и вызвали расширеный метод
Где конкретно создали объект? Выделенное выражение не создает объект, а только объявляет переменную типа A.

А>
А>a.Foo1();
А>a.Foo2();
А>


А>И что выиграли?

Выиграли то, что просил топикстартер. Напоминаю, он не хотел объявлять лишние переменные при вызове методов с out параметрами.
Re[6]: Как передать null в out параметр ? (и возможно ли эт
От: Аноним  
Дата: 12.08.09 04:47
Оценка:
Здравствуйте, samius, Вы писали:


public static class AExtensions {
    public static void Foo2(this A a) {
        A x;
        a.Foo2(out x);//Требуется объяление метода Foo2 в классе А
    }
}


Метод Foo2 есть как расширенный так и в классе А.
Когда Вы пишете a.Foo2() то какой метод вызывается?

a.Foo1();
a.Foo2();


А>>И что выиграли?

S>Выиграли то, что просил топикстартер. Напоминаю, он не хотел объявлять лишние переменные при вызове методов с out параметрами.

Не проще написать Foo1() и Foo2() без параметров в классе А?
Re[7]: Как передать null в out параметр ? (и возможно ли эт
От: mrjeka Россия  
Дата: 12.08.09 06:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, samius, Вы писали:


А>Метод Foo2 есть как расширенный так и в классе А.

А>Когда Вы пишете a.Foo2() то какой метод вызывается?

Метод класса A отличается от extension сигнатурой.

А>Не проще написать Foo1() и Foo2() без параметров в классе А?

С этим вполне согласен.
Re[4]: Как передать null в out параметр ? (и возможно ли эт
От: Аноним  
Дата: 12.08.09 06:37
Оценка:
Здравствуйте, mrjeka, Вы писали:

M>Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы.


Ну не совсем так: out сделаны, чтобы функция могла возвращать более, чем 1 параметр, скажем так 3-4, причем возможно разных типов.

M>Если Вам не требуется именно этот функционал, может стоит задуматься о необходимости этого параметра?


У меня есть либа, которую я не могу править. Там куча функций, у которых 3-4 out-параметра, которыми я никаким боком после вызова фунции не пользуюсь. Мне что, каждый раз объявлять 3-4 ненужные переменные, которые я потом все равно не буду использовать ?

Я читал, что в последнем дотнете вызывать функции можно как-то по-другому, сейчас не помню, как эта фишка называется, но она там есть...

Возможно, в последующих версиях Microsoft что-то изменит ...
Re: Как передать null в out параметр ? (и возможно ли это ?
От: vodolas  
Дата: 12.08.09 07:38
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>У меня есть некоторые функции Foo1 и Foo2:


А>
А>class A
А>{
А>public void Foo1(out int x){ /* ... */ }

А>public void Foo2(out A a) { /* ... */ }
А>}
А>


А>Я пытался на место out параметра поставить null, но компилятор ругается: Cannot convert '<null>' to ...

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

class A
{
  public void Foo1(out int x){ /* ... */ }
  public void Foo2(out A a) { /* ... */ }
  public void SuperFoo2() 
  { 
     A dummy;
     Foo2(dummy);
  }
}

Теперь для вызова Foo2 можно не использовать параметров ваще, вызвав SuperFoo2
Насколько я понимаю, это и требовалось топикстартеру
А>Как обойти ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Re[2]: Как передать null в out параметр ? (и возможно ли эт
От: Аноним  
Дата: 12.08.09 08:11
Оценка:
Да, действительно, предложенный вами вариант делает то, что мне нужно, вполне можно использовать расширения.

Однако, чисто теоретически, интересует возможность в будущих версиях дотнета вместо out-параметра подставлять что-то типа defaultValue или специальной "пустой" памяти под переменную. Я вот тут, кстати, ответил, зачем я задал этот вопрос: http://rsdn.ru/forum/dotnet/3501146.1.aspx
Автор:
Дата: 12.08.09
Re[7]: Как передать null в out параметр ? (и возможно ли эт
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.08.09 09:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, samius, Вы писали:


А>Метод Foo2 есть как расширенный так и в классе А.

А>Когда Вы пишете a.Foo2() то какой метод вызывается?
Метод расширение.

А>>>И что выиграли?

S>>Выиграли то, что просил топикстартер. Напоминаю, он не хотел объявлять лишние переменные при вызове методов с out параметрами.

А>Не проще написать Foo1() и Foo2() без параметров в классе А?

Очевидно, это не во власти топикстартера.
Re[5]: Как передать null в out параметр ? (и возможно ли эт
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.08.09 11:46
Оценка:
Здравствуйте, Ellin, Вы писали:
E>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.

Не исправит. По философским соображениям. С# не будет пытаться угадать, что вы имели в виду. Если вы хотите выкинуть ненужное возвращаемое значение — напишите код, который делает именно это.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как передать null в out параметр ? (и возможно ли эт
От: samius Япония http://sams-tricks.blogspot.com
Дата: 13.08.09 08:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>А, такое-то можно сделать хоть сейчас, безо всяких теоретических будущих версий дотнета.

S>Держи:
S>
S>public static class Dummy<T>
S>{
S>    public static T Value;
S>}
S>

S>Применять по необходимости:
S>
S>Foo1(out Dummy<int>.Value);
S>Foo2(out Dummy<A>.Value);
S>


Я бы к полю добавил [ThreadStatic] атрибут.
Re[7]: Как передать null в out параметр ? (и возможно ли эт
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.09 08:59
Оценка:
Здравствуйте, samius, Вы писали:
S>Именно. Внутри метода out параметр выглядит (да и ведет себя) "почти" как обычный параметр и может быть использован как локальная переменная.
S>Да, нельзя. Но кто об этом задумывается или задумавшись об этом помнит всегда?
Хм. Есть в студии фанаты FxCop? Кто мог бы нарулить два рула:
1. Запрет на чтение из Dummy<> переменной (жосткий, всегда)
2. Запрет на чтение out — параметра внутри метода
S>>Поэтому сам по себе ThreadStatic, имхо, не шибко поможет. Хотя...
S>Я не рассчитываю, что он поможет. Но то что он исключит появление трудноуловимых и не сильновероятных багов — это да.
Ок, да. Пожалуй воспроизводимость однопоточных багов достаточно высока — в отличие от многопоточных. Согласен, ThreadStatic поможет.
S>Вообще, мне идея с Dummy<T> понравилась, но только как ход мысли. Я бы не стал использовать такую штуку в повседневной жизни для экономии на стэке или просто ради удобства.
Я бы тоже
Там есть слишком много потенциальных дырок — даже с ThreadStatic.
Пример, который я привел, конечно же клинический.
Но есть значительно более реалистичный сценарий: несколько параметров. Aliasing problem приведёт к тому, что метод запросто может начать наступать сам себе на пятки.
А поскольку сам класс только и полезен, что для использования в методах, где много out-параметров, шансы нарваться на такое достаточно высоки. Особенно замечательно то, что при отсутствии доступа к исходникам метода, понять суть происходящего будет, мягко говоря, затруднительно.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Как передать null в out параметр ? (и возможно ли эт
От: _FRED_ Черногория
Дата: 13.08.09 09:15
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>2. Запрет на чтение out — параметра внутри метода


Да, это отличный рулез
Help will always be given at Hogwarts to those who ask for it.
Re[7]: out и ref параметры - это ЗЛО
От: _FRED_ Черногория
Дата: 13.08.09 10:16
Оценка:
Здравствуйте, xvost, Вы писали:

X>Общий вывод — при использовании ref и out параметров нельзя быть уверенным ни в чем....


Sinclair как раз и показал, как нужно писать код, что бы можно было быть уверенным. А если писать "неправильно", то действительно "нельзя быть уверенным ни в чем", совсем "ни в чем"
Help will always be given at Hogwarts to those who ask for it.
Re[7]: out и ref параметры - это ЗЛО
От: mrjeka Россия  
Дата: 13.08.09 10:32
Оценка:
Здравствуйте, xvost, Вы писали:

X>Здравствуйте, Sinclair, Вы писали:


S>>Конечно, есть риск, что в Foo делаются предположения о значении переменной в процессе исполнения:


void Foo (ref int x, ref int y)
{
  x = 1;
  y = 2;
  if (x == 1) {/* интересно, попадем ли мы сюда? */}
}



X>Общий вывод — при использовании ref и out параметров нельзя быть уверенным ни в чем....


Используйте их по мере их назначения и не будет проблем.

Код без ref


void Foo(obj a, obj b)
{
  a = b;
  if(a == b) {//Не факт, что Вы и сюда попадете :) }
}


Так что ref и out тут не виноваты
Re[7]: out и ref параметры - это ЗЛО
От: _FRED_ Черногория
Дата: 13.08.09 10:38
Оценка:
Здравствуйте, xvost, Вы писали:

Относительно сабжа:

out и ref параметры — это ЗЛО


А как, для примера, эффективно реализовать без "out" IDictionary<,>.TryGetValue?
Help will always be given at Hogwarts to those who ask for it.
Re[8]: out и ref параметры - это ЗЛО
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.08.09 11:03
Оценка:
Здравствуйте, _FRED_, Вы писали:
_FR>А как, для примера, эффективно реализовать без "out" IDictionary<,>.TryGetValue?
Pair<bool, TResult> TryGetValue(TKey key)?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: out и ref параметры - это ЗЛО
От: _FRED_ Черногория
Дата: 13.08.09 11:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

_FR>>А как, для примера, эффективно реализовать без "out" IDictionary<,>.TryGetValue?

S>Pair<bool, TResult> TryGetValue(TKey key)?

Да, так на самом деле тоже неплохо (по сравнению с Option).
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.