record net5
От: varenikAA  
Дата: 21.12.20 02:57
Оценка:
Итак избавились от точки в названии и получили записи.
Впервые попробовал. Поведение отличается от классов.
Взаимные ссылки типа parent <-> child дают переполнение стэка.
Я правда делал не честные записи, но менял ключевое слово clsss на record т.к. судя по документации особых различий не должно быть или я не заметил.
Стоит ли использовать записи в нынешнем виде или подождать до следующей LTS?

    public abstract class BaseThing
    {
        public string Name { get; set; }

        public override string ToString()
        {
            return $"[{this.GetType().Name}: Name={Name}]";
        }

    }
    public record Person : BaseThing // <= error CS8864: Записи могут наследоваться только от объекта или другой записи. (Вот это особо удивило, class это не объект?)
    {
        private Item item;

        public Item Item
        {
            get => item; set
            {
                item = value;
                item.Person = this;
            }
        }
        public override string ToString()
        {
            return base.ToString() + $"{Item}"; <= версия на классах работает, рекорд кидает переполнение стэка
        }
    }

    public record Item : BaseThing
    {
        public Person Person { get; set; }
    }
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: record net5
От: karbofos42 Россия  
Дата: 21.12.20 08:12
Оценка: +2
Здравствуйте, varenikAA, Вы писали:

AA>error CS8864: Записи могут наследоваться только от объекта или другой записи. (Вот это особо удивило, class это не объект?)


"объект" в данном случае — это System.Object
Re: record net5
От: Farsight СССР  
Дата: 21.12.20 09:31
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Итак избавились от точки в названии и получили записи.

Разве?

AA>Взаимные ссылки типа parent <-> child дают переполнение стэка.

Логично. На классах, если повторить поведение рекордов в ToString(), тоже свалится. Чтоб твой кейс не свалился, надо и у Item переопределить ToString(). ToString(), кстати, не наследует поведение базового рекорда.

Под объектом имеется в виду Object.
</farsight>
Re: record net5
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.12.20 02:31
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Стоит ли использовать записи в нынешнем виде или подождать до следующей LTS?


Надо понимать зачем они нужны. Тогда стоит. Я бы очень хотел их использовать, но у нас .net 4.0
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: record net5
От: varenikAA  
Дата: 23.12.20 03:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Надо понимать зачем они нужны. Тогда стоит. Я бы очень хотел их использовать, но у нас .net 4.0


Да уж, вам повезло.
Вчера столкнулись с проблемой криптопро(все алгоритмы работают из коробки),

требуется сборка своей коры:

https://github.com/CryptoPro/DotnetCoreSampleProject/blob/master/docs/Windows.md
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: record net5
От: varenikAA  
Дата: 23.12.20 03:36
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Надо понимать зачем они нужны. Тогда стоит. Я бы очень хотел их использовать, но у нас .net 4.0


не много не то прикрепил перед этим
вот тут проблему описали.
https://www.cryptopro.ru/forum2/default.aspx?g=posts&amp;t=13492&amp;p=2
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: record net5
От: amironov79  
Дата: 23.12.20 06:02
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Да уж, вам повезло.

AA>Вчера столкнулись с проблемой криптопро(все алгоритмы работают из коробки),

AA>требуется сборка своей коры:


AA>https://github.com/CryptoPro/DotnetCoreSampleProject/blob/master/docs/Windows.md


Кто заставляет использовать core для подписи? Используй framework и волосы будут мягкими и шелковистыми. Тем более все дело на винде происходит.
Re: record, mutable field?
От: Silver_S Ниоткуда  
Дата: 04.01.21 14:01
Оценка:
Чтобы не плодить темы, сюда вопрос.

Если в record хочется добавить вычисляемое get property, но надо закешировать результат в mutable field (больше некуда). Как этот field исключить из ToString, GetHashCode, Equals?
Если вручную переопределять все GetHashCode, Equals, ToString, то половина преимуществ record пропадает.
Может они сделали какой то attribute, для исключения? Логичнее было бы чтобы mutable fields вообще не включались в GetHashCode,.. Если надо, то добавить легче, чем убрать.
Re[2]: record, mutable field?
От: Silver_S Ниоткуда  
Дата: 04.01.21 16:42
Оценка:
S_S>Если в record хочется добавить вычисляемое get property, но надо закешировать результат в mutable field (больше некуда). Как этот field исключить из ToString, GetHashCode, Equals?
S_S>Если вручную переопределять все GetHashCode, Equals, ToString, то половина преимуществ record пропадает.

Хотя обходные пути есть — добавить это поле в производном record, а переопределения GetHashCode,.. направить на base.
Но плохо, что конструктор надо снова переопределять. Если был краткий primary конструктор, то много лишней писанины.

Лучше бы сделали, чтобы в производном record, в таких конструкторах неявно добавлялись параметры из base record.
public record Rec1(int Prop1)
{
}

