Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Новые возможности Visual Basic 10 
:(
    Опции темы
diadiavova
Дата 26.9.2009, 11:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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

Источник находится здесь
http://msdn.microsoft.com/en-us/library/we...8VS.100%29.aspx
И далее по ссылкам

Новые возможности языка Visual Basic 10

Автореализованные свойства

Автореализованные свойства позволяют Вам быстро определить свойство класса, без необходимости писать код получения и присвоения значения свойства. Когда Вы пишете код для автореализованного свойства, компилятор Visual Basic автоматически создает Private поле, для хранения значения свойства в дополнение к созданию связанных процедур Get и Set.

С автореализованными свойствами свойство, включая значение по умолчанию, может быть объявлено в одну строку. Следующий пример показывает три объявления свойства.
Код

Public Property Name As String
Public Property Owner As String = "DefaultName"
Public Property Items As New List(Of String) From {"M", "T", "W"}

Автореализованное свойство эквивалентно свойству, для которого значение свойства размещено в Private поле. Следующий пример кода показывает автореализованное свойство.
Код

Dim _Prop2 As String = "Empty"
Property Prop2 As String
    Get
        Return _Prop2
    End Get
    Set(ByVal value As String)
        _Prop2 = value
    End Set
End Property


Поле поддержки (Backing Field)

Когда Вы объявляете автореализованное свойство, Visual Basic автоматически создает скрытое Private поле, называемое полем поддержки(Backing Field), для хранения значения свойства. Имя поля поддержки формируется из имени автореализованного свойства, которому предшествует символ подчеркивания (_). Например, если Вы объявляете автореализованное свойство с именем ID, поле поддержки называют _ID. Если Вы включаете в свой класс элемент, который также имеет имя _ID, Вы создаете конфликт имён, и Visual Basic сообщает об ошибке компилятора.

Поле поддержки также имеет следующие характеристики:
  • Модификатор области видимости поля поддержки всегда Private, даже когда само свойство имеет другой уровень доступа, например, Public. 
  • Если свойство отмечено как Shared, поле поддержки также Shared.
  • Атрибуты, указанные для свойства, не применяются к полю поддержки.
  • Поле поддержки может быть вызвано из кода в пределах класса и из средств отладки, например, окна Watch. Однако, Поле поддержки не показывает в списке завершения слова IntelliSense.

Инициализация Автореализованного Свойства

Любое выражение, которое может использоваться для инициализации поля, допустимо для того, чтобы инициализировать автореализованное свойство. Когда Вы инициализируете автореализованное свойство, выражение оценивается и передаётся к процедуре Set свойства. Следующие примеры кода показывают некоторые автореализованные свойства, которые включают начальные значения.
Код

Property FirstName As String = "James"
Property PartNo As Integer = 44302
Property Orders As New List(Of Order)(500)


Вы не можете инициализировать автореализованное свойство, которое является элементом Интерфейса, или тем, который отмечен MustOverride.

Когда Вы объявляете автореализованное свойство как элемент Структуры, Вы можете только инициализировать автореализованное свойство, если оно отмечено как Shared.

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

Property Grades As Integer() = {90, 73}
Property Temperatures As Integer() = New Integer() {68, 54, 71}


Определения Свойства, Требующие Стандартного Синтаксиса

Автореализованные свойства удобны и поддерживают много сценариев программирования. Однако, есть ситуации, в которых Вы не можете использовать автореализованное свойство и должны вместо этого использовать стандарт, или расширенный, синтаксис свойства.

Вы должны использовать расширенный синтаксис определения свойства, если Вы хотите выполнить одно из следующих действий:
  • Добавить код к процедуре Get или Set свойства, например, код, проверки достоверности входных значений в процедуре Set. Например, Вам, возможно, нужно проверять, что строка, представляющая номер телефона, содержит необходимое число цифр прежде, чем установить значение свойства.
  • Определить разные уровни доступа для процедур Get и Set. Например, если нужно сделать процедуру Set - Private, а процедуру Get -  Public.
  • Создать WriteOnly или ReadOnly свойства.    
  • Использовать параметризуемые свойства (включая Default свойства). Вы должны объявить расширенное свойство, чтобы определить параметр для свойства, или определить дополнительные параметры для процедуры Set.    
  • Добавить атрибут полю поддержки.
  • Предоставить XML-комментарии для поля поддержки.

Расширение Автореализованного Свойства

Если Вам нужно конвертировать автореализованное свойство в расширенное, которое содержит процедуру Get или Set, Редактор кода Visual Basic может автоматически сгенерировать процедуры Get и Set и оператор End Property для свойства. Код сгенерирован, если Вы разместите курсор на пустой строке после оператора Property,напечатаете G (для, Get) или S (для Set), и нажмёте ENTER. Редактор кода Visual Basic автоматически сгенерирует процедуру Get или Set для WriteOnly и ReadOnly свойств, когда Вы нажмёте ENTER в конце оператора Property.

Инициализаторы коллекций

Инициализаторы коллекции предоставляют сокращенный синтаксис, который позволяет Вам создать коллекцию и заполнить её с начальным набором значений. Инициализаторы коллекции полезны, когда Вы создаете коллекцию из ряда известных значений, например, списка опций меню или категорий, начальный набор числовых значений, статического списка строк, например, имен дня или месяца, или географических местоположений, например, списка состояний, которые используются для проверки правильности.

Для идентификации инициализатора коллекции, используется ключевое слово From, за которым следуют фигурные скобки ({}). Это похоже на синтаксис литерала массива, который описан в Массивах в Visual Basic. Следующие примеры показывают различные способы использовать инициализаторы коллекции, чтобы создать коллекции.
Код

' Создание массива типа String().
Dim winterMonths = {"December", "January", "February"}

' Создание массива типа Integer()
Dim numbers = {1, 2, 3, 4, 5}

' Создание списка опций меню. (Требуется метод-расширитель
' названый Add для List(Of MenuOption)
Dim menuOptions = New List(Of MenuOption) From {{1, "Home"},
                                                {2, "Products"},
                                                {3, "News"},
                                                {4, "Contact Us"}}


Синтаксис

Инициализатор коллекции состоит из разделённого запятыми списка значений, заключённого в фигурные скобы ({}), которым предшествует ключевоге слово From, как показано в следующем примере.
Код

Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}


