Skip to content

Commit 66ffd0d

Browse files
authored
Merge pull request #324 from Infarh/dev
v0.0.94 - Миграция на .NET10
2 parents 2dafab9 + a910d82 commit 66ffd0d

80 files changed

Lines changed: 3716 additions & 1610 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/copilot-instructions.md

Lines changed: 70 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,70 @@
1-
Всегда отвечай мне используя русский язык.
2-
Всегда пиши комментарии в коде на русском языке.
3-
Комментарии к классам, структурам делегатам и перечислениям, а также к их членам всегда пиши в системном виде.
4-
При написании комментариев (ели они короткие) в коде предпочитай размещение комментария в конце той же строке, что и сам комментируемый код.
5-
Старайся избегать тривиальных комментариев.
6-
При герерации кода старайся минимизировать количество фигурных скобок.
7-
При генерации кода используй самые современные виды синтаксических конструкций языка.
8-
Всегда старайся минимизировтаь размер кода если не запрошено иное.
9-
Используй стиль именования локальных переменных snake_case.
10-
Используй стиль именования входных переменных методов PascalCase.
11-
Используй стиль именования полей классов _PascalCase для нестатических переменных и __PascalCase для статических переменных.
12-
Ппредпочитай английский язык при именовании переменных, методов, классов и прочих сущностей.
13-
При инициализации массивов, списков и словарей используй выражения инициализации массивов.
14-
При объявлении переменных предпочитай использовать ключевое слово var.
15-
При написании системных комментариев старайся писать их компактно в одну строку, если длина текста небольшая.
1+
# Правила для GitHub Copilot
2+
3+
- Всегда отвечай, используя русский язык
4+
- Всегда пиши комментарии в коде на русском языке
5+
6+
## Комментарии
7+
- Короткие пояснительные комментарии располагай в конце той же строки, что и код // кратко по делу
8+
- Старайся избегать тривиальных комментариев
9+
10+
## XML‑документация
11+
- Документируй классы, структуры, делегаты, перечисления и их члены только XML‑комментариями
12+
- Одинарное предложение пиши в одной строке внутри тега и без точки в конце
13+
- Каждый тег XML‑комментария располагай на отдельной строке
14+
- Порядок тегов: `<summary>``<param>``<returns>``<exception>``<remarks>``<example>`
15+
- Для сложных публичных метдов генерируй блок с простым примером использования кода внутри тега `<example>`
16+
17+
Примеры:
18+
- `<summary>Краткое описание сущности</summary>`
19+
- `<param name="Value">Описание параметра</param>`
20+
- `<returns>Описание возвращаемого значения</returns>`
21+
22+
## Синтаксис и минимализм
23+
- При генерации кода используй современные конструкции языка, совместимые с целевыми платформами проекта
24+
- Стремись минимизировать количество фигурных скобок за счёт expression‑bodied членов и switch‑выражений
25+
- Не убирай фигурные скобки в многострочных конструкциях ради читаемости
26+
- Всегда старайся минимизировать размер кода, если не запрошено иное
27+
28+
Разрешённые современные приёмы (когда поддерживается целевой платформой):
29+
- file‑scoped namespace
30+
- expression‑bodied члены
31+
- switch‑выражения и pattern matching
32+
- target‑typed `new`
33+
- collection expressions и инициализаторы коллекций
34+
- `using var` и `await using`
35+
- операторы `??`, `??=`, `is not`, `with`
36+
- упрощение nullable-присвоения `target?.Property = 15;` вместо `if(target is not null) target.Property = 15;`
37+
38+
## Именование
39+
- Локальные переменные: `snake_case`
40+
- Параметры методов: `PascalCase`
41+
- Поля экземпляров: `_PascalCase`
42+
- Статические поля: `__PascalCase`
43+
- Константы: `PascalCase`
44+
- Публичные типы и члены API: `PascalCase`
45+
- Предпочитай английский язык при именовании переменных, методов, классов и прочих сущностей
46+
47+
## Инициализация и объявления
48+
- При инициализации массивов, списков и словарей используй выражения инициализации массивов/коллекций
49+
- При объявлении переменных предпочитай использовать ключевое слово `var` (кроме случаев, когда явный тип заметно повышает понятность)
50+
51+
## Форматирование
52+
- Короткие системные комментарии пиши компактно в одну строку
53+
- Удаляй неиспользуемые `using`, сортируй и группируй директивы `using`
54+
- Разделяй логические блоки пустыми строками по мере необходимости, избегай лишних переносов
55+
56+
## Практики .NET
57+
- Включай `#nullable enable` там, где это поддерживается
58+
- Используй guard‑выражения, например `ArgumentNullException.ThrowIfNull(x)`
59+
- Предпочитай Try‑паттерны для контроля потока вместо исключений
60+
- При генерации метода добавляй в его начале блок проверки входных параметров. Отделяй этот блок пустой строкой от остального тела метода
61+
- При генерации публичных свойств у моделей-представления MVVM (классов, реализующих INotifyPropertyChanged) используй следующий формат (в одну строку):
62+
```csharp
63+
/// <summary>Описание свойства</summary>
64+
public string PropertyName { get; set => Set(ref field, value); }
65+
```
66+
- Для простых лаконичных методов используй expression‑bodied синтаксис, записанный в одну строку.
67+
68+
## Совместимость целей
69+
- В рабочем пространстве используются целевые платформы: `.NET Standard 2.0` и `.NET 10`
70+
- Применяй современные возможности языка и платформы только если они доступны для соответствующей целевой платформы проекта

