Как стать автором
Обновить
12
0
Александр Васюков @Brom95

Программист

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

Честно говоря, с gin особо не работал, но как мне видится, chi немного проще,например, в приеме входных моделей с валидацией. В chi это делается через имплементацию интерфейса Binder у самой модели, в то время, как у gin это выглядит несколько сложнее: https://gin-gonic.com/docs/examples/custom-validators/

По коду не увидел особой разницы

  1. Это потому что я написал пока максимально просто, чтобы был простор для рефакторинга.

  2. Думаю, все net/httpсовместимые роутеры выглядят похоже

Ваша правда, забыл dll перебилдить после правок, и полный уверенности, что все в порядке внес код в статью, сейчас исправлю

Думаю так не выйдет, наверняка не знаю, но как рассуждал:
Скорее всего строки иммутабельны не просто так, значит длина строки, скорее всего, высчитывается при ее создании и больше не актуализируются.
Важно понимать, что Span дает нам доступ к коллекции внутри String, в то время как CLR оперирует классом System.String

Крохотный эксперимент:

using System.Runtime.InteropServices;

var a = "Hello, World!";
Console.WriteLine(a); // Hello, World!
Console.WriteLine(a.Length); // 13
var stringSpan = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetReference(a.AsSpan()), a.Length);
stringSpan[^1] = '\0';
stringSpan[^2] = '\0';
stringSpan[^3] = '\0';
Console.WriteLine(a); // Hello, Wor
Console.WriteLine(a.Length); // 13

я, честно признаться, очень плох что в C, что в C++, поэтому вполне может быть что ваш вариант правильнее, но мой код тоже рабочий...по крайней мере вчера работал

Если же речь о том, чтобы писать в Span, который мы передаем в качестве аргумента, то это плохая идея. Мы не знаем, где в действительности находится память, абстракцию к которой дает span. Она может оказаться как на стеке, так и в неуправляемой среде или внезапно быть частью другой строки.

  1. Вам нет нужды вызывать .ToString(), вы же изменяете объект по ссылке без изменения ссылки, если я правильно понял вопрос и если мы все еще говорим о способах, которые крайне не рекомендуется использовать в реальных проектах.

  2. О какой аллокации идет речь? Пока я не сморозил глупость, хочу напомнить, что span это ссылочная структура, которая не может быть аллоцирована на куче.

В любой ситуации надо говорить либо "зависит", либо "перфоманс".

А если серьезно, то на сколько я помню,одним из самых главных преимуществ иммутабельных строк является то, что мы можем посчитать их длину при создании и больше не пересчитывать ее. Ну, и интернирование :D

Да, вы совершенно правы! Мне трудно вспомнить почему я так написал, хотя очевидно что интернирования там не будет, но сейчас поправлю.

var buffer = new char[] { 'T', 'e', 's', 't' };
Span<char> external = Array.Empty<char>();
string result = string.Create(buffer.Length, buffer, (chars, buf) => {
    for (int i = 0; i < chars.Length; i++)
    {
        chars[i] = buf[i];
    }
});



Console.WriteLine(result);
Console.WriteLine(Object.ReferenceEquals(result, "Test")); // False

Развлечения ради, и, возможно, более глубокое понимание CLR. Вообще изначально задачу принесли с какого-то собеседования.

Так статья и посвящена тому, почему тот вариант не работает, а в конце приведены три рабочих варианта.

var documentsDir = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
FileInfo[] result1 = documentsDir.GetFiles();
FileInfo[] result2 = documentsDir.GetFiles();
foreach (FileInfo item in result1
                                 .Select(i => i.FullName)
                                 .Except(result2.Select(i => i.FullName))
                                 .Select(i => new FileInfo(i)))
{
    Console.WriteLine(item.Name);
}

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

Вы все абсолютно правы, я настолько сильно сконцентрировался на конкретном примере, что совершенно забыл упомянуть, что это общее правило, а не частный случай.

Предлагаю сойтись на том, что это вкусовщина, а оригинальный комментарий просто чуть иначе изложил мой код из поста :D

Тут за неявным указанием типов спрятали то, что на выходе у нас IEnumerable<string>, а не IEnumerable<FileInfo>. Да и в целом, как по мне, эти рекомендации не про то, что var зло и его не надо использовать, а про то, что он не должен усложнять понимание кода. Это скорее ближе к питоновскому "Явное лучше неявного".

Это во-первых: https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions#implicitly-typed-local-variables

А во-вторых, это буквально тоже самое, что и код в статье

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

Прошу прощения, а откуда берется порт 42002? это опечатка от 42022?
Не претендую на единственно верное мнение, но:
1) Стоит ли действительно чувствительной информации покидать пределы организации?
2) Если модель предполагает внутреннего нарушителя, который может подглядывать, то скорее всего проблема не в наличии физической возможности подглядеть.
А они и не должны. Если устройство заведомо скомпрометировано ( а тут именно такой случай), то это не проблема приложения. Рискну предположить, что таких сообщений уйма и их проще игнорировать, чем каждому доказывать, почему проблема не на их стороне

Закон, что дышло. Куда повернул — туда и вышло.
Если уж и говорить об идентификации граждан, то стоит брать всякие снилсы, паспортные данные или любую другую из миллиона и одной уникальной для гражданина бумажки ( см. сайты гос. услуг). Но это опять таки не решает главной проблемы, ничто не мешает мне вбить данные соседа дяди Коли...

1

Информация

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