Kotlin «применить» эквивалент в C# - PullRequest
4 голосов
/ 14 марта 2020

При использовании Kotlin можно использовать apply для установки нескольких свойств существующего объекта и сохранения чистоты кода, например вместо:

person.firstName = "John"
person.lastName = "Doe"
person.phone = "123 456 789"

Мы можем использовать:

person.apply {
   firstName = "John"
   lastName = "Doe"
   phone = "123 456 789"
}

Есть ли эквивалент apply в C#?

Самым близким к этому является using, но, насколько я знаю, его нельзя использовать таким образом.

Редактировать: Я знаю инициализатор объекта в C#, но я на самом деле ищу что-то, что можно сделать для существующих объектов (например, объект, извлеченный из базы данных).

Ответы [ 5 ]

3 голосов
/ 14 марта 2020

Вы можете использовать его таким образом с инициализаторами объекта :

var person = new Person
{
   FirstName = "John",
   LastName = "Doe",
   Phone = "123 456 789"
};

Или с конструктором:

var person = new Person("John", "Doe", "123 456 789");

Ваш класс должен выглядеть следующим образом это для опции конструктора:

class Person
{
    public Person(string firstName, string lastName, string phone)
    {
        FirstName = firstName;
        LastName = lastName;
        Phone = phone;
    }

    public string FirstName { get;set; }
    public string LastName { get;set; }
    public string Phone { get;set; }
}
1 голос
/ 15 марта 2020

С инициализатором объекта:

var person = new Person
{
   firstName = "John",
   lastName = "Doe",
   phone = "123 456 789"
};

После того, как у вас уже есть объект, вы можете задать себе короткую переменную:

var p = person;
p.firstName = "Jane";
p.lastName = "Smith";
p.phone = "987 654 321";

//later:
Console.WriteLine(person.lastName); //will output "Smith"

, которая еще меньше кода, чем apply опция.

1 голос
/ 14 марта 2020

В настоящее время в C# (версия 8) отсутствует поддержка группового назначения нескольких свойств вне инициализации объекта.

Аналогичная поддержка существует в VB. NET и была предложена для C# 9.

Немного исторического контекста

В Visual Basi c. NET есть похожее утверждение - With:

    With person
        .FirstName = "John"
        .LastName = "Doe"
        .Phone = "123 456 789"
    End With

Это было перенесено из Visual Basi c 6 для обратной совместимости (предыдущая, не. NET версия языка).

C# команда (где-то рассказывал сам Андерс Хейлсберг) утверждала, что оператор With уменьшается Читаем код и не хотим вводить его на языке. Из того, что я видел, операторы With могут быть вложенными и могут привести к путанице в происходящем.

Как уже упоминалось многими другими, существует синтаксис инициализатор объекта , который очень похоже:

var person = new Person
{
   firstName = "John",
   lastName = "Doe",
   phone = "123 456 789"
};

Future - C# 9

Как указано в другом (удаленном) ответе, существует открытое предложение для записей и с выражением , который будет добавлен в C# 9:

person with { firstName = "John", lastName = "Doe", phone = "123 456 789" };

Бонусный совет

Однако, самый важный совет, который я могу вам дать, чтобы не раздражать товарища C# разработчика, который может работать на вашем код - мы не используем camelCase в C# для public c свойств и методов, потому что C# не Java. Мы используем PascalCase ! :)

1 голос
/ 14 марта 2020

Инициализаторы объектов позволяют вам это делать, но только при создании экземпляра объекта.

Как и

var person = new Person
{
   FirstName = "John",
   LastName = "Doe",
   Phone = "123 456 789"
}
1 голос
/ 14 марта 2020

Вы можете использовать инициализатор объекта , чтобы сделать то же самое с Kotlin при создании экземпляра Person

var person = new Person
{
   FirstName = "John",
   LastName = "Doe",
   Phone = "123 456 789"
};

Кроме того, в C# это хорошее именование Правило, начинающее имя свойства с заглавной буквы и использующее для этого регистр pascal.

Существует также открытое предложение для типа записей и выражения With, возможно, оно сможет быть добавлен в C# 9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...