.github/workflows/publish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
- name: Setup .NET
3030
uses: actions/setup-dotnet@v4
3131
with:
32-
dotnet-version: 9.0.x
32+
dotnet-version: 10.0.x
3333

3434
- name: Cache NuGet
3535
uses: actions/cache@v4
@@ -64,7 +64,7 @@ jobs:
6464

6565
steps:
6666
- name: Get artifact
67-
uses: actions/download-artifact@v4.1.8
67+
uses: actions/download-artifact@v5
6868
id: download
6969
with:
7070
name: Release
@@ -80,7 +80,7 @@ jobs:
8080

8181
steps:
8282
- name: Get artifact
83-
uses: actions/download-artifact@v4.1.8
83+
uses: actions/download-artifact@v5
8484
id: download
8585
with:
8686
name: Release

.github/workflows/testing.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
- name: Setup .NET
3030
uses: actions/setup-dotnet@v4
3131
with:
32-
dotnet-version: 9.0.x
32+
dotnet-version: 10.0.x
3333

3434
- name: Building
3535
run: |

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## Ignore Visual Studio temporary files, build results, and
1+
## Ignore Visual Studio temporary files, build results, and
22
## files generated by popular Visual Studio add-ons.
33
##
44
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
@@ -338,4 +338,7 @@ ASALocalRun/
338338

339339
# BeatPulse healthcheck temp database
340340
healthchecksdb
341+
341342
/MathCore/MathCore.xml
343+
344+
/.test_results

MathCore.sln.DotSettings

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PSO/@EntryIndexedValue">PSO</s:String>
3434
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=QR/@EntryIndexedValue">QR</s:String>
3535
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RND/@EntryIndexedValue">RND</s:String>
36+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RU/@EntryIndexedValue">RU</s:String>
3637
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SHA/@EntryIndexedValue">SHA</s:String>
3738
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MD5/@EntryIndexedValue">MD5</s:String>
3839
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SVD/@EntryIndexedValue">SVD</s:String>
@@ -79,6 +80,7 @@
7980
<s:Boolean x:Key="/Default/UserDictionary/Words/=Cosec/@EntryIndexedValue">True</s:Boolean>
8081
<s:Boolean x:Key="/Default/UserDictionary/Words/=Cosech/@EntryIndexedValue">True</s:Boolean>
8182
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ctgh/@EntryIndexedValue">True</s:Boolean>
83+
<s:Boolean x:Key="/Default/UserDictionary/Words/=DARC/@EntryIndexedValue">True</s:Boolean>
8284
<s:Boolean x:Key="/Default/UserDictionary/Words/=Decimator/@EntryIndexedValue">True</s:Boolean>
8385
<s:Boolean x:Key="/Default/UserDictionary/Words/=Deferer/@EntryIndexedValue">True</s:Boolean>
8486
<s:Boolean x:Key="/Default/UserDictionary/Words/=Diagonalization/@EntryIndexedValue">True</s:Boolean>

