Во-первых, найдите этот атрибут наверху своего файла App.xaml и удалите его:
StartupUri="Window1.xaml"
, Который означает, что приложение автоматически не инстанцирует Вашего главного окна и покажет его.
Затем, переопределяют метод OnStartup в Вашем классе Приложения для выполнения логики:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if ( /* test command-line params */ )
{
/* do stuff without a GUI */
}
else
{
new Window1().ShowDialog();
}
this.Shutdown();
}
Функционально, LINQ - не что иное, как синтаксический упрощение выражения монад. Linq to Objects (понимание списков - даже это уже было бы чрезвычайно полезно), о котором вы говорили, является лишь одним возможным применением этого (аналогично List-Monad в Haskell).
Если вы напишете
from x in expr1
from y in expr2
select x + y
, это будет не что иное, как
do
x <- expr1
y <- expr2
return $ x + y
в Haskell.
Конкретные действия зависят от определенных пользователем Linq-провайдеров (методов расширения), из которых Linq.Enumerable
- это всего лишь одна реализация, включающая IEnumerable
s.
Предоставляя один, вы можете создать совершенно новую LINQ-семантику для ваших типов.
Пример: учитывая тип Option
для вычислений, которые могут завершиться ошибкой (значения, допускающие значение NULL), можно определить Linq-провайдер для выполнения запросов к ним.
public static class MaybeExtensions
{
public static Option<T> ToMaybe<T>(this T value)
{
return Option<T>.Some(value);
}
public static Option<U> SelectMany<T, U>(
this Option<T> m,
Func<T, Option<U>> k)
{
return !m.IsNone ? Option<U>.None : k(m.Value);
}
public static Option<V> SelectMany<T, U, V>(
this Option<T> m,
Func<T, Option<U>> k,
Func<T, U, V> s)
{
return m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe()));
}
}
Теперь это позволит нам написать такой код:
var sum = from x in ReadNumber("x")
from y in ReadNumber("y")
select x + y;
Вычисление будет возвращать значение только в том случае, если все вычисления завершились успешно, и в противном случае потерпит неудачу при первом сбое.
В комбинация с деревьями выражений,Linq может быть чрезвычайно мощным и позволяет вам выражать -
Некоторые ссылки:
В сочетании с комбинаторами с фиксированной точкой Linq предоставляет полный функциональный мини-язык ( Linq raytracer ).
Обратите внимание, что Scala и F # имеют схожие концепции в выражениях для понимания и вычислений. монадические абстракции:
Scala:
for (x <- expr1
y <- expr2) yield x + y
F #:
monad {
let! x = expr1
let! y = expr2
return x + y
}
Одышка, вероятно, предназначена для всех этих "очевидных" вещей, некоторые из которых (например, деревья выражений) действительно превосходны. Язык - это просто средство доступа; Вас волнует ключевое слово throw
или его функциональность?
Кроме того, читая книгу об этом, вы уже использовали LINQ? Я обнаружил, что это значительно экономит время в моей повседневной работе над программированием. Для меня это следующий шаг абстракции, который можно использовать для объединения различных источников данных, таких как XML или SQL, и работы с ними на одном «языке».
Кроме того,
Ядро LINQ, синтаксис запросов, на самом деле не так уж велико. Это просто некоторые очень буквальные переводы в методы и лямбда-выражения - так что
var qry = from x in src
where x.Foo == "foo"
select x.Bar;
буквально :
var qry = src.Where(x => x.Foo == "foo").Select(x => x.Bar);
Он ничего не знает о методах расширения (хотя они являются наиболее распространенными (но не только ) реализация), и ничего о Expression
и т. д. Количество ключевых слов (и, следовательно, количество требуемых реализаций методов) невелико. Джон однажды попытался реализовать их все за 1 час (в живой презентации). Он не так уж плохо справился ;-p
Возможно, более впечатляющей частью LINQ является поддержка дерева выражений , которая требовалась для использования LINQ в базах данных, т.е. лямбда-выражение, которое может быть скомпилировано либо в делегат , либо в объектную модель, представляющую написанный код. Интересно, что эта же идея проявляется и в том, как разрешение DLR работает в 4.0.
LINQ был вдохновлен HaskellDB, как неоднократно заявлял Эрик Мейер , например, в Признания продавца используемых языков программирования (Привлечение масс к Haskell) , поэтому сама по себе это не новая концепция. Использование одного и того же языка для запросов к разным источникам в некоторой степени является новаторским, хотя тот факт, что вложенная реляционная модель охватывает XML, объекты и реляционные базы данных, уже был продемонстрирован исследователями ранее. Для меня очень круто то, что он был встроен в популярный, универсальный и в первую очередь объектно-ориентированный язык, чего раньше не было.
ИМХО, Scala может включать нечто подобное. Пока что для Scala у нас есть ScalaQuery Стефана Зейгера и Daniel Spiewak »