LINUX.ORG.RU

Вышел Mono 3.0

 , ,


0

2

После полутора лет разработки вышел мажорный релиз открытой кроссплатформенной реализации .NET Framework Mono 3.0.

Что нового:

  • Компилятор C# 5.0 с поддержкой асинхронного программирования.
  • Поддержка ASP.NET MVC 4, Razor.
  • Поддержка Entity Framework.
  • Новый высокопроизводительный сборщик мусора SGen.
  • Начальная поддержка CodeContracts.
  • Множественные улучшения производительности.

Поддержка и обновления mono 2.10 будут продолжаться еще в течение полугода.

>>> Подробности



Проверено: anonymous_incognito ()
Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от lazy_aleks

C++:

ofstream( "results.txt" ) << outputText;

C#:

using (var fs = new FileStream("d:\\results.txt", FileMode.Create,
    FileAccess.Write, FileShare.Write))
  {
    byte[] data = UnicodeEncoding.Default.GetBytes(outputText);
    await fs.WriteAsync(data, 0, data.Length);
  }

Просто вы не привыкли писать на шарпе (c)

wota ★★
()
Ответ на: комментарий от VEG

Просто посмотрите сколько полезного появилось за последние 10 лет в .NET, а сколько — в Java и с каким опозданием. Также Java не позволяет толком оптимизировать код. Ни тебе структур, ни указателей.

Разработчики твиттера прочитали твой пост и стремительно бросились переписывать свою инфраструктуру на моне

Karapuz ★★★★★
()
Ответ на: комментарий от anonymous

Без пояснения всё выглядело как сравнение тёплого с мягким, а так почти всё так.

З.Ы. Пользуясь случаем, передаю привет из about'а KeePassX ;)

Diffor
()
Ответ на: комментарий от wota

Смешно конечно, но некорректно какбэ. Можно на крестах написать длиннее, а на решетке короче.

anonymous
()
Ответ на: комментарий от anonymous

File.WriteAllLines(«results.txt», outputText); ЧЯДНТ?

не пишешь using + строку с открытием файла, using нужен т.к. в С# допотопное ручное управление ресурсами

wota ★★
()
Ответ на: комментарий от RedPossum

как ваш крестовой код будет реагировать на исключительные ситуации, а как будет реагировать шарповый?

как захочу - захочу одной строкой исключения разрешу, захочу опять же одной строкой получу состояние, итого кода на обработку таких ситуаций будет столько же как и в C#, ну и в данном примере для С# исключительные ситуации тоже никак не обрабатываются

wota ★★
()
Ответ на: комментарий от wota

Using - это чтобы не писать за зря .Dispose(), плюс он отрабатывает в финалайзе, т.е. освобождение выполнится гарантировано. Не слышал, чтобы при разовой записи в файл это нужно. Если писать много и в один и тот же файл - то да, стрим.

anonymous
()
Ответ на: комментарий от RedPossum

как ваш крестовой код будет реагировать на исключительные ситуации,

кстати отдельных пару слов об этом - в С++ не надо помнить об using и ставить его везде, после исключения все закроется и освободится автоматом, чего не скажешь про C# :(

wota ★★
()
Ответ на: комментарий от wota

Файл закроется, инфа сохранится, доступ освободится. Гарантировать не буду: сто лет так ни делал, потому что опасно в серьезных проектах, но вроде бы просто сработать должно.

anonymous
()
Ответ на: комментарий от anonymous

Файл закроется

как только GC доберется до этого объекта, а пока ему будет «лень» - файл будет висеть открытым

wota ★★
()
Ответ на: комментарий от wota

нужно, чтоб файл закрыть

В данном случае не нужно, т.к. WriteAllLines - статический метод класса File, который (цитирую msdn) «Creates a new file, write the specified string array to the file, and then closes the file.»

Gris
()
Ответ на: комментарий от wota

В маленьком проекте он очень быстро доберется, про большой проект я уже писал)

anonymous
()
Ответ на: комментарий от wota

File.WriteAllLines(«results.txt», outputText); ЧЯДНТ?

не пишешь using + строку с открытием файла, using нужен т.к. в С# допотопное ручное управление ресурсами

Ее и не надо писать. Открытие, закрытие и обработка исключительных ситуаций находится в потрохах метода WriteAllLines.

anonymous
()
Ответ на: комментарий от anonymous

да, я уже понял, невнимательно читал, сорри

wota ★★
()
Ответ на: комментарий от anonymous

там вроде ничего сказано про реализацию метода и в частности про поведение при исключении при записи

wota ★★
()
Ответ на: комментарий от wota

там вроде ничего сказано про реализацию метода и в частности про поведение при исключении при записи

Благо все это - оупен сорс:

public static void WriteAllLines (string path, string [] contents)
{
	using (StreamWriter writer = new StreamWriter (path)) {
		WriteAllLines (writer, contents);
	}
}

static void WriteAllLines (StreamWriter writer, string [] contents)
{
	foreach (string line in contents)
		writer.WriteLine (line);
}
anonymous
()
Ответ на: комментарий от wota

А какие могут быть варианты кроме закрытия файла и выброса исключения наружу?

Вот реализация этих методов в mono:

public static void WriteAllLines (string path, string [] contents)
{
	using (StreamWriter writer = new StreamWriter (path)) {
		WriteAllLines (writer, contents);
	}
}

static void WriteAllLines (StreamWriter writer, string [] contents)
{
	foreach (string line in contents)
		writer.WriteLine (line);
}

anonymous
()
Ответ на: комментарий от anonymous

могло быть без using, хотя конечно его написать было более чем логично

П.С. судя по всему, код в mono берется напрямую из первоисточника, что в принципе хорошо для совместимости