MathCore/Extensions/ArrayExtensions.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#nullable enable
22
using System.Globalization;
3+
using System.Runtime.CompilerServices;
34
using System.Text;
45

56
using MathCore;
@@ -44,29 +45,36 @@ public static T[] Fill<T>(this T[] array, T value, int index, int count)
4445
return array;
4546
}
4647

48+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4749
public static string ToBase64(this byte[] bytes) => Convert.ToBase64String(bytes);
50+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4851
public static string ToBase64(this byte[] bytes, int offset, int length) => Convert.ToBase64String(bytes, offset, length);
52+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4953
public static string ToBase64(this byte[] bytes, Base64FormattingOptions options) => Convert.ToBase64String(bytes, options);
5054

55+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5156
public static string ToBase64(this byte[] bytes, int offset, int length, Base64FormattingOptions options) =>
5257
Convert.ToBase64String(bytes, offset, length, options);
5358

5459
public static int BinarySearch<T>(this T[] array, T value) => Array.BinarySearch(array, value);
5560

61+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5662
public static int[] InitializeRange(this int[] array, int StartValue = 0, int Step = 1)
5763
{
5864
for (var i = 0; i < array.Length; i++)
5965
array[i] = StartValue + i * Step;
6066
return array;
6167
}
6268

69+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
6370
public static double[] InitializeRange(this double[] array, double StartValue = 0, double Step = 1)
6471
{
6572
for (var i = 0; i < array.Length; i++)
6673
array[i] = StartValue + i * Step;
6774
return array;
6875
}
6976

