Re: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.02.21 08:56
Оценка: +4 -2
Здравствуйте, jul_nevermind, Вы писали:

_>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.


А зачем приводить в замешательство C#-программиста? И кому на фиг нужно знать особенности компиляторов? Знание на практике бесполезное. Ну, разве что меньше надо на компилятор надеяться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: rameel https://github.com/rsdn/CodeJam
Дата: 20.02.21 16:07
Оценка: 10 (1) +1
Здравствуйте, Shmj, Вы писали:

S>Просьба написать наиболее краткий пример, на котором видна проблема — не хочется читать простыню — не настолько важный вопрос.


https://github.com/dotnet/csharplang/issues/3431

// Project1.csproj
using Library;

namespace Sample
{
    public sealed class ValueProvider
    {
        public bool TryGetValue(out Result result)
        {
            // Expected: The out parameter 'result' must be assigned to before control leaves the current method
            return false;
        }
    }
}

// Project2.csproj
namespace Library
{
    public readonly struct Result
    {
        public object Value { get; }

        //public readonly object Value; // 2. Works as expected
        //public readonly int Value;    // 3. Works as expected
    }
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Должен ли out-параметр быть проинициализирован до возврата из метода?
От: jul_nevermind  
Дата: 20.02.21 08:36
Оценка: 8 (1) -1
Как привести в замешательство C# программиста на собеседовании? А, например, вот так.
csharp dotnet roslyn programming программирование
Re[8]: Проверка и деконструкция
От: Qbit86 Кипр
Дата: 17.03.21 07:18
Оценка: 12 (1)
Здравствуйте, varenikAA, Вы писали:

AA>но в своем коде лучше out не использовать. будь то анонимный кортеж или структура/класс.


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

AA>без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.


Пример был про возврат неполиморфных типов, как и более 95% использования Try-паттерна в BCL. А если бы метод возвращал кошек и собак, то в твоих ADT-over-OOP было бы два каста — от IResult<IAnimal> к Some<IAnimal>, и от IAnimal к Cat.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: rameel https://github.com/rsdn/CodeJam
Дата: 20.02.21 16:11
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>А зачем приводить в замешательство C#-программиста? И кому на фиг нужно знать особенности компиляторов? Знание на практике бесполезное. Ну, разве что меньше надо на компилятор надеяться.


Странное поведение в целом, и себе жизнь на ровном месте усложнили, и других в замешательство приводят
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[13]: Try-Parse Pattern
От: varenikAA  
Дата: 18.03.21 03:28
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>На C# там определение ATD. А использование ATD там на F#.


Понял, не любите F#
Повторюсь, есть функция она и должна возвращать значение, try использовали вынужденно из-за отсутствия в сишарпе кортежей,
void, out, new затрудняют композицию вычислений.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: rameel https://github.com/rsdn/CodeJam
Дата: 20.02.21 11:34
Оценка:
Здравствуйте, jul_nevermind, Вы писали:

_>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.


2 года назад наткнулся на такое поведение, даже issue соответствующий завел
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: Shmj Ниоткуда  
Дата: 20.02.21 14:39
Оценка:
Здравствуйте, jul_nevermind, Вы писали:

_>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.


Просьба написать наиболее краткий пример, на котором видна проблема — не хочется читать простыню — не настолько важный вопрос.
Re[3]: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: hardcase Пират http://nemerle.org
Дата: 15.03.21 21:13
Оценка:
Здравствуйте, rameel, Вы писали:

R>Странное поведение в целом, и себе жизнь на ровном месте усложнили, и других в замешательство приводят


Это они баг старого нативного csc.exe закрепили в новом дизайне, чтобы у людей компиляция Roslyn-овским компилятором не падала по-первой.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: varenikAA  
Дата: 16.03.21 09:21
Оценка:
Здравствуйте, jul_nevermind, Вы писали:

_>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.


Зачем вообще использовать возвращаемые параметры если есть return?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Должен ли out-параметр быть проинициализирован до возврата из метода?
От: Jack128  
Дата: 16.03.21 09:30
Оценка:
Здравствуйте, varenikAA, Вы писали:

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


_>>Как привести в замешательство C# программиста на собеседовании? А, например, вот так.


AA>Зачем вообще использовать возвращаемые параметры если есть return?


Потому что туплы появились совсем недавно, а заводить отдельный возвращаемый тип на каждый чих — лениво было.
Re[2]: out vs. return
От: Qbit86 Кипр
Дата: 16.03.21 09:47
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Зачем вообще использовать возвращаемые параметры если есть return?


Out-параметры позволяют синтаксически изображать что-то похожее на деконструкцию кортежей и совмещать с проверкой, довольно удобно. Это стандартный Try-паттерн в .NET. Например:
if (foo.TryGetBar(out Bar bar, out string explanation))
    bar.Qux();
else
    Console.WriteLine($"Failed to get bar: {explanation}");
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: out vs. return
От: varenikAA  
Дата: 16.03.21 14:10
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Out-параметры позволяют синтаксически изображать что-то похожее на деконструкцию кортежей и совмещать с проверкой, довольно удобно. Это стандартный Try-паттерн в .NET.


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

match res with
    | Ok s -> s
    | Error desc -> failWith desc
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: C#
От: Qbit86 Кипр
Дата: 16.03.21 14:22
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>[ocaml]

AA>[/ocaml]

Исходный контекст был про C#.
Глаза у меня добрые, но рубашка — смирительная!
Re[5]: C#
От: varenikAA  
Дата: 16.03.21 14:27
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Исходный контекст был про C#.


Согласен, просто код на сишарпе был бы длинней и не такой выразительный, но там кода не так много по сути нужен базовый абстрактный класс и два наследника.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: Memory traffic
От: Qbit86 Кипр
Дата: 16.03.21 14:37
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>нужен базовый абстрактный класс и два наследника.


И получить на ровном месте лишние аллокации и даункасты? Нет, спасибо.
Глаза у меня добрые, но рубашка — смирительная!
Re[7]: Memory traffic
От: varenikAA  
Дата: 17.03.21 02:15
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>И получить на ровном месте лишние аллокации и даункасты? Нет, спасибо.

Согласен, в случае BCL от этого наследия уже никуда не деться, но в своем коде лучше out не использовать. будь то анонимный кортеж или структура/класс.
без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[9]: Проверка и деконструкция
От: varenikAA  
Дата: 17.03.21 10:49
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Почему не использовать, если с out проверка и деконструкция получаются проще и без промежуточных разыменований?

в случае если возвращаем ссылочный тип, достаточно проверки на null(неудача).

AA>>без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.


Q> А если бы метод возвращал кошек и собак, то в твоих ADT-over-OOP было бы два каста — от IResult<IAnimal> к Some<IAnimal>, и от IAnimal к Cat.

Думаю одного достаточно: https://gist.github.com/altbodhi/4da039522a3bd3cff76f1d68077fbb4e
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Проверка и деконструкция
От: Qbit86 Кипр
Дата: 17.03.21 12:24
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>в случае если возвращаем ссылочный тип, достаточно проверки на null(неудача).


А если не ссылочный? Если дженерик?

Q> А если бы метод возвращал кошек и собак, то в твоих ADT-over-OOP было бы два каста — от IResult<IAnimal> к Some<IAnimal>, и от IAnimal к Cat.

AA>Думаю одного достаточно: https://gist.github.com/altbodhi/4da039522a3bd3cff76f1d68077fbb4e

Не понял, к чему этот гист, если речь шла: 1) про твоих кошек и собак, 2) про использование в C#.
Глаза у меня добрые, но рубашка — смирительная!
Re[11]: Проверка и деконструкция
От: varenikAA  
Дата: 17.03.21 13:04
Оценка:
Здравствуйте, Qbit86, Вы писали:

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