wota ★★
()
Ответ на: комментарий от cruxish

Этот дикий микс из var, let, select и using в непонятных местах совсем не похож на тот лаконичный синтаксис C#, который я видел в версии 2.0.

функцианальное программирование заполоняе

Karapuz ★★★★★
()
Ответ на: комментарий от anonymous

Спрашивали о ситуациях когда mono удобнее чем Qt и GTK+, а ответили про C# и написание веб приложений.

This is LOR, babe

Karapuz ★★★★★
()
Ответ на: комментарий от lazy_aleks

Просто я не умею писать на шарпе

это конечно да, но от этого using не перестает быть очевидным костылем

wota ★★
()
Ответ на: комментарий от wota

В каком месте он костыль? То что Dispose при работе с каким-нибудь объектом, скажем при работе с классом, связанным с БД, не нужно ручками писать и в файналайз засовывать? А почему, если это ересь и костыль, недавно его аналог добавили в джаву?

anonymous
()
Ответ на: комментарий от wota

Я в жабе не силен, но вроде оно там пишется как try( ... ) а не как using( ... )

anonymous
()

Кто нить юзал связку linux+nginx+xsp? Если да, то как впечатления?

anonymous
()
Ответ на: комментарий от anonymous

То что Dispose при работе с каким-нибудь объектом, скажем при работе с классом, связанным с БД, не нужно ручками писать и в файналайз засовывать?

а это недостаток реализации ЯП, который using прикрывает, GC не может эффективно и сразу освобождать ресурсы, потому часть его работы переложили на программистов

А почему, если это ересь и костыль, недавно его аналог добавили в джаву?

я только благодаря джаве и знаю, что это такое в С#, на последнем я даже Hello World не писал, и да - в джаве оно ничем не лучше

wota ★★
()
Ответ на: комментарий от wota

Тебе было велено озвучить твое (ублюдочное и неправильное) определение виртуальной машины. Ты, школота, этого не сделало. Свободен, чмо.

anonymous
()
Ответ на: комментарий от wota

Стоп. Интерфейс айдиспозбл вешается туды, где нужен тонкий контроль за ресурсами - соединения с БД и прочие вещи с ограниченным ресурсом. Ты можешь юзать страшный проект с огромной нагрузкой, и GC просто не сможет за всем успевать. Поэтому и Dispose, поэтому и Using(...). Это подстраховка такая, я считаю что если бы GC работал в 100500 раз лучше, Dispose() и using() стоило бы все равно оставить, хотя у меня нареканий к GC в шарпе, в общем, нет.

Тем более раз в конкуренте от другой корпорации зла все также, я не вижу резона ругать GC в шарпе - сравнить не с чем же по сути больше.

anonymous
()

Ха, тема уже в топ-10, не знает границ моносрач)

anonymous
()
Ответ на: комментарий от anonymous

соединения с БД и прочие вещи с ограниченным ресурсом

да, «unmanaged» ресурсы, которые надо руками освобождать

и GC просто не сможет за всем успевать. Поэтому и Dispose, поэтому и Using(...)

ну вот возьмем случай с using - разве есть проблема компилятору определить, что объект реализует IDisposable и используется только в рамках «прямой» видимости? вряд ли, и значит можно сразу добавить код для освобождения ресурсов, не заставляя писать его вручную, но вероятно это посчитали неоптимальным или я просто узко посмотрел на задачу и не увидел важных деталей

wota ★★
()
Ответ на: комментарий от wota

Если я правильно помню, то фишка IDisposable и связанного с этим «сахара» в том, чтобы освободить ресурсы немедленно, а не уничтожить объект как таковой. Т.е. он не уничтожается после вызова .Dispose() и собирается GC на общих основаниях. Один из бонусов класического использования using(..) в том, что эта конструкция не только автоматически вызывает Dispose(), но и ограничивает область видимости переменной, так что на объект после выхода из блока более никто не ссылается, а значит это первый кандидат на сбор мусора.

Gris
()
Ответ на: комментарий от wota

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

anonymous
()
Ответ на: комментарий от Gris

Да, вы правы.

Имхо, Dispose+using все-таки не костыль, а фича)

anonymous
()
Ответ на: комментарий от Gris

освободить ресурсы немедленно, а не уничтожить объект как таковой.

да, я это и имел ввиду

но и ограничивает область видимости переменной

компилятор может и сам ее определить

wota ★★
()
Ответ на: комментарий от wota

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

anonymous
()
Ответ на: комментарий от anonymous

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

во всех случаях, когда и используют using

не слишком надежно чтобы провоцировать людей не использовать явно освобождение ресурсов

если гарантировать освобождение ресурсов в таких случаях - вряд ли кто-то будет спорить, даже если кто-то и будет для перестраховки руками освобождать ресурсы, и даже если для этого оставят using

wota ★★
()
Ответ на: комментарий от wota

во всех случаях, когда и используют using

это знает программист, а компилятору прийдется пройтись по всему стеку вызовов от создания объекта, до выхода из метода и убедиться что ссылка не «ушла», в результате выйдет что то типа «automatic reference count» как в objective-c и прийдется выдумывать ключевое слово противоположное using, подсказывающее компилятору НЕ вызывать Dispose, т.к. опять же программист лучше знает что ему нужно.

anonymous
()
Ответ на: комментарий от anonymous

а компилятору прийдется пройтись

мне его не жалко )

прийдется выдумывать ключевое слово противоположное using, подсказывающее компилятору НЕ вызывать Dispose, т.к. опять же программист лучше знает что ему нужно.

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

wota ★★
()
Ответ на: комментарий от Ttt

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

Napilnik ★★★★★
()
Ответ на: комментарий от anonymous

RAII это фича языка, от VM поддержки не требуется

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.