77+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7078
public static Complex[] InitializeRange(this Complex[] array, Complex StartValue, Complex Step)
7179
{
7280
for (var i = 0; i < array.Length; i++)
@@ -104,6 +112,7 @@ public static IEnumerable<T> Shuffle<T>(this T[] items, Random? rnd = null)
104112
/// <param name="N">Число строк (первое измерение)</param>
105113
/// <param name="M">Число столбцов (второе измерение)</param>
106114
/// <typeparam name="T">Тип элементов массива</typeparam>
115+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
107116
public static void Deconstruct<T>(this T[,] array, out int N, out int M)
108117
{
109118
N = array.GetLength(0);
@@ -116,6 +125,7 @@ public static void Deconstruct<T>(this T[,] array, out int N, out int M)
116125
/// <param name="M">Число столбцов (второе измерение)</param>
117126
/// <param name="K">Глубина (третье измерение)</param>
118127
/// <typeparam name="T">Тип элементов массива</typeparam>
128+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
119129
public static void Deconstruct<T>(this T[,,] array, out int N, out int M, out int K)
120130
{
121131
N = array.GetLength(0);
@@ -213,13 +223,15 @@ public static IEnumerable<T> EnumerateElementsByCols<T>(this T[,] array)
213223
/// <param name="value">Искомый элемент</param>
214224
/// <typeparam name="T">Тип элементов массива</typeparam>
215225
/// <returns>Истина, если элемент найден</returns>
226+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
216227
public static bool Exist<T>(this T[] array, T value) => Array.IndexOf(array, value, 0, array.Length) >= 0;
217228

218229
/// <summary>Проверка на отсутствие элемента в массиве</summary>
219230
/// <param name="array">Массив, проверка отсутствия элемента в котором выполняется</param>
220231
/// <param name="value">Искомый элемент</param>
221232
/// <typeparam name="T">Тип элементов массива</typeparam>
222233
/// <returns>Истина, если элемент в массиве отсутствует</returns>
234+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
223235
public static bool NotExist<T>(this T[] array, T value) => Array.IndexOf(array, value, 0, array.Length) < 0;
224236

225237
/// <summary>Разделить входной массив на подмассивы указанным методом</summary>
@@ -436,6 +448,7 @@ public static int GetComplexHashCode<T>(this T[] Objects)
436448
///<typeparam name="TArray">Тип элементов массива</typeparam>
437449
///<returns>Массив из объединенных элементов</returns>
438450
[DST]
451+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
439452
public static TArray[] Concatenate<TArray>(this TArray[] A, params TArray[] B)
440453
{
441454
var result = new TArray[A.Length + B.Length];
@@ -449,6 +462,7 @@ public static TArray[] Concatenate<TArray>(this TArray[] A, params TArray[] B)
449462
/// <param name="A">Исходный массив</param>
450463
/// <param name="B">Присоединяемые массивы</param>
451464
/// <returns>Массив, содержащий все элементы объединяемых массивов</returns>
465+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
452466
public static TArray[] Concatenate<TArray>(this TArray[] A, params TArray[][] B)
453467
{
454468
var result = new TArray[A.Length + B.Sum(l => l.Length)];
@@ -501,6 +515,7 @@ public static TOut[] ConvertTo<TIn, TOut>(this TIn[] In, Converter<TIn, TOut> co
501515
///<param name="action">Выполняемой действие</param>
502516
///<typeparam name="TArray">Тип элементов массива</typeparam>
503517
[DST]
518+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
504519
public static void Foreach<TArray>(
505520
this TArray[] array,
506521
Action<TArray> action)
@@ -512,6 +527,7 @@ public static void Foreach<TArray>(
512527
///<param name="ErrorHandler">Обработчик исключения</param>
513528
///<typeparam name="TArray">Тип элементов массива</typeparam>
514529
[DST]
530+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
515531
public static void Foreach<TArray>(
516532
this TArray[] array,
517533
Action<TArray> action,
@@ -552,13 +568,15 @@ Func<TException, bool> ErrorHandler
552568
///<typeparam name="TOut">Тип элементов массива области значения</typeparam>
553569
///<returns>Массив значений функции</returns>
554570
[DST]
571+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
555572
public static TOut[] Function<TIn, TOut>(this TIn[] array, Func<TIn, TOut> f) => array.Select(f).ToArray();
556573

557574
/// <summary>Получить массив, индексы элементов которого имеют обратный порядок</summary>
558575
/// <typeparam name="TArray">Тип элементов массива</typeparam>
559576
/// <param name="array">Переворачиваемый массив</param>
560577
/// <returns>Перевёрнутый массив</returns>
561578
[DST]
579+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
562580
public static TArray[] GetReversed<TArray>(this TArray[] array)
563581
{
564582
var len = array.Length;
@@ -578,6 +596,7 @@ public static TArray[] GetReversed<TArray>(this TArray[] array)
578596
/// начиная с указанного <paramref name="Start"/> положения и указанной длины <paramref name="Length"/>
579597
/// </returns>
580598
[DST]
599+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
581600
public static TArray[] GetSubArray<TArray>(this TArray[] array, int Length, int Start = 0)
582601
{
583602
var result = new TArray[Length];
@@ -594,6 +613,7 @@ public static TArray[] GetSubArray<TArray>(this TArray[] array, int Length, int
594613
/// </param>
595614
/// <returns>Инициализированный массив</returns>
596615
[DST]
616+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
597617
public static TArray[] Initialize<TArray>(
598618
this TArray[] array,
599619
Func<int, TArray> Initializer
@@ -610,6 +630,7 @@ Func<int, TArray> Initializer
610630
/// <param name="value">Значение, размещаемое во всех элементах массива</param>
611631
/// <returns>Инициализированный массив</returns>
612632
[DST]
633+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
613634
public static TArray[] Initialize<TArray>(
614635
this TArray[] array,
615636
TArray value
@@ -996,6 +1017,7 @@ public static void Inverse<TArray>(this TArray[] array)
9961017
/// <param name="Values">Значения, Которые требуется внести с <paramref name="array"/></param>
9971018
/// <typeparam name="TArray">Тип ячеек массива</typeparam>
9981019
[DST]
1020+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
9991021
public static void SetValues<TArray>(
10001022
this TArray[] array,
10011023
int StartIndex,
@@ -2609,7 +2631,7 @@ public static Complex[] ResamplingLagrange(this Complex[] array, int NewLength)
26092631
}
26102632

26112633
[NotImplemented]
2612-
public static double[] ResamplingLinear(this double[] array, int NewLength)
2634+
private static double[] ResamplingLinear(this double[] array, int NewLength)
26132635
{
26142636
var old_length = array.Length;
26152637

0 commit comments

Comments
 (0)