Q>А если не ссылочный? Если дженерик?

ну тогда кортеж (bool, T)


Q>Не понял, к чему этот гист, если речь шла: 1) про твоих кошек и собак, 2) про использование в C#.


1) TValue может быть любой хоть кошкой хоть собакой
2) Там как раз C#
3) Вариантов масса, и out один из них только все равно считаю нужен признак успешности, потому что особенно стремно когда out из void метода,
то ли он отработал, то ли нет.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[12]: Try-Parse Pattern
От: Qbit86 Кипр
Дата: 17.03.21 13:17
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>ну тогда кортеж (bool, T)


Тогда ты не сможешь совместить и деконструкцию, и проверку в одном выражении.

AA>1) TValue может быть любой хоть кошкой хоть собакой


Так ты ж сам писал выше: «без кастов не обойтись если метод возвращает кошек и собак, хоть с out, хоть с return.»

AA>2) Там как раз C# :)


На C# там определение ATD. А использование ATD там на F#.
Давай лучше не надо ссылаться на гисты, а вставлять код в собощение. Потому что мы обсуждаем, очевидно, разные гисты. Я вижу только тот, на который ты привёл ссылку. А не тот, в котором есть пример использования на C#.

Повторю для надёжность baseline, с которым будем сравнивать альтернативы:
if (foo.TryGetBar(out Bar bar, out string explanation))
    bar.Qux();
else
    Console.WriteLine($"Failed to get bar: {explanation}");


AA>3) Вариантов масса, и out один из них только все равно считаю нужен признак успешности


В стандартном Try-паттерне из метода возвращается bool — признак успешности. Именно поэтому можно вызов поместить в if.
Глаза у меня добрые, но рубашка — смирительная!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.