Когда Вы создаете коллекцию, например, List (Of T) или Dictionary (Of TKey, TValue), Вы должны указатьть тип коллекции перед инициализатором коллекции, как показано в следующем коде.

Код

Public Class AppMenu
    Public Property Items As List(Of String) =
        New List(Of String) From {"Home", "About", "Contact"}
End Class


Инициализаторы коллекции не могут использоваться совместно с инициализаторами объекта.

Создание Коллекции, с использованием инициализатора коллекций

Когда Вы создаете коллекцию, используя инициализатор коллекции, каждое значение, которое предоставлено в инициализаторе коллекции, передаётся соответствующему методу Add коллекции. Например, если Вы создаете List(Of T), используя инициализатор коллекции, каждое строковое значение в инициализаторе коллекции передаётся методу Add. Если Вы хотите создать коллекцию, используя инициализатор коллекции, указанный тип должен быть допустимым типом коллекции. Примеры допустимых типов коллекции включают классы, которые реализуют IEnumerable (Of T) интерфейс или наследуют класс CollectionBase. Указанный тип должен также предоставить метод Add, который отвечает следующим критериям.
  • Метод Add должен быть доступным из области, в которой вызывают инициализатор коллекции. Метод Add не должен быть общедоступным, если Вы используете инициализатор коллекции в сценарии, где могут быть вызваны непубличные методы коллекции.
  • Метод Add должен быть членом объекта или элементом Shared класса коллекции, или методом расширения.
  • Метод Add должен соответствовать основным разрешающим правилам перегрузки, для типов, которые предоставлены инициализатору коллекции.


Например, следующий пример кода показывает, как создать коллекцию List(Of Customer), используя инициализатор коллекции. Когда код выполнен, каждый объект Customer передан методу Add (Customer) универсального списка.

Код

Dim customers = New List(Of Customer) From
    {
        New Customer("City Power & Light", "http://www.cpandl.com/"),
        New Customer("Wide World Importers", "http://www.wideworldimporters.com/"),
        New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/")
    }


Следующий пример кода показывает эквивалентный код, который не использует инициализатор коллекции.

Код

Dim customers = New List(Of Customer) 
customers.Add(New Customer("City Power & Light", "http://www.cpandl.com/"))
customers.Add(New Customer("Wide World Importers", "http://www.wideworldimporters.com/"))
customers.Add(New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/"))



Если у коллекции есть метод Add с параметрами, соответствующими конструктору объекта Customer, Вы можете вложить значения параметра метода Add в инициализатор коллекции, как описано в следующем разделе. Если у коллекции нет такого метода Add, Вы можете создать его, как метод расширения. Примера того, как создать метод Add как метод расширения для коллекции, см. Методы расширения (Visual Basic), Используемый Инициализатором Коллекции. Примера того, как создать пользовательскую коллекцию, которая может использоваться с инициализатором коллекции, см. How to: Create a Collection Used by a Collection Initializer.

Вложение Инициализаторов Коллекции

Вы можете вкладывать значения в пределах инициализатора коллекции, чтобы идентифицировать специфичную перегрузку метода Add для коллекции, которая создается. Значения, переданные к методу Add, должны быть отделены запятыми и заключены в фигурные скобки ({}), как Вы сделали бы в литерале массива или инициализаторе коллекции.

Когда Вы создаете коллекцию, используя вложенные значения, каждый элемент вложенного списка значения передается в качестве параметра методу Add, который соответствует типам элемента. Например, следующий пример кода создает Dictionary(Of TKey, TValue), в котором ключи имеют тип Integer, и значения имеют тип String. Каждому из вложенных списков значения соответствуют метод Dicnionary.Add.

Код

Dim days = New Dictionary(Of Integer, String) From
    {{0, "Sunday"}, {1, "Monday"}}


Предыдущий пример эквивалентен следующему коду.
Dim days = New Dictionary(Of Integer, String)
days.Add(0, "Sunday")
days.Add(1, "Monday")


Только вложенные значения списков первого уровня вложения передаются методу Add коллекции. Более глубокие уровни вложения обрабатываются как литералы массива, и вложенным спискам значения не соответствуют метод Add никакой коллекции.

Неявное Продолжение Строки

Во многих случаях, неявное продолжение строки позволяет Вам продолжать оператор на следующей строке, не используя символ подчеркивания (_).

Список случаев, в которых можно пропустить знак подчёркивания

После запятой

Код

Public Function GetUsername(ByVal username As String,
                            ByVal delimiter As Char,
                            ByVal position As Integer) As String

    Return username.Split(delimiter)(position)
End Function



После открывающей круглой скобки (() или перед закрывающей круглой скобкой ()).

Код

Dim username = GetUsername(
    Security.Principal.WindowsIdentity.GetCurrent().Name,
    CChar("\"),
    1
  )


После открывающей фигурной скобки ({) или перед закрывающей фигурной скобкой (}).

Код

Dim customer = New Customer With {
  .Name = "Terry Adams",
  .Company = "Adventure Works",
  .Email = "[email protected]"
}


После открытого встроенного выражения (<% =) или перед ближайшим из встроенных выражений (%>) в пределах XML- литерала.

Код

Dim customerXml = <Customer>
                      <Name>
                          <%=
                              customer.Name
                          %>
                      </Name>
                      <Email>
                          <%=
                              customer.Email
                          %>
                      </Email>
                  </Customer>




После оператора конкатенации строк (&)
Код

cmd.CommandText = 
    "SELECT * FROM Titles JOIN Publishers " &
    "ON Publishers.PubId = Titles.PubID " &
    "WHERE Publishers.State = 'CA'"


После операторов присвоения (=, &=, :=, +=, -=, *=, /=, \=, ^=, <<=, >>=)

Код

Dim fileStream =
  My.Computer.FileSystem.
    OpenTextFileReader(filePath)


' Не разрешено:
' Dim aType = New With { .
'    PropertyName = "Value"

' Разрешено:
Dim aType = New With {.PropertyName =
    "Value"}



Dim log As New EventLog()

' Не разрешено:
' With log
'    .
'      Source = "Application"
' End With

' Разрешено:
With log
    .Source =
      "Application"
End With


После бинарных операторов (+, -, /, *, Mod, <>, <, >, <=, >=, ^, >>, <<, And, AndAlso, Or, OrElse, Like, Xor) в выражениях.

Код

Dim memoryInUse =
  My.Computer.Info.TotalPhysicalMemory +
  My.Computer.Info.TotalVirtualMemory -
  My.Computer.Info.AvailablePhysicalMemory -
  My.Computer.Info.AvailableVirtualMemory


После операторов Is и IsNot

If TypeOf inStream Is 
  IO.FileStream AndAlso
  inStream IsNot
  Nothing Then

    ReadFile(inStream)

End If


После символа (.) спецификатора члена и перед именем члена. Однако, Вы должны включить символ продолжения строки (_) после символа спецификатора члена, при использовании оператора With или предоставлении значения в списке инициализации для типа. Рассмотрите разрыв строки после оператора присваивания (например, =), когда Вы используете операторы With или списки инициализации объекта. 

Код

Dim fileStream =
  My.Computer.FileSystem.
    OpenTextFileReader(filePath)


' Не разрешено:
' Dim aType = New With { .
'    PropertyName = "Value"

' Разрешено:
Dim aType = New With {.PropertyName =
    "Value"}



Dim log As New EventLog()

' Не разрешено:
' With log
'    .
'      Source = "Application"
' End With

' Разрешено:
With log
    .Source =
      "Application"
End With



После спецификатора свойства оси XML (. или .@ или ...). Однако, Вы должны включить символ продолжения строки (_), когда Вы определяете спецификатор элемента, когда Вы используете ключевjt слово With.

Код

Dim customerName = customerXml.
  <Name>.Value

Dim customerEmail = customerXml...
  <Email>.Value


После символа «меньше чем» (<) или перед символом "больше чем" (>), при определении атрибута. Также после символа "больше чем" (>),при определении атрибута. Однако, Вы должны включить символ продолжения строки (_), когда атрибуты определяются на уровне сборки или модуля.

Код

<
Serializable()
>
Public Class Customer
    Public Property Name As String
    Public Property Company As String
    Public Property Email As String
End Class


Перед и после операторов запроса (Aggregate, Distinct, From, Group By, Group Join, Join, Let, Order By, Select, Skip, Skip While, Take, Take While, Where, In, Into, On, Ascending, и Descending). Нельзя прерывать строку между ключевыми словами операторов запроса, которые составлены из множественных ключевых слов (Order By, Group Join, Take While и Skip While).

Код

Dim vsProcesses = From proc In
                    Process.GetProcesses
                  Where proc.MainWindowTitle.Contains("Visual Studio")
                  Select proc.ProcessName, proc.Id,
                         proc.MainWindowTitle



После ключевого слова In в операторе For Each
Код

For Each p In
  vsProcesses

    Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",
      p.ProcessName,
      p.Id,
      p.MainWindowTitle)
Next


После ключевого слова From в инициализаторе коллекций.

Код

Dim days = New List(Of String) From
  {
   "Mo", "Tu", "We", "Th", "F", "Sa", "Su"
  }



Пока всё что есть smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 27.9.2009, 13:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Многострочные Лямбда Выражения и Подпрограммы

Поддержка лямбда выражений была расширена, теперь поддерживаются многострочные лямбда функции и подпрограммы.
Lambda Expressions
Лямбда-выражение - функция или подпрограмма без имени, которое может использоваться везде, где допустим делегат. Лямбда - выражения могут быть функциями или подпрограммами и могут быть однострочными или многострочными. Вы можете передать значения лямбда–выражениям объекты, доступные в текущей области видимости.

Замечание

Оператор RemoveHandler - исключение. Вы не можете передать лямбда - выражение в качестве делегата параметра RemoveHandler.


Лямбда–выражения создаются при помощи  ключевого слова Sub или Function, так же, как и при создании стандартной функции или подпрограммы. Однако, лямбда-выражения включены в оператор.
Следующий пример - лямбда-выражение, которое увеличивает собственный параметр и возвращает значение. Пример показывает и однострочный и многострочный синтаксис лямбда-выражения для функции.
Код

Dim increment1 = Function(x) x + 1
Dim increment2 = Function(x)
                     Return x + 2
                 End Function

' Write the value 2.
Console.WriteLine(increment1(1))

' Write the value 4.
Console.WriteLine(increment2(2))


Следующий пример - лямбда-выражение, которое выводит значение на консоль. Пример показывает и однострочный и многострочный синтаксис лямбда - выражения для подпрограммы.
Код

Dim writeline1 = Sub(x) Console.WriteLine(x)
Dim writeline2 = Sub(x)
                     Console.WriteLine(x)
                 End Sub

' Write "Hello".
writeline1("Hello")

' Write "World"
writeline2("World")


Обратите внимание, что в предыдущих примерах лямбда-выражения назначены имени переменной. Всякий раз, когда Вы ссылаетесь на переменную, Вы вызываете лямбда-выражение. Вы можете также объявить и вызвать лямбда-выражение в то же самое время, как показано в следующем примере.
Код

Console.WriteLine((Function(num As Integer) num + 1)(5))

Лямбда-выражение может быть возвращено функцией (как показано в примере в разделе Контекст далее в этой теме), или передано в неё как аргумент к параметру, получающему тип делегата, как показано в следующем примере.
Код

Module Module2

    Sub Main()
        ' The following line will print Success, because 4 is even.
        testResult(4, Function(num) num Mod 2 = 0)
        ' The following line will print Failure, because 5 is not > 10.
        testResult(5, Function(num) num > 10)
    End Sub

    ' Sub testResult takes two arguments, an integer value and a 
    ' delegate function that takes an integer as input and returns
    ' a boolean. 
    ' If the function returns True for the integer argument, Success
    ' is displayed.
    ' If the function returns False for the integer argument, Failure
    ' is displayed.
    Sub testResult(ByVal value As Integer, ByVal fun As Func(Of Integer, Boolean))
        If fun(value) Then
            Console.WriteLine("Success")
        Else
            Console.WriteLine("Failure")
        End If
    End Sub

End Module


Синтаксис лямбда-выражений

Синтаксис лямбда-выражения напоминает синтаксис стандартной функции или подпрограммы. Различия следующие:
  • У лямбда-выражения нет имени.
  • У лямбда-выражений не может быть модификаторов, такой как Overloads или Overrides.
  • Однострочные лямбда-функции не используют оператор As, чтобы определять тип возвращаемого значения. Вместо этого тип выводится из значения, которое производит тело лямбда - выражения. Например, если тело лямбда - выражения - cust.City = "London", его тип возвращаемого значения  Boolean. 
  • В многострочных лямбда-функциях Вы можете или определить тип возвращаемого значения, используя оператор As, или опустить оператор As так, чтобы тип возвращаемого значения был выведен. Когда оператор As опущен для многострочной лямбда-функции, тип возвращаемого значения выводится, как доминирующий тип всех операторов Return в многострочной лямбда-функции. Доминирующий тип - уникальный тип, от которого могут быть произведены все другие типы, возвращаемые выражением.  Если этот уникальный тип не может быть определен, доминирующий тип - уникальный тип, к которому все другие типы в массиве могут быть приведнены, посредством сужающего преобразования. Если ни один из этих уникальных типов не может быть определен, доминирующий тип - Object. Например, если список значений, предоставленных литералу массива, содержит значения типа Integer, Long, и Double, результирующий массив имеет тип Double. И Integer и Long расширяется к типу  Double и только  Double.
  • Поэтому, Double доминирующий тип. Дополнительная инормация здесь Widening and Narrowing Conversions.
  • Тело однострочной функции должно быть выражением, которое возвращает значение, не оператором. Нет никакого оператора Return в однострочных функциях. Значение, возвращенное однострочной функцией, является значением выражения в теле функции. 
  • Тело однострочной подпрограммы должно быть однострочным оператором.
  • Однострочные функции и подпрограммы не включают End Function или End Sub.
  • Вы можете определить тип данных параметра лямбда-выражения, используя ключевое слово As, или тип данных параметра может быть выведен. Или для всех параметров, должны быть, определены типы данных, или все должны выводиться.
  • Optional и Paramarray параметры не разрешены.
  • Generic параметры не разрешены.
Контекст

Лямбда-выражение разделяет свой контекст с областью видимости, в пределах которой оно определено. У него есть те же самые права доступа как у любого кода, написанного в содержащей области. Это включает доступ к полям, функциям и подпрограммам, Me, и параметрам и локальным переменным в содержащей области. 
Доступ к локальным переменным и параметрам в содержащей области может простираться за пределы времени существования той области. Пока делегат, ссылающийся на лямбда-выражение, не доступен для сборки мусора, доступ к переменным в оригинальной среде сохранен. В следующем примере переменная target является локальной по отношению к методу makeTheGame, в котором определено лямбда-выражение playTheGame. Обратите внимание, что возвращенное лямбда-выражение, назначенное takeAGuess в Main, все еще имеет доступ к локальной переменной target.
Код

Module Module6

    Sub Main()
        ' Variable takeAGuess is a Boolean function. It stores the target
        ' number that is set in makeTheGame.
        Dim takeAGuess As gameDelegate = makeTheGame()

        ' Set up the loop to play the game.
        Dim guess As Integer
        Dim gameOver = False
        While Not gameOver
            guess = CInt(InputBox("Enter a number between 1 and 10 (0 to quit)", "Guessing Game", "0"))
            ' A guess of 0 means you want to give up.
            If guess = 0 Then
                gameOver = True
            Else
                ' Tests your guess and announces whether you are correct. Method takeAGuess
                ' is called multiple times with different guesses. The target value is not 
                ' accessible from Main and is not passed in.
                gameOver = takeAGuess(guess)
                Console.WriteLine("Guess of " & guess & " is " & gameOver)
            End If
        End While

    End Sub

    Delegate Function gameDelegate(ByVal aGuess As Integer) As Boolean

    Public Function makeTheGame() As gameDelegate

        ' Generate the target number, between 1 and 10. Notice that 
        ' target is a local variable. After you return from makeTheGame,
        ' it is not directly accessible.
        Randomize()
        Dim target As Integer = CInt(Int(10 * Rnd() + 1))

        ' Print the answer if you want to be sure the game is not cheating
        ' by changing the target at each guess.
        Console.WriteLine("(Peeking at the answer) The target is " & target)

        ' The game is returned as a lambda expression. The lambda expression
        ' carries with it the environment in which it was created. This 
        ' environment includes the target number. Note that only the current
        ' guess is a parameter to the returned lambda expression, not the target. 

        ' Does the guess equal the target?
        Dim playTheGame = Function(guess As Integer) guess = target

        Return playTheGame

    End Function

End Module


Следующий пример демонстрирует широкий диапазон прав доступа вложенного лямбда-выражения. Когда возвращенное лямбда-выражение выполняется от Main как aDel, он обращается к этим элементам:
  • Поле класса, в котором оно определено: aField
  • Свойство класса, в котором оно определено: aProp
  • Параметр метода functionWithNestedLambda, в котором оно определено: level1
  • Локальная переменная functionWithNestedLambda: localVar
  • Параметр лямбда-выражения, в который оно вложено: level2
Код

Module Module3

    Sub Main()
        ' Create an instance of the class, with 1 as the value of 
        ' the property.
        Dim lambdaScopeDemoInstance = New LambdaScopeDemoClass _
            With {.Prop = 1}

        ' Variable aDel will be bound to the nested lambda expression  
        ' returned by the call to functionWithNestedLambda.
        ' The value 2 is sent in for parameter level1.
        Dim aDel As aDelegate = _
            lambdaScopeDemoInstance.functionWithNestedLambda(2)

        ' Now the returned lambda expression is called, with 4 as the 
        ' value of parameter level3.
        Console.WriteLine("First value returned by aDel:   " & aDel(4))

        ' Change a few values to verify that the lambda expression has 
        ' access to the variables, not just their original values.
        lambdaScopeDemoInstance.aField = 20
        lambdaScopeDemoInstance.Prop = 30
        Console.WriteLine("Second value returned by aDel: " & aDel(40))
    End Sub

    Delegate Function aDelegate(ByVal delParameter As Integer) _
        As Integer

    Public Class LambdaScopeDemoClass
        Public aField As Integer = 6
        Dim aProp As Integer

        Property Prop() As Integer
            Get
                Return aProp
            End Get
            Set(ByVal value As Integer)
                aProp = value
            End Set
        End Property

        Public Function functionWithNestedLambda _
           (ByVal level1 As Integer) As aDelegate
            Dim localVar As Integer = 5

            ' When the nested lambda expression is executed the first 
            ' time, as aDel from Main, the variables have these values:
            ' level1 = 2
            ' level2 = 3, after aLambda is called in the Return statement
            ' level3 = 4, after aDel is called in Main
            ' locarVar = 5
            ' aField = 6
            ' aProp = 1
            ' The second time it is executed, two values have changed:
            ' aField = 20
            ' aProp = 30
            ' level3 = 40
            Dim aLambda = Function(level2 As Integer) _
                              Function(level3 As Integer) _
                                  level1 + level2 + level3 + localVar _
                                  + aField + aProp

            ' The function returns the nested lambda, with 3 as the 
            ' value of parameter level2.
            Return aLambda(3)
        End Function

    End Class
End Module


Преобразование в тип Delegate

Лямбда-выражения могут быть явно преобразованы в совместимый тип делегата. Информацию об основных требованиях совместимости смотрите здесь Relaxed Delegate Conversion. Например: следующий пример кода показывает лямбда-выражение, которое явно конвертируется в Func(Of Integer, Boolean) или в делегат с соответствующей сигнатурой.
Код

' Explicitly specify a delegate type.
Delegate Function MultipleOfTen(ByVal num As Integer) As Boolean

' This function matches the delegate type.
Function IsMultipleOfTen(ByVal num As Integer) As Boolean
    Return num Mod 10 = 0
End Function

' This method takes an input parameter of the delegate type. 
' The checkDelegate parameter could also be of 
' type Func(Of Integer, Boolean).
Sub CheckForMultipleOfTen(ByVal values As Integer(),
                          ByRef checkDelegate As MultipleOfTen)
    For Each value In values
        If checkDelegate(value) Then
            Console.WriteLine(value & " is a multiple of ten.")
        Else
            Console.WriteLine(value & " is not a multiple of ten.")
        End If
    Next
End Sub

' This method shows both an explicitly defined delegate and a
' lambda expression passed to the same input parameter.
Sub CheckValues()
    Dim values = {5, 10, 11, 20, 40, 30, 100, 3}
    CheckForMultipleOfTen(values, AddressOf IsMultipleOfTen)
    CheckForMultipleOfTen(values, Function(num) num Mod 10 = 0)
End Sub


Когда вы присваиваете лямбда-выражения делегатам, или передаёте их процедурам в качестве аргументов вы можете указать имена параметров, но опустить типы данных, позволив типам быть выведенными из делегата.

Примеры
  • Следующий пример определяет лямбда-выражение, которое возвращает True если nullable аргументу было присвоено значение, и False если его значение - Nothing.
    Код

    Dim notNothing =
      Function(num? As Integer) num IsNot Nothing
    Dim arg As Integer = 14
    Console.WriteLine("Does the argument have an assigned value?")
    Console.WriteLine(notNothing(arg))
  • Следующий пример определяет лямбда-выражение, возвращающего индекс последнего элемента массива.
    Код

    Dim numbers() = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim lastIndex =
      Function(intArray() As Integer) intArray.Length - 1
    For i = 0 To lastIndex(numbers)
        numbers(i) += 1
    Next

Типа продолжение следует... smile 

Это сообщение отредактировал(а) diadiavova - 27.9.2009, 18:59


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 15.10.2009, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Новая опция командной строки, указывающая версию языка.

/langversion
Код

/langversion:версия

Аргументы
версия
Обязательный. Версия языка, используемая во время компиляции. Принимаемы значения 9, 9.0, 10, и 10.0

Замечания

Опция /langversion указывает какой синтаксис принимается компилятором. Например, если указать версию 9.0, то компилятор сгенерирует ошибку для синтаксиса используемого только в версии 10.0 и более поздних. 
Можно установить опцию напрямую , используя командную строку. В Visual Studio IDE версия устанавливается автоматически, при выборе целевой версии .Net Framework вашего приложения. Дополнительные сведения находятся здесь
Targeting a Specific .NET Framework Version or Profile.

Пример
Код

vbc /langversion:9.0 sample.vb




Поддержка Эквивалентности Типа (Type Equivalence Support)
Теперь  вы можете развёртывать приложение, со встроенной информацей о типе вместо импорта  Primary Interop Assembly (PIA). Со встроенной информацией о типе Ваше приложение может использовать типы во время исполнения, не требуя ссылки на сборку. Если опубликованы различные версии сборки во время исполнения, приложение, которое содержит встроенную информацию о типе, может работать с различными версиями, без необходимости перекомпиляции.

Дополнительная информация здесь  /link (Visual Basic). Пример здесь Walkthrough: Embedding Types from Managed Assemblies.


В общих чертах: теперь вместо того, чтобы на целевую машину таскать за собой сборки взаимодействия, компилятор будет встраивать информацию о COM-типах прямо в программу.(прим. diadiavova)

Поддержка динамических языков
Visual Basic сможет связываться с объектами динамических языков, таких как IronPython и IronRuby. Дополнительная информация здесь
Working with Dynamic Objects (Visual Basic).

Документация пока не готова, так что более подробное разьяснение, по всей видимости, пока описать не удастся. Видимо речь идёт о поддержке DLR, вот статья в буржуйской википедии
Dynamic Language Runtime (прим. diadiavova)




Ковариация и контрвариация

Ковариация и контрвариация обеспечивают дополнительную гибкость при сравнении подписей методов с типами делегатов. Ковариация позволяет методу иметь тип возвращаемого значения, степень наследования которого больше, чем указано в делегате. Контрвариация использовать метод с типами параметров, степень наследования которых меньше, чем у типа делегата. Подразумевается неявное преобразование классов, которые реализуют различные интерфейсы, и предоставляет больше гибкости при определении соответствия сигнатурам методов с различными типами делегата. Вы можете создать различные интерфейсы и делегаты, используя новые ключевые слова In и Out..NET Framework также представляет различную поддержку нескольких существующих универсальных интерфейсов и делегатов, включая интерфейс IEnumerable(Of T) и делегаты Func((Of TResult)) и Action(Of T).

Начиная с .Net Framework 4 и Visual Studio 10, оба языка C# и Visual Basic поддерживают переменные универсальные интерфейсы и делегаты и разрешают неявное преобразование параметров универсальных типов. Оба языка так же позволяют создавать собственные переменные интерфейсы и делегаты.

Для иллюстрации ковариации рассмотрим интерфейс IEnumerable(Of Object). Тип String наследуется от  типа Object, и в некоторых случаях Вы, возможно, хотите присвоить объекты этих интерфейсов друг к другу, как показано в следующем примере кода.

Код

Dim strings As IEnumerable(Of String) = New List(Of String)
'…
Dim objects As IEnumerable(Of Object) = strings


В более ранних версиях этот код привёл бы к ошибке компиляции в C# и в Visual Basic при Option Strict On.
Вариация поддерживается только для ссылочных типов, тогда как значимые типы не поддерживают вариацию.Например: (IEnumerable(Of Integer) не может быть напрямую преобразован в (IEnumerable(Of Object).

В предыдущем примере вы могли использовать строки вместо объектов, благодаря тому, что интерфейс IEnumerable(Of T) – ковариантен.
 
Для иллюстрации контрвариантности, представьте себе, что у вас есть Windows Forms приложение, в котором события MouseClick и KeyDown обрабатываются одинаково. В то же время событие MouseClick использует делегат с аргументом типа MouseEventArgs, а событие KeyDown использует аргумент типа KeyEventArgs. Контрвариация позволяет создать только один обработчик, принимающий параметр типа EventArgs. Этот обработчик сможет обрабатывать оба события, потому что оба типа MouseEventArgs и KeyEventArgs произведены от типа EventArgs. Поэтому можно написать код, показанный далее

Код

' Event hander that accepts a parameter of the EventArgs type.
Private Sub MultiHandler(ByVal sender As Object,
                         ByVal e As System.EventArgs)
    Label1.Text = DateTime.Now
End Sub

Private Sub Form1_Load(ByVal sender As System.Object,
    ByVal e As System.EventArgs) Handles MyBase.Load

    ' You can use a method that has an EventArgs parameter,
    ' although the event expects the KeyEventArgs parameter.
    AddHandler Button1.KeyDown, AddressOf MultiHandler

    ' You can use the same method 
    ' for the event that expects the MouseEventArgs parameter.
    AddHandler Button1.MouseClick, AddressOf MultiHandler
End Sub




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 21.5.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



В связи с выходом официальной документации на русском языке, тема больше не актуальна. 
http://msdn.microsoft.com/ru-ru/library/we86c8x2.aspx
Отпускаю в свободное плавание  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Pilger
Дата 21.5.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Цитата
Автореализованные свойства позволяют Вам быстро определить свойство класса, без необходимости писать код получения и присвоения значения свойства.


Жаль что это не актуально для ReadOnly и WriteOnly свойств.


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 21.5.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



В любом случае сниппеты и макросы всё ещё доступны smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.