Как стать автором
Обновить
87
0

Open source contributor

Отправить сообщение

I assume that the user knows the difference between value types and reference types. You can simply add ref to the argument's type to avoid this.


var n = new Number(7);

Console.WriteLine(n.Tripled);
Console.WriteLine(n.Tripled);
Console.WriteLine(n.Tripled);

public sealed record Number(int Value)
{
    public int Tripled => Extract(ref this.tripled);

    private int Extract(ref FieldCache<int> t)
         => t.GetValue(@this => 
         {
             Console.WriteLine("Factory");
             return @this.Value * 3;
         }, this);

    private FieldCache<int> tripled;
}

Factory
21
21
21

By the way, since it's a struct, there is no need to initialize it. But in a case where you'd rather prefer an extra allocation over potential issues with copying the struct, you still can make it a reference type.

I have this table (comparing the 914th and the 920th commits). Thank you for your advice, I will insert it in the article (but i need to add the first column). Although the impact might really vary from project to project


Thank you for your answer. I should mention that here I consider a more or less high level of programming.


can be easily moved and copied in memory

Yes, that is a good point. But it is relevant for low-level programming. Also, struct is struct, here I'm talking more about records, which are reference types, and copying them by memory is… well, you know, unsafe and prohibited.


cached and obtained Tripple, you have twice the memory footprint.

If you address their Tripled property — yes, it is so. But you rarely need to process huge arrays of high-level objects (if you do, there might be something wrong with the architecture).


I can imagine that if you attempt to compute n terms of a series, and each term depends on, say, x, x^2, x^3, then for n > 10 (arbitrary limit) caching x^i could be beneficial.

You are about right, though the way it works in my case is that I frequently need the evaluated form of the same expression in many complicated methods.


So, the key point is: the pattern is more for immutable high-level objects rather than for super-fast calculations of primitive structures.

About use cases. In my project, a symbolic algebra library, I work with mathematical expressions. At the beginning of the project, I had method Evaluate(). Every time I called it I knew that it would take some time to process, so I wouldn't call it multiple times.


However, it's hard to track how many times it is called for an expression, there many methods, such as Simplify(), Solve() and many others which used this method. In fact, there were many cases when the same expression's Evaluate() was called.


With implementation of this pattern, I don't hesitate to address Evaluated property. This helps a lot when designing/developing new functional and makes the code faster and safer.

Код не меняется, меняется только твое восприятие. Но это я так, шучу)

Ах да, у вас даблы… жирненько. А чем обусловлено использование double? Нет ли возможности хотя бы на float/single заменить?

В матрице 4x4 всего 16 элементов, столько же, сколько у автора машина умеет за одну инструкцию. А вот для видеокарты мне кажется размер матрицы маловат (и эффективность будет низкая)

Оо, ну кажется, что немало

Кто-нибудь может в паре слов сказать, как с этим обстоит в США, Европе и Китае? Ну, условно, уже в каждой деревне, или только центры городов? Или вообще мало где?

Добавил примеры по совету MomoDev. Если нужны еще, могу написать их здесь. Ну и конечно есть примеры в тестах.


Публикацию разместил в "Я пиарюсь", хоть искренне надеюсь, что когда-нибудь я по праву смогу размещать подобное в профильные хабы :).

KvanTTT, как думаете, каждые сколько недель в среднем жители хабра пишут про парсинг математических выражений?

Неужели люди, готовящиеся к собесу по дотнету, не знают этих вещей. Это достаточно базовые вещи. Но судя по всему оно может много кому помочь...

А какие плюсы вы заметили при работе с F# по сравнению с С#?

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

1Вт же отраженным от матовой поверхности точно даст не временную слепоту.

Очень странное суждение. У меня есть одноваттный лазер-указка Thor II, но не красный, а синий. Никаких проблем со зрением не видел, когда смотрел на отражение от него. Говоря про темные матовые поверхности — так там так, пятнышко было синее. Либо в данном случае красный настолько более коварный?

Серьезно? Научно-популярные видосики — теперь статьи на хабре?

Привет. Мы задумали проект для сборки всея бенчмарков, неинтересно будет свой расшарить с нами, а точнее, со всеми? Здесь: https://github.com/asc-community/dotnet-benchmarks

Опписание, о чем идет речь, не помешало бы. Не все знают, что такое WinCC. Первая часть все-таки

Меня особо порадовало contains. Прямо планету с места сдвинули такими новведениями, е-мое.

Так можно говорить про каждую версию и остаться в итоге на net20

Я на нем и остаюсь (если вы не про core2.0 или боже упаси второй fw).
ValueObject выполняет другую задачу. С рекордами вы получаете возможность построить граф из коробки. Ну и паттерн матчинг.


ValueObject обычно для небольших оберток, я никогда не видел структуры, которая достаточно самостоятельна и выполняет какую-то ключевую задачу.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность