powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Nullable reference types
25 сообщений из 29, страница 1 из 2
Nullable reference types
    #40010386
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используете ли вы сабж?
...
Рейтинг: 0 / 0
Nullable reference types
    #40010390
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Да... Что-то мне все больше кажется, что вся эта шляпа с nullable-ами, что автары в МС затеяли, на самом деле, бесполезна чуть более, чем совсем.
Уже так не кажется?
Мне вот пока всё кажется так, как в цитате. Поэтому не использую.
...
Рейтинг: 0 / 0
Nullable reference types
    #40010396
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Уже так не кажется?

Да, как-то все-таки стал использовать и в итоге наконец понравилось. Просто, похоже, поначалу некоторые вещи недопонимал. Была еще одна засада связанная со встроенным CA (даже не знаю, встроенным, или FxCop-овским, который я тоже все время использую), который некоторые случаи наллов тоже проверяет. Лечится отключением ворнинга CA1062. Популярность сабжа интересует потому что если продавить в проекте везде его использовать, то можно наконец-то избавиться от всех этих бесконечных null-check. Сейчас тут есть класы, где половина кода это null-checks, плюс из-за них становится невозможно нормально использовать expression синтаксис для методов, что тоже код никак не сокращает. И в C# 9, кажется, уже обещают возможность автоинжекта нуллчека для параметров, которые не помечены как nullable.
...
Рейтинг: 0 / 0
Nullable reference types
    #40010453
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перевели один проект за пол года полностью на null references, варнинги переключили в ошибки.
Остальные в процессе. При чём не только на уровне compile checking, но и при работе с интерфейсами и валидацией. ASP.NET Core отлично с этим работает.
...
Рейтинг: 0 / 0
Nullable reference types
    #40010461
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
варнинги переключили в ошибки.

Зачетно. Тоже давно думаю продавить эту тему. А то, похоже, среди разрабов смотреть в ворнинги, а тем более фиксить их давно уже моветон. В очередной раз разгребая гору чужого гуано из пары с лишним сотен ворнингов почти сразу нашел два бага. В конструкторе вместо Foo = foo стояло foo = foo. Свойство просто не инициализировалось. Если бы все неряхи сразу все подметали за собой, то это бы сразу же вслыло, а не ждало бы, когда QA отпингует билд назад или, еще хуже, когда продакшен заглючит.
...
Рейтинг: 0 / 0
Nullable reference types
    #40010469
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

К сожалению не всё так гладко :)
Пока не будут доступны record-ы с init полями, приходится втыкать много мусора типа

Код: c#
1.
2.
3.
{...
    public string SomeProperty { get; set; } = default!;
...}



Или выносить в конструкторы, что конечно зачастую сказывается благотворно.

Поэтому прям полной поддержки на том уровне, на котором это требуется для работы NR пока нет.
Большая надежда на C#9.
...
Рейтинг: 0 / 0
Nullable reference types
    #40010478
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Ну я сейчас не парюсь и просто пишу "public string? Blabla" По моей логике оно ведь может быть нулл, да может, значит его и следует объявлять как "?". Тема еще в том, что всегда ведь потом можно применить оператор "!", который в переводе на албанский означает "я точно знаю и мамой клянусь, что эта переменная здесь не нулл".

Например:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Foo
{
    public string? Bar {get; set;}
}

var foo = new Foo {
    Bar = "Lorem Ipsum"
};

var n = foo.Bar!.Length;
...
Рейтинг: 0 / 0
Nullable reference types
    #40010721
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Это не оно?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public record Foo(string Hello, string World);

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo("Hello", "World");
        Console.WriteLine($"{foo.Hello} {foo.World}");
    }
}


(Это девятка, пару дней назад поставил уже себе превью :)
...
Рейтинг: 0 / 0
Nullable reference types
    #40010729
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще очень понравилось:

Код: c#
1.
2.
var foo = new Foo("Hello", "World");
var bar = foo with { World = "fkthat" };


Короче, надо уже на него переползать, я думаю :)
...
Рейтинг: 0 / 0
Nullable reference types
    #40010922
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ну я сейчас не парюсь и просто пишу "public string? Blabla" По моей логике оно ведь может быть нулл, да может, значит его и следует объявлять как "?". Тема еще в том, что всегда ведь потом можно применить оператор "!", который в переводе на албанский означает "я точно знаю и мамой клянусь, что эта переменная здесь не нулл".


Ну вот проблема:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Some
{
   public string Prop1 { get; set; }
   public string? Prop2 { get; set; }
}

...

var some = new Some(); // здесь объект some не является корректным и противоречит определению NR



т.е. никакой защиты на уровне компилятора нет, никаких гарантий, что в объекте Some свойство Prop1 гарантировано не будет содержать null :(


fkthat
Это не оно?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public record Foo(string Hello, string World);

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo("Hello", "World");
        Console.WriteLine($"{foo.Hello} {foo.World}");
    }
}



(Это девятка, пару дней назад поставил уже себе превью :)


Да, оно. Здесь ты уже обязан указать значения полей и сделать это правильно.


fkthat
Вот еще очень понравилось:

Код: c#
1.
2.
var foo = new Foo("Hello", "World");
var bar = foo with { World = "fkthat" };



Короче, надо уже на него переползать, я думаю :)


Дык сказка для функциональщиков :)
При чём в F# это давно есть ...
...
Рейтинг: 0 / 0
Nullable reference types
    #40010955
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
т.е. никакой защиты на уровне компилятора нет, никаких гарантий, что в объекте Some свойство Prop1 гарантировано не будет содержать null :(

Так он же тебе еще на определении класса ворнинг выдаст

...
Рейтинг: 0 / 0
Nullable reference types
    #40010968
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так-то оно понятно, что оно в принципе ни от чего не защищает, это просто ворнинг и его можно прагмой отключить, или использовать "!". Тут как с модификатором "new" для метода, который на результат компиляции никак не влияет, но компилер заставляет тебя явно сказать, что ты знаешь, что делаешь, а не просто опечатался.
...
Рейтинг: 0 / 0
Nullable reference types
    #40011036
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Так он же тебе еще на определении класса ворнинг выдаст


этот ворнинг подавляется с помощью = default! :)

всё по рекомендациям Microsoft...

fkthat
А так-то оно понятно, что оно в принципе ни от чего не защищает, это просто ворнинг и его можно прагмой отключить, или использовать "!". Тут как с модификатором "new" для метода, который на результат компиляции никак не влияет, но компилер заставляет тебя явно сказать, что ты знаешь, что делаешь, а не просто опечатался.


К сожалению свойства класса инициализируются значениями по умолчанию, если только не переопределить это поведение в конструкторе. А для DTO, например, так сделать нельзя..
...
Рейтинг: 0 / 0
Nullable reference types
    #40011877
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
К сожалению свойства класса инициализируются значениями по умолчанию, если только не переопределить это поведение в конструкторе. А для DTO, например, так сделать нельзя..

А ты знаешь, кстати, core MVC из коробки спокойно делает binding не только по свойствам, но и по параметрам конструктора. Я об этом сам узнал только полгода назад. Сейчас проверил на records - все ok, binding работает.

Код: c#
1.
2.
3.
4.
5.
6.
public record CreateCustomerModel(
    string FirstName,
    string LastName,
    string Email,
    string Phone
);


Код: c#
1.
2.
3.
4.
5.
[HttpPost("")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance",
    "CA1822:Mark members as static",
    Justification = "Action method")]
public void CreateCustomer(CreateCustomerModel model) => _ = model


Но как при этом с attribute-based validation пока что не проверял.

С DTO еще может быть проблема с десериализацией из JSON, подумал, вот, на досуге над этим поработать - пожалуй, совсем не так уж сложно написать custom converter для этого :))
...
Рейтинг: 0 / 0
Nullable reference types
    #40011885
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Это вообще БОМБА! Оно даже понимает, что туда null нельзя!

...
Рейтинг: 0 / 0
Nullable reference types
    #40011890
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
А ты знаешь, кстати, core MVC из коробки спокойно делает binding не только по свойствам, но и по параметрам конструктора. Я об этом сам узнал только полгода назад. Сейчас проверил на records - все ok, binding работает.


Ну по идее должон поддерживать :)
Я не ждал этого так быстро, хотя рекорды по факту те же классы.


fkthat
С DTO еще может быть проблема с десериализацией из JSON, подумал, вот, на досуге над этим поработать - пожалуй, совсем не так уж сложно написать custom converter для этого :))


По идее тоже должно поддерживаться, либо не за горами, иначе будет феил..


fkthat
Это вообще БОМБА! Оно даже понимает, что туда null нельзя!


Ага, у нас уже давно юзается эта фича
...
Рейтинг: 0 / 0
Nullable reference types
    #40011904
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Validation attributes тоже понимает. Правда такая тема - как только добавляешь к параметру аттрибут, так он начинает ругаться что этот параметр unused, а без аттрибута все ок - похоже, просто какой-то баг preview.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage",
    "CA1801:Review unused parameters",
    Justification = "Seems like C# 9 preview bug")]
public record CreateCustomerModel(
    string FirstName,
    string LastName,
    [EmailAddress] string Email,
    string Phone
);
...
Рейтинг: 0 / 0
Nullable reference types
    #40012077
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
По идее тоже должно поддерживаться, либо не за горами, иначе будет феил..

Супер! Я обнаружил, что в IL свойства record компилируются в public свойства. Т.е. для них будут работать и serialization, и Automapper, и ORM.



...
Рейтинг: 0 / 0
Nullable reference types
    #40012081
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Супер! Я обнаружил, что в IL свойства record компилируются в public свойства. Т.е. для них будут работать и serialization, и Automapper, и ORM.

Интересно, а Fody/PropertyChanged в таком случае может быть натравлен на record?
Мда, пардон, рекорды же иммутабельны, использовать с ними INPC смысла не имеет.
...
Рейтинг: 0 / 0
Nullable reference types
    #40012120
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Мда, пардон, рекорды же иммутабельны, использовать с ними INPC смысла не имеет.

Лично я в секте Свидетелей Иммутабельности Все, что может быть сделано иммутабельным, должно делаться иммутабельным, поэтому для меня эта фича C#прямо-таки праздник
...
Рейтинг: 0 / 0
Nullable reference types
    #40012123
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Лично я в секте Свидетелей Иммутабельности Все, что может быть сделано иммутабельным, должно делаться иммутабельным, поэтому для меня эта фича C#прямо-таки праздник

Я тоже того же мнения, только почему тогда на скриншотике выше сеттеры свойств открытые?
...
Рейтинг: 0 / 0
Nullable reference types
    #40012168
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны

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

А это не исходный код на C#, это декомпиляция сборки. Т.е. на уровне IL свойство открытое, но на уровне C# компилятор не даст тебе написать код записи в это свойство. Похоже, задумка крутая, т.к., например, будет работать та же десериализация JSON и проч. Так-то иммутабельный класс и так можно сделать через private set, но тогда, например, сразу прощай JSON и прощайте ORMы.
...
Рейтинг: 0 / 0
Nullable reference types
    #40012244
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Мда, пардон, рекорды же иммутабельны, использовать с ними INPC смысла не имеет.


Инит-поля можно заполнять на этапе создания. То, что нужно для маппинга.
...
Рейтинг: 0 / 0
Nullable reference types
    #40012246
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Я тоже того же мнения, только почему тогда на скриншотике выше сеттеры свойств открытые?


Я полагаю это особенность компиляции, с обвесом в виде атрибутов, они будут как-то закрыты...
Но я пока не копал в эту тему, но хотелось бы без трешачка в виде пол сотни оговорок, конечно же :)
...
Рейтинг: 0 / 0
Nullable reference types
    #40012351
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Я полагаю это особенность компиляции, с обвесом в виде атрибутов, они будут как-то закрыты...
Но я пока не копал в эту тему, но хотелось бы без трешачка в виде пол сотни оговорок, конечно же :)

Суть вот в чем, как я понял. Они компилируются в public, но при этом в исходном коде ничего нельзя туда писать.

Это супер. Потому что
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
// вот это вот работать будет
var joeDoe = JsonSerializer.Deserialize<Contact>(
    "{\"name\": \"Joe Doe\", \"phone\": \"+1\"}");

// а вот такое уже не скомпилируется
// joeDoe.Phone = "+7";

public record Contact(string Name, string Phone);


На самом деле очень логично, потому что не важно как происходит инициализация - конструктором, десериализацией или mapping-ом из ORM, главное, что она происходит при этом только при создании объекта, а потом он уже immutable (в рамках кода C#). С init-only свойствами такое уже, похоже не прокатит, хотя надо проверить, а с records от души.

Тут только вот одна тема, которая для меня не очень ясна и надо будет сделать research. Я при декомпиляции не вижу у этого класса никаких маркеров (например аттрибутов), что это record и мне непонятно, если я использую этот класс в готовой сборке из другого проекта, то как C# узнает, что в его свойства писать нельзя. Он же будет видеть их как public.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Nullable reference types
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]