На этот раз никакого харкора, просто пара отличных статей:
Пост здорового человекаTuples with C# 7.0 от Christian Nagel
и
настоящий шедевр корпоративной журналистики: InfoQ eMag: A Preview of C# 7. Добавил в избранное, чтоб больше не отвечать на вопрос "почему энтерпрайз называют кговавым?" Не, вот как они это делают? 30 страниц абсолютно нечитабельного текста с кучей повторений, фактических ошибок и вредных советов — это ж специально стараться надо, документацию не проще прочитать было
Здравствуйте, Sinix, Вы писали:
S>На этот раз никакого харкора, просто пара отличных статей:
S>Пост здорового человекаTuples with C# 7.0 от Christian Nagel S>и S>настоящий шедевр корпоративной журналистики: InfoQ eMag: A Preview of C# 7. Добавил в избранное, чтоб больше не отвечать на вопрос "почему энтерпрайз называют кговавым?" Не, вот как они это делают? 30 страниц абсолютно нечитабельного текста с кучей повторений, фактических ошибок и вредных советов — это ж специально стараться надо, документацию не проще прочитать было
Спасибо интересно!
А можно, получить только часть данных
var r1 = new Rectangle(100, 200);
(int height, int width) = r1;
(int width) = r1;
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Спасибо интересно! S> А можно, получить только часть данных
Нет, только лишние переменные объявлять.
Следствие вот этого (valid c#7):
var a = (start:1, end:2);
(var x, var y) = a;
раз имена могут быть произвольными (важен только порядок), то простого способа вытащить, скажем, только вторую переменную нет.
В планах есть placeholder arg (var * или default) для паттерн-матчинга, но всё застряло на "подобрать хороший синтаксис и не заблокировать им более полезные фичи". По факту отложено до стадии "мы сумели подружить вместе тюплы, records и PM".
А то получится, как с out var — сначала рубанули шашкой — дескать, можно писать
if(dict.TryGetValue(x, out var y) == false) return;
// y is assigned and available
Console.WriteLine(y);
а теперь четвёртый месяц пытаются кучу противоречий разрулить, что не так уж и просто, поскольку проверка на доступность переменной откровенно хромает из-за local functions...
Как правильно подметил ув. Пельмешко: When developers look at C# 7.0 they see "features". I see "job security"
public static class TupleExtensions {
+ public static void Deconstruct<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(this Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8, T9, T10, T11, T12, T13, T14, Tuple<T15, T16, T17, T18, T19, T20, T21>>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18, out T19 item19, out T20 item20, out T21 item21);
+ public static void Deconstruct<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>(this Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8, T9, T10, T11, T12, T13, T14, Tuple<T15, T16, T17, T18, T19, T20>>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18, out T19 item19, out T20 item20);
+ public static void Deconstruct<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>(this Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8, T9, T10, T11, T12, T13, T14, Tuple<T15, T16, T17, T18, T19>>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18, out T19 item19);
+
и солнце б утром не вставало, когда бы не было меня
The first key optimization, therefore, is that an async method that doesn’t await shouldn’t allocate anything.
We were able to share this experience with .NET in time for C#’s await to ship. Sadly, by then, .NET’s Task had already been made a class. Since .NET requires async method return types to be Tasks, they cannot be zero-allocation unless you go out of your way to use clumsy patterns like caching singleton Task objects.
S>The first key optimization, therefore, is that an async method that doesn’t await shouldn’t allocate anything.
S>We were able to share this experience with .NET in time for C#’s await to ship. Sadly, by then, .NET’s Task had already been made a class. Since .NET requires async method return types to be Tasks, they cannot be zero-allocation unless you go out of your way to use clumsy patterns like caching singleton Task objects.
Спасибо! Понял. Кстати плохо знаю английский поэтому использую Гугл переводчик
This provider interface can be implemented synchronously (for in-memory hamsters) by performing a lookup in a Dictionary and returning the Hamster instance (which is implicitly converted into a ValueTask<Hamster> without any additional allocations):
Перевод несколько смутил
Этот интерфейс провайдера может быть реализован синхронно (для хомяков в памяти), выполняя поиск в Dictionary и возвращение Hamster экземпляр (который неявно преобразуется в ValueTask<Hamster> без каких — либо дополнительных ассигнований):
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Спасибо! Понял. Кстати плохо знаю английский поэтому использую Гугл переводчик S> Перевод несколько смутил
Смысл в том, что если для valueTask уже есть значение, то код может просто его вернуть, значение сконвертится в ValueTask<T> без дополнительных приседаний и аллокаций, см вот этот кусок:
public ValueTask<Hamster> GetHamsterAsync(string name)
{
if (_dictionary.TryGetValue(name, out hamster))
{
return hamster;
}
...
}
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Serginio1, Вы писали:
S>> Спасибо! Понял. Кстати плохо знаю английский поэтому использую Гугл переводчик S>> Перевод несколько смутил
S>Смысл в том, что если для valueTask уже есть значение, то код может просто его вернуть, значение сконвертится в ValueTask<T> без дополнительных приседаний и аллокаций, см вот этот кусок: S>
S> public ValueTask<Hamster> GetHamsterAsync(string name)
S> {
S> if (_dictionary.TryGetValue(name, out hamster))
S> {
S> return hamster;
S> }
S> ...
S> }
S>
Это я понял! Я про хомяков. А идея ValueTask классная. Я сам смотря на Task.FromResult<T>
думал, что здесь нужна синхронная операция.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Sinix, Вы писали:
S>настоящий шедевр корпоративной журналистики: InfoQ eMag: A Preview of C# 7. Добавил в избранное, чтоб больше не отвечать на вопрос "почему энтерпрайз называют кговавым?" Не, вот как они это делают? 30 страниц абсолютно нечитабельного текста с кучей повторений, фактических ошибок и вредных советов — это ж специально стараться надо, документацию не проще прочитать было
Зато какая защита от возможности прочесть? На залогиниться через гулгль+ меня еще хватило, но заполнять поля с компанией и прочей фигней я уже не стал. Так что не увижу я этого шедёвра.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Зато какая защита от возможности прочесть?
Ну я ж не зря намекал про кговавый энтерпрайз ; )
Квест на самом деле простой, да и nda не просят. Вот pdf-ник, если что.
Здравствуйте, Sinix, Вы писали:
S>Не, вот как они это делают? 30 страниц абсолютно нечитабельного текста с кучей повторений, фактических ошибок и вредных советов — это ж специально стараться надо, документацию не проще прочитать было:???:
Ты к ним не справедлив. Они, очевидно, помогают социально адаптироваться умственно отсталым людям, трудоустраивая их в качестве верстальщиков. Многие ли компании проявляют подобную социальную ответственность?
Since _ is already an identifier, no syntax model change is required. However, semantically we want this to create an anonymous variable, and shadow any true variable (e.g. parameter or field) from an enclosing scope named _. There is no name conflict error if wildcards are declared this way more than once in a scope.
...
Finally, it can be used where a parameter can be declared today. However, we relax the single-definition rule to allow multiple conflicting declarations (same scope or nested scopes), in which case the identifier _ binds as a wildcard.
Func<int, int, int> f = (_,_) => 3;
...
We have to be careful with these changes so that any program that uses _ as an identifier and is legal today continues to compile with the same meaning under these revised rules.