2010-04-13 7 views
8

Глядя на новые функции VB 2010, я наткнулся на поддержку Auto-Implemented Properties.Почему автоматические свойства C# не поддерживают значения по умолчанию, такие как VB 2010?

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

Public Class Person 

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

End Class 

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

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

+0

Зачем нужна область поддержки, нет необходимости в этом. Но я согласен, что это добавляет к беспорядку. – Abel

+0

PS: вы не были первым, кто спросил, проверьте это для более подробного обсуждения: http://stackoverflow.com/questions/169220/initializing-c-auto-properties – Abel

+0

@Abel: Я помню, как я видел этот пост. Я знаю, что это невозможно, и как обойти это, но мне было любопытно, почему именно VB поддерживает его, а C# (пока). –

ответ

3

насчет:

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

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

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

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

EDIT:here's what Microsoft says about it. Короче говоря, не для C# 4.0, а, возможно, C# 5.0? Также:

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

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

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

.
+0

James Curran комментирует этот ответ, говоря: «DefaultValueAttribute НЕ устанавливает значение свойства. Все, что он делает, это сказать Visual Studio что должно быть значением по умолчанию, так что в окне свойств будет выделено полужирным, если оно не установлено на это значение. Оно не меняет значения каким-либо образом » –

+0

См. комментарий в другом разделе:« DefaultValueAttribute НЕ устанавливает значение свойства. Все, что он делает, сообщает Visual Studio, что должно быть значением по умолчанию, так что в окне свойств будет выделено полужирным, если оно не установлено на это значение. Оно никак не изменяет значение ». –

+0

Если я не ошибаюсь, 'DefaultValue' устанавливает значение для Visual Studio на панели свойств, но не устанавливает значение во время выполнения. – Shimrod

10

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

+0

Точно. Пятно на. – Finglas

+1

Это то, что я обычно делаю, но иногда бывает полезно увидеть значения по умолчанию при объявлении. –

+2

У вас может быть несколько конструкторов, следовательно, несколько значений по умолчанию. Таким образом, хотя это хорошее решение, оно не так чистое, как предоставление единственного значения по умолчанию. –

0

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^