Почему автоматические свойства C # не поддерживают значения по умолчанию, такие как VB 2010? - PullRequest
8 голосов
/ 13 апреля 2010

Глядя на новые функции VB 2010, я наткнулся на поддержку Автоматически реализуемых свойств .

Поскольку я работаю с C #, это кажется довольно знакомым, но я заметил, что VB добавил функцию, которую я хотел бы иметь в C #: установка произвольного значения по умолчанию для автоматически реализуемого свойства:

Public Class Person

    Property Name As String = "Scott Guthrie"
    Property Age as Integer = 35

End Class

Мне действительно нравится чистое использование авто-свойств в C #. Это избавило бы нас от необходимости вводить вспомогательное поле и подключать его к свойству каждый раз, когда нам просто нужно значение по умолчанию, тем самым бесполезно загромождая код.

Мне было интересно, почему это не было введено и в C #? Что может быть обоснованием для того, чтобы этого не делать? Идет ли обсуждение синтаксиса или существуют технические ограничения для его реализации?

Ответы [ 4 ]

10 голосов
/ 13 апреля 2010

Почему бы просто не использовать их по умолчанию в конструкторе? Это то, что его тоже.

4 голосов
/ 13 апреля 2010

А как же:

public class Person
{
    public Person() 
    {
         this.Name = "Scott Guthrie";
         this.Age = 35;
    }
    public string Name { get; set; }
    public string Age { get; set; }
}

на практике это сводится к тому же самому и не так уж много дополнительной работы, я считаю. Но, может быть, на долгое время VB выглядит яснее, чем C # ...; -)

РЕДАКТИРОВАТЬ (обоснование):
Вы просили обоснование в своем последнем комментарии под (и в) ваш первоначальный вопрос. Размышляя вслух, я думаю, что принцип в C #, что код инициализации идет в одно место и только в одно место, а именно конструктор, является причиной этого решения. Добавление другого места, где вам нужно найти код инициализации, затрудняет отладку, а код становится менее понятным.

Очевидно, что значение встроенной инициализации не может содержать другие инициализации или вычисления (по крайней мере, очень ограниченные). Хотя я согласен с тем, что в VB это может быть более кратко, я бы понял команду C # и Андерса Хейлсберга, если бы они сказали, что считают большим преимуществом иметь одно место для инициализации.

РЕДАКТИРОВАТЬ: вот что Microsoft говорит об этом . Короче говоря, не для C # 4.0, но, возможно, C # 5.0? Кроме того:

"Это не так просто, как кажется: следующая вещь, которую вы хотите, это для конструктор для инициализации поддержки поле, но он может сделать это только через сеттер, который может быть не то, что ты хочешь. "

и (просто комментатор):

"Отсутствие инициализации или конструктора контроль делает функцию практически бесполезный для свойств, возвращающих ссылочный тип. "

0 голосов
/ 13 апреля 2010

У меня есть решение для утомительного бизнеса по преобразованию автоматического свойства в поле свойства с резервной копией: Мой аддин AtomineerUtils выполнит этот рефакторинг для вас одним нажатием клавиши. *

0 голосов
/ 13 апреля 2010

Хотя я не Microsoft, я бы предположил, что предполагаемая выгода была меньше, чем стоимость внедрения, тестирования и поддержки этой функции.

Конечно, вы можете просто установить значения по умолчанию, объявив конструктор, но я согласен, что синтаксис VB немного понятнее (особенно если вы собираетесь украшать его метаданными, такими как <DefaultValue(...)>)

...