AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX Blogs
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.12.2015, 11:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,626 / 848 (80) +++++++
Регистрация: 28.10.2006
mfp: X++ in AX7: The var keyword
Источник: http://blogs.msdn.com/b/mfp/archive/...r-keyword.aspx
==============


This is the new language feature that is generating most discussions. Just like C# you can now use the var keyword when declaring variables. It has the exact same semantics, and any guideline you will find on how to use it in C# will also apply in X++.



In C# the var keyword was introduced to enable scenarios where declaring the type was impossible, near-impossible or irrelevant, like with anonymous types and generics. Writing less was naturally well received by a lot of developers, and the use of var blossomed. It is also a great topic for steering up a debate. There are lots of guidelines and opinions. They cover the entire range from one extreme: "Always use it, it makes code easier to read" to the opposite extreme: "Never use it, it makes code harder to read".



X++ does not support anonymous types or generics in AX7 - so the real need for the var keyword is not present - yet it is supported, and already heavily used. Like in C# the use of var is as strongly typed as when the type is explicitly provided.




Personally, I'm recommending using var in only two cases:
  1. When the type is obvious.
    In X++ there is a lot of repetition. The var keyword can help avoid some of this clutter while making the code easier to read, without any information gets lost to the reader.

    For example:
    MyClass myClass = new MyClass();

    In AX7 I would write:
    var myClass = new MyClass();
  2. When the type is irrelevant.
    Sometimes you don't care about the type. If you don't care the reader most likely doesn't either.

    For example:
    ListEnumerator enumerator = myCollection.getEnumerator();

    In AX7 I would write:
    var enumerator = myCollection.getEnumerator();
There are a number of X++ specific reasons to not use var (i.e. doesn't apply to C#)
  1. Limited support Visual Studio.
    In the X++ editor in Visual Studio, you can use F12 to go to the declaration of a type. However, the X++ editor is still not as smart as the X++ compiler. At the time of this writing you are losing this drill through capability when not explicitly specifying the type of the variable. The same applies for IntelliSense – when using the var keyword, IntelliSense is not available (yet).

  2. Higher risk of runtime errors.
    Just like the C# compiler, the X++ compiler will determine the type from the assignment to the variable and enforce all the same rules and restrictions. So you might think that the use of var doesn't lead to more runtime errors. There is a catch in X++ - you should be aware of. The X++ compiler doesn't enforce any validation of method invocations on object or common. So if the X++ compiler determines the type to be object or common, then you lost your safety net. It is not always obvious.

    Consider this code:
    CustTable custTable = Xml2Record(xml);
    custTable.someInvalidMethod(); // Compile error


    Using var, the code becomes:
    var custTable = Xml2Record(xml);
    custTable.someInvalidMethod(); // No compile error, as Xml2Record() returns a common


THIS POST IS PROVIDED AS-IS AND CONFERS NO RIGHTS




==============
Источник: http://blogs.msdn.com/b/mfp/archive/...r-keyword.aspx
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 03.12.2015, 12:17   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
var myClass = new MyClass();
Интересно, а список методов после точки у такой переменной будет выскакивать?

Извиняюсь. Прочитал статью. Там есть ответ на этот вопрос. Отрицательный

Последний раз редактировалось S.Kuskov; 03.12.2015 в 12:23.
Старый 03.12.2015, 12:23   #3  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Интересно, а список методов после точки у такой переменной будет выскакивать?
Точно, IntelliSense не работает
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.

Последний раз редактировалось Link; 03.12.2015 в 12:27. Причина: RTFM
Старый 03.12.2015, 12:24   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
when using the var keyword, IntelliSense is not available (yet).
Видимо нет
__________________
Возможно сделать все. Вопрос времени
Старый 03.12.2015, 13:24   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Му-ха-ха-ха!!!!!

Кхе-кхе-Кх-х-хгр.... *подавился сардоническим смехом*
Старый 03.12.2015, 13:27   #6  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
А кто-нибудь понял в чем отличие от Object или Common?
типо просто круче?
Старый 03.12.2015, 13:38   #7  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от trud Посмотреть сообщение
А кто-нибудь понял в чем отличие от Object или Common?
типо просто круче?
Думаю, что дело не в том, что круче. Скорее всего т.к. АХ движется постепенно в сторону С#, то скорее и смысл будет тот же что и в С#. Видно, что добавили, но не доделали. Может для будущей совместимости, а может не получилось доделать. Собственно автор и дает рекомендации объявления в АХ7.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.

Последний раз редактировалось Link; 03.12.2015 в 14:26.
Старый 03.12.2015, 13:50   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от trud Посмотреть сообщение
А кто-нибудь понял в чем отличие от Object или Common?
типо просто круче?
Ещё в этот перечень можно добавить AnyType. По-моему так точная копия представленного var

И на всякий случай замечу, что в аскапте классы не обязаны наследоваться от Object.
Старый 03.12.2015, 15:38   #9  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ещё в этот перечень можно добавить AnyType. По-моему так точная копия представленного var
По-моему не совсем: var, нельзя использовать в объявлении параметров или возвращаемого типа метода. var нельзя присвоить null. К слову в C# как и в АХ тоже есть базовый класс object. А еще есть тип dynamic, который очень похож на object, но тип проверяется только во время выполнения.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И на всякий случай замечу, что в аскапте классы не обязаны наследоваться от Object.
А где об этом можно почитать?
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.

Последний раз редактировалось Link; 03.12.2015 в 16:38.
Старый 03.12.2015, 15:50   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И на всякий случай замечу, что в аскапте классы не обязаны наследоваться от Object.
Я так понимаю - необязательно писать extends Object у класса - т.к. это подразумевается по умолчанию. Но классы по-любому будут отнаследованы от Object. https://msdn.microsoft.com/en-us/library/object.aspx
__________________
Возможно сделать все. Вопрос времени
Старый 03.12.2015, 16:03   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Я так понимаю - необязательно писать extends Object у класса - т.к. это подразумевается по умолчанию. Но классы по-любому будут отнаследованы от Object. https://msdn.microsoft.com/en-us/library/object.aspx
Это очевидная ошибка в документации, в чем вы легко можете убедиться.
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 03.12.2015, 16:05   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Узнать, где находится объект (сервер или клиент)?
Цитата:
Сообщение от AndyD Посмотреть сообщение
Object совместим со всеми классами, но не все классы являются его потомками
За это сообщение автора поблагодарили: Logger (1), Link (1).
Старый 03.12.2015, 16:16   #13  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
А есть пример такого класса в АХ?
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 03.12.2015, 16:31   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
в 2009-й
\Classes\Activities\classDeclaration
2-й класс в ветке аот

X++:
class Activities
{
    boolean deleteSeries;
}

Последний раз редактировалось Logger; 03.12.2015 в 16:34.
Старый 03.12.2015, 16:40   #15  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Logger Посмотреть сообщение
в 2009-й
\Classes\Activities\classDeclaration
2-й класс в ветке аот

X++:
class Activities
{
    boolean deleteSeries;
}
Хм, у меня только 2012, но Браузер иерархии типа говорит, что наследуется от Object, да и не совсем ясно почему он вдруг не должен наследовать
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 03.12.2015, 16:50   #16  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Logger Посмотреть сообщение
\Classes\Activities\classDeclaration
Я правильно понимаю, что единственная причина, по которой вы привели это класс, что у него в свойствах Extends ничего не указанно?
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 03.12.2015, 17:02   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Link Посмотреть сообщение
Я правильно понимаю, что единственная причина, по которой вы привели это класс, что у него в свойствах Extends ничего не указанно?
Не только.
Создайте экземпляр такого класса в джобе (его или любого другого который ни от чего не наследуется). И попробуйте на нем вызывать методы класса Object
Получите ошибку времени выполнения.
Старый 03.12.2015, 17:15   #18  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Link Посмотреть сообщение
Хм, у меня только 2012, но Браузер иерархии типа говорит, что наследуется от Object, да и не совсем ясно почему он вдруг не должен наследовать
У меня 2009-я
Браузер иерархии говорит то же самое - что наследуется. А по факту это не так
Добро пожаловать в реальный мир, Нео.

Специально проверил в 2012-й
Там то же самое.

Последний раз редактировалось Logger; 03.12.2015 в 17:34.
За это сообщение автора поблагодарили: Link (1).
Старый 03.12.2015, 17:48   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Var это не тип данных - это просто ключевое слово что тип данных будет выведен из выражения при присваивании.

Var x= new MyClass();

У x тип myClass - результат совершенно тот же что и у myClass x = new MyClass()
Если вызвать x.nitExistingMetgod() результат не скопируется
Object x= new MyClass() у x тип object - можно присвоить значение-экземпляр другого класса

Если вызвать несуществующий метод результат скопируется но при запуске будет ошибка
За это сообщение автора поблагодарили: Logger (3).
Старый 03.12.2015, 17:53   #20  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Logger Посмотреть сообщение
У меня 2009-я
Браузер иерархии говорит то же самое - что наследуется. А по факту это не так
Добро пожаловать в реальный мир, Нео.

Специально проверил в 2012-й
Там то же самое.
Ваша правда, The Matrix has me
Более того, противоположно утверждению на MSDN, все новые не стандартные классы создаются без наследования Object И таковых немало среди стандартных. Интересно, от куда ноги растут у этого утверждения, если как минимум для 2009 и 2012 это не верно, а в статье указанно, что она относится к АХ 2012.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Теги
anytype, ax7, d365, mfp, var, x++

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
mfp: X++ in AX7 Blog bot DAX Blogs 0 02.12.2015 22:13
CRM DE LA CREME! Some more useful javascripts for MS CRM Blog bot Dynamics CRM: Blogs 0 04.05.2010 11:05
mscrmblog: Mini Preview Window for Contact Lookup Field Blog bot Dynamics CRM: Blogs 0 10.03.2010 01:05
CRM DE LA CREME! Some useful CRMform jscripts Blog bot Dynamics CRM: Blogs 0 02.09.2009 10:05
crmForm.IsDirty зохватит всех! Черничкин Станислав Dynamics CRM: Разработка 10 19.02.2008 08:10

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:10.