Писать - да, читать - it depends, как говорят англичане.
А разве в legacy 4-5-летней выдержки, над которым поработало много программистов, хороших и разных, по-другому бывает?
А ещё бывает, что методы называются почти одинаково, но типы значений у них разные. Пример: builder.Services.AddOptions() и builder.Services.AddOptions() из кода конфигурирования контейнера сервисов, методы расширения IServiceCollection для Option Patterns - типы возвращаемых значений у них разные. А их ещё любят цеплять друг к другу к таким же методам через точку - вот и смотри потом, чой-то в ConfigureOptions какие-то лишние параметры вылезли.
А если ещё учесть, что сейчас принято документацию ограничивать примерами (MS любит, да) - оно вообще весело.
Это потому что сейчас главное - быстрее писать MVP, для веба - особенно. Ну, а потом можно сказать волшебное слово: "Legacy".
Например, в обычном блокноте или по распечатке на бумаге.
var result = service.GetAll().ToList()
Особенно во время дебага
А ты давай нормальные названия методам, чтобы возвращаемое значение было очевидным, набирайся опыта, ищи закономерности.
Ты же не задаёшься вопросом, какой тип возвращает какой-нибудь GetUser, ToString, TryParse, FirstOrDefault?
Если тебе сложно понять смысл кода без типов - значит кто-то плохие имена дал переменным.
Правильный вопрос - зачем вообще заставлять работать с анонимными типами? Подозреваю, что их из-за маршрутизации в MVC завезли - как типы параметров, вместо того, чтобы передавать в методы генерации ссылок вместо IDictionary, как это оно там реально требуется
use criterion::{criterion_group, criterion_main, Criterion};
use rand::Rng;
use std::{
hint::black_box,
time::{Duration, Instant},
};
fn count_odds(data: &[u8], even: &mut Vec<u8>, odd: &mut Vec<u8>) -> (usize, usize) {
let mut odd_count = 0;
let mut even_count = 0;
for i in data {
if i % 2u8 == 0u8 {
even_count += 1;
even.push(*i);
} else {
odd_count += 1;
odd.push(*i);
}
}
(even_count, odd_count)
}
fn create_test_data(size: usize) -> Vec<u8> {
let mut data = Vec::with_capacity(size);
let mut rng = rand::thread_rng();
for _ in 0..size {
let n: u8 = rng.gen();
data.push(n);
}
data
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("count_odds 1M", |b| {
b.iter_custom(|iters| {
let size = 1_000_000;
let data = create_test_data(size);
let mut total = Duration::default();
for _ in 0..iters {
let mut evens = Vec::with_capacity(size);
let mut odds = Vec::with_capacity(size);
let start = Instant::now();
let _ = count_odds(
black_box(&data[..]),
black_box(&mut evens),
black_box(&mut odds),
);
total += start.elapsed();
}
total
});
});
c.bench_function("count_odds 1K", |b| {
b.iter_custom(|iters| {
let size = 1_000;
let data = create_test_data(size);
let mut total = Duration::default();
for _ in 0..iters {
let mut evens = Vec::with_capacity(size);
let mut odds = Vec::with_capacity(size);
let start = Instant::now();
let _ = count_odds(
black_box(&data[..]),
black_box(&mut evens),
black_box(&mut odds),
);
total += start.elapsed();
}
total
});
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
мне это надо так как в цикле, char переводится в цифры(кодировку)
Ошибаешься. Если бы я не отказался от кураторства, то отозвал решение.
Опять же различий гораздо больше, чем просто набор поддерживаемых платформ.
Они не используют внутри себя .net standart, код внутри разный.
.net standart - это только спецификация на то, какие классы должны быть в BCL, но реализация уже везде будет разная.
Чем выше версия - тем больше будет доступно, но тем уже будет набор совместимых версий рантайма.
Самая последняя версия (netstandart 2.1) вообще не поддерживается в .net framework - оно поддерживается только в mono и .net (core) от версии 3.0 и выше.