Здравствуйте, Аноним, Вы писали:
_FR>>Никак. Заводить dummy-переменные и передавать их:
А> Обидно.
А>Возможно, Microsoft исправит это в следующей версии .NET
Обязательно.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, <Аноним>, Вы писали:
А>Да, действительно, предложенный вами вариант делает то, что мне нужно, вполне можно использовать расширения.
А>Однако, чисто теоретически, интересует возможность в будущих версиях дотнета вместо out-параметра подставлять что-то типа defaultValue или специальной "пустой" памяти под переменную. Я вот тут, кстати, ответил, зачем я задал этот вопрос: http://rsdn.ru/forum/dotnet/3501146.1.aspx
Здравствуйте, 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 параметр ? (и возможно ли эт
Здравствуйте, Аноним, Вы писали:
А>Возможно, Microsoft исправит это в следующей версии .NET
Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы.
Если Вам не требуется именно этот функционал, может стоит задуматься о необходимости этого параметра?
Re[6]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, mrjeka, Вы писали:
E>>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.
M>Я просто плохо представляю ситуацию, когда есть необходимость в метод передавать null по out.
А null и не надо передавать. Просто компилятор мог бы сгенерить локальную переменную и передавать ее адрес.
Re[6]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, 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> понравилась, но только как ход мысли. Я бы не стал использовать такую штуку в повседневной жизни для экономии на стэке или просто ради удобства.
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, _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 параметр ? (и возможно ли это ?
Здравствуйте, Аноним, Вы писали:
А>Так вот, возвращаемые через 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 параметр ? (и возможно ли эт
Здравствуйте, mrjeka, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
А>>Возможно, Microsoft исправит это в следующей версии .NET M>Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы. M>Если Вам не требуется именно этот функционал, может стоит задуматься о необходимости этого параметра?
Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.
Re[4]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, mrjeka, Вы писали:
А>>Возможно, Microsoft исправит это в следующей версии .NET M>Что за бред Вы несете? out для того и сделан, что в метод можно передавать не инициализированные объекты. В методе они должны быть проинициализированы.
Они вроде как уже что-то похожее реализовали для работы с COM-овскими ref-параметрами.
Re[5]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, mrjeka, Вы писали:
E>>>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.
Я бы на всех лица посмотрел, если MS это исправит. И аргументы интересно было бы услышать.
M>>Я просто плохо представляю ситуацию, когда есть необходимость в метод передавать null по out.
L>А null и не надо передавать. Просто компилятор мог бы сгенерить локальную переменную и передавать ее адрес.
Так вот, возвращаемые через out параметры я получать не хочу. Также не хочу объявлять специально для этого переменные, чтобы получать ненужные мне параметры.
Я пытался на место out параметра поставить null, но компилятор ругается: Cannot convert '<null>' to ...
Вопрос, зачем тогда в методе этот параметр передается через out? Если это метод сторонней библиотеки и исправить это нельзя, то пишите обертки этих методов.
Re[2]: Как передать null в out параметр ? (и возможно ли эт
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 параметр ? (и возможно ли эт
M>Я извиняюсь , но приведите пример использования этого.
Там должно быть так:
public staticclass 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 параметр ? (и возможно ли эт
Здравствуйте, 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 параметр ? (и возможно ли эт
А>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 параметр ? (и возможно ли эт
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 параметр ? (и возможно ли это ?
Здравствуйте, <Аноним>, Вы писали:
А>У меня есть некоторые функции 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
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, samius, Вы писали:
А>Метод Foo2 есть как расширенный так и в классе А. А>Когда Вы пишете a.Foo2() то какой метод вызывается?
Метод расширение.
А>>>И что выиграли? S>>Выиграли то, что просил топикстартер. Напоминаю, он не хотел объявлять лишние переменные при вызове методов с out параметрами.
А>Не проще написать Foo1() и Foo2() без параметров в классе А?
Очевидно, это не во власти топикстартера.
Re[5]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, Ellin, Вы писали: E>Хотел бы я посмотреть на выражение вашего лица, когда MS это исправит.
Не исправит. По философским соображениям. С# не будет пытаться угадать, что вы имели в виду. Если вы хотите выкинуть ненужное возвращаемое значение — напишите код, который делает именно это.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как передать null в out параметр ? (и возможно ли эт
Здравствуйте, 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 параметр ? (и возможно ли эт
Здравствуйте, xvost, Вы писали:
X>Общий вывод — при использовании ref и out параметров нельзя быть уверенным ни в чем....
Sinclair как раз и показал, как нужно писать код, что бы можно было быть уверенным. А если писать "неправильно", то действительно "нельзя быть уверенным ни в чем", совсем "ни в чем"
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, 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) {//Не факт, что Вы и сюда попадете :) }
}
Здравствуйте, _FRED_, Вы писали: _FR>А как, для примера, эффективно реализовать без "out" IDictionary<,>.TryGetValue?
Pair<bool, TResult> TryGetValue(TKey key)?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 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.