public record Rec2(int Prop2) : Rec1 // Ошибка. В производном такие конструкторы нельзя. Если в базовом нет без параметров. Лучше бы неявно превращался в конструктор: Rec2(int Prop1, int Prop2)
{
}
Отредактировано 04.01.2021 16:43 Silver_S . Предыдущая версия .
Re[2]: record, mutable field?
От: amironov79  
Дата: 05.01.21 06:35
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Если вручную переопределять все GetHashCode, Equals, ToString, то половина преимуществ record пропадает.

S_S>Может они сделали какой то attribute, для исключения? Логичнее было бы чтобы mutable fields вообще не включались в GetHashCode,.. Если надо, то добавить легче, чем убрать.

Думаю, этот случай не для record. Но обычные классы то никуда не делись. Чтобы меньше писать, всегда можно использовать Fody или Source Generators.
Re[3]: record, mutable field?
От: varenikAA  
Дата: 06.01.21 14:40
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>>Если вручную переопределять все GetHashCode, Equals, ToString, то половина преимуществ record пропадает.


все наследуется от объекта, но только записи от записи.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: record, mutable field?
От: varenikAA  
Дата: 06.01.21 14:50
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Чтобы не плодить темы, сюда вопрос.


S_S>Если в record хочется добавить вычисляемое get property, но надо закешировать результат в mutable field (больше некуда). Как этот field исключить из ToString, GetHashCode, Equals?


Потыкал щас. вообще это странно для записей изменять хэш. в этом же вся суть их.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: record net5
От: varenikAA  
Дата: 04.05.21 01:50
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Надо понимать зачем они нужны. Тогда стоит. Я бы очень хотел их использовать, но у нас .net 4.0


Можно пример? Я вот только нашел их полезными для работы с System.Text.Json благодаря [attribute:property] удалось существенно уменьшить кол-во кода.

Внезапно осознал, что их нельзя использовать для UI т.к. все свойства init only, и следовательно можно вообще без св-в обойтись(использовать например структуры?).
Да и в связке с EF уже не так удобно. можно было бы автоклассы аналогично записям добавить.

В результате опять приходится писать кучу ручного кода.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: А чего TargetFramwork только 5.0?
От: VladCore  
Дата: 05.05.21 10:19
Оценка:
Я вначале думал что это компилятор просто тупо генерит IEquitable, GetHashCode, Equals, ==, != и мутабельное клонирование. Все это есть в .NET Framework 2.0 и старше

А нет увы.
Re[3]: record net5
От: VladCore  
Дата: 05.05.21 10:21
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Внезапно осознал, что их нельзя использовать для UI т.к. все свойства init only, и следовательно можно вообще без св-в обойтись(использовать например структуры?).


это в "коротком" синтаксисе они immutable. В полном для каждого поля ты задаеш видимость сеттера.
Re[4]: record net5
От: varenikAA  
Дата: 05.05.21 11:37
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>это в "коротком" синтаксисе они immutable. В полном для каждого поля ты задаеш видимость сеттера.


Таже портянка получится что и class?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: record net5
От: VladCore  
Дата: 05.05.21 12:08
Оценка:
Здравствуйте, varenikAA, Вы писали:

VC>>это в "коротком" синтаксисе они immutable. В полном для каждого поля ты задаеш видимость сеттера.


AA>Таже портянка получится что и class?


нет 🙃
Re[6]: record net5
От: varenikAA  
Дата: 05.05.21 13:21
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>>>это в "коротком" синтаксисе они immutable. В полном для каждого поля ты задаеш видимость сеттера.


AA>>Таже портянка получится что и class?


VC>нет 🙃


Например?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[7]: record net5
От: VladCore  
Дата: 05.05.21 16:27
Оценка: 8 (1)
Здравствуйте, varenikAA, Вы писали:

VC>>>>это в "коротком" синтаксисе они immutable. В полном для каждого поля ты задаеш видимость сеттера.


AA>>>Таже портянка получится что и class?


VC>>нет 🙃


AA>Например?


смотри внимательнее — я ответил на стартовое сообщение. А именно компилятор нагенерит IEquatable, GetHashCode, Equals, ==, !=
Re[2]: record net5
От: _NN_ www.nemerleweb.com
Дата: 07.05.21 09:22
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, varenikAA, Вы писали:


AA>>Стоит ли использовать записи в нынешнем виде или подождать до следующей LTS?


VD>Надо понимать зачем они нужны. Тогда стоит. Я бы очень хотел их использовать, но у нас .net 4.0


Компилятор то хотя бы не от 2010-й студии ?

В 2019-й студии или же просто с новым Rolsyn-ом собирается и работает отлично:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <LangVersion>9</LangVersion> <!-- Поддержка записей -->
    <TargetFramework>net40</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <!-- Для 'System.Runtime.CompilerServices.IsExternalInit' . Можно и вручную добавить -->
    <PackageReference Include="Theraot.Core" Version="3.2.5" /> 
  </ItemGroup>
</Project>


using System;

namespace ConsoleApp22
{
    public record A(int I, int J);

    class Program
    {
        static void Main(string[] args)
        {
            var a = new A(1, 2);
            var b = a with { I = 10 };
            Console.WriteLine(a);
            Console.WriteLine(b);
        }
    }
}


A { I = 1, J = 2 }
A { I = 10, J = 2 }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.