Что делает “Новый … С” синтаксисом, делают в VB Linq?

это произошло со мной, потому что я попытался выполнить access UI компонент в another thread insted of UI thread

, как этот

private void button_Click(object sender, RoutedEventArgs e)
{
    new Thread(SyncProcces).Start();
}

private void SyncProcces()
{
    string val1 = null, val2 = null;
    //here is the problem 
    val1 = textBox1.Text;//access UI in another thread
    val2 = textBox2.Text;//access UI in another thread
    localStore = new LocalStore(val1);
    remoteStore = new RemoteStore(val2);
}

, чтобы решить эту проблему, обернуть любой вызов ui внутри , о чем упоминал Кандид в своем ответе

private void SyncProcces()
{
    string val1 = null, val2 = null;
    this.Dispatcher.Invoke((Action)(() =>
    {//this refer to form in WPF application 
        val1 = textBox.Text;
        val2 = textBox_Copy.Text;
    }));
    localStore = new LocalStore(val1);
    remoteStore = new RemoteStore(val2 );
}

18
задан GEOCHET 9 February 2009 в 15:32
поделиться

6 ответов

Различие - то, что 1-е явно создает анонимный тип. 2-е является выражением запроса и может использовать существующий тип вместо того, чтобы создать анонимный тип. Из документации, связанной Cameron MacFarland:

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

15
ответ дан 30 November 2019 в 08:53
поделиться

Мое понимание - то, что нет никакого различия.

New With нацелен к использованию из запроса как

Dim X = New With { .Surname = "A", .Forename = "B" }

Специально для запросов Linq, можно пропустить New With, но это все еще полезно для других ситуаций. Я не уверен, однако, так как я не знаю VB 9 :)

2
ответ дан 30 November 2019 в 08:53
поделиться

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

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

Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }

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

2
ответ дан 30 November 2019 в 08:53
поделиться

Их называют Анонимные Типы .

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

Они имеют тенденцию работать временными типами для устройства хранения данных посреди большого или многослойного запроса LINQ.

1
ответ дан 30 November 2019 в 08:53
поделиться

Одно различие - то, что Анонимные типы не являются сериализуемыми.

0
ответ дан 30 November 2019 в 08:53
поделиться

Нет никакой разницы. Компилятор определит анонимный тип.

Скорее всего, вы захотите вернуть значение элементов, как в e. .Value , которое возвращает String вместо XElement.

Второй пример можно упростить как

Dim ee = From e In someXML.<Employee> _
         Select e.<Surname>.Value, e.<Forename>.Value

, потому что компилятор также выведет имена членов анонимного типа.

Однако, если у вас есть следующий класс

Class Employee

    Private _surname As String
    Public Property Surname() As String
        Get
            Return _surname
        End Get
        Set(ByVal value As String)
            _surname = value
        End Set
    End Property

    Private _forename As String
    Public Property Forename() As String
        Get
            Return _forename
        End Get
        Set(ByVal value As String)
            _forename = value
        End Set
    End Property

End Class

, вы можете изменить 1-й запрос, чтобы создать IQueryable (Of Employee) вместо анонимного типа с помощью New ... Примерно так:

Dim ee = From e In someXML.<Employee> _
         Select New Employee With {.Surname = e.<Surname>.Value, _
                                   .Forename = e.<Forename>.Value}
1
ответ дан 30 November 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: