Здравствуйте, nigh, Вы писали:
N>Да нет, там все гораздо глубже. Основная мысль в том, что Disposable и try-finally для семантики локов не подходят и создают ложное ощущение безопасности.
Это проблема exception safety guarantees, она существует и без всяких локов или даже потоков. Она даже существует без using'ов, только ещё хуже.
А вот RAII, using'и, try-with-resourcues, with — как раз подходят к семантике локов. А вот ложное ощущение безопасности — это от незнания exception safety
N>
N>WithdrawMoney(AccountB, 100) //throw an exception here, will never unlock unless proper recovery is done - likely a deadlock, but not further data corruption by other threads
N>
Если тебе нравится "likely a deadlock, but not further data corruption by other threads" — то лучше сразу на первом же исключении пристреливать программу и тормозить всю систему, без всяких "likely", чтоб наверняка — так robust'ней
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, nigh, Вы писали:
N>>Да нет, там все гораздо глубже. Основная мысль в том, что Disposable и try-finally для семантики локов не подходят и создают ложное ощущение безопасности.
EP>Это проблема exception safety guarantees, она существует и без всяких локов или даже потоков. Она даже существует без using'ов, только ещё хуже. EP>А вот RAII, Using'и, try-with-resourcues как раз подходят к семантике локов, а ложное ощущение безопасности — это от незнания exception safety.
В C# средствами языка exception safety не достигается. Даже checked exceptions нету (от них больше вреда чем пользы). Мы же тут C# обсуждаем?
Когда вы пишете библиотечный код надо думать о самых глупых пользователях и не подталкивать их писать потенциально проблемный код, давая для этого удобные инструменты.
N>>
N>>WithdrawMoney(AccountB, 100) //throw an exception here, will never unlock unless proper recovery is done - likely a deadlock, but not further data corruption by other threads
N>>
EP>Если тебе нравиться "likely a deadlock, but not further data corruption by other threads" — то лучше сразу на первом же исключении пристреливать программу и тормозить всю систему
Мне оно не особо нравится, просто в ряде задач это лучше, чем data corruption. Более того, правильную обработку exceptionа во втором случае можно где-нибудь ниже по стеку сделать, в отличие от.
Пристреливать всю программу необязательно (хотя можно), есть, скажем таймауты — другие треды будут продолжать нормально работать.
Здравствуйте, xy012111, Вы писали:
X>Мда, я был уверен, что EditorConfig умеет хотя бы скобки расставлять, а там из полезного лишь настройка табуляции
Так про то и речь. Сама студия крайне бедна в этом плане. Розлин немного получше стал, но до решарпера/стайлкопа еще очень далеко. Тащить в проект стайлкоп не хочется, а решарпер платный (через 3 месяца можно попросить для основных девелоперов бесплатную лицензию).
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Так про то и речь. Сама студия крайне бедна в этом плане. Розлин немного получше стал, но до решарпера/стайлкопа еще очень далеко. Тащить в проект стайлкоп не хочется, а решарпер платный (через 3 месяца можно попросить для основных девелоперов бесплатную лицензию).
Чего греха таить -- у всех так или иначе есть либо платная либо бесплатная/самогенереным серийником версия. Что, еще остались люди без решарпера?
Если у кого нету -- реально можно триал а потом выклянчить ключик.
Здравствуйте, AndrewVK, Вы писали:
X>>Мда, я был уверен, что EditorConfig умеет хотя бы скобки расставлять, а там из полезного лишь настройка табуляции
AVK>Так про то и речь. Сама студия крайне бедна в этом плане. Розлин немного получше стал, но до решарпера/стайлкопа еще очень далеко. Тащить в проект стайлкоп не хочется, а решарпер платный (через 3 месяца можно попросить для основных девелоперов бесплатную лицензию).
Может ты просто экспортнёшь свои настройки C# и C# Editor из студии и как отдельный проект в Rsdn опубликуешь? И все кому надо будут его брать и перед работой с rsdn-проектами импортить себе. Туда же рядышком можно положить и файл настроек РеШарпера, для тех, у кого он есть и кто его хочет использовать.
Здравствуйте, xy012111, Вы писали:
X>Может ты просто экспортнёшь свои настройки C# и C# Editor из студии и как отдельный проект в Rsdn опубликуешь?
У меня они дефолтные кроме табуляции, я решарпером пользуюсь.
X>Туда же рядышком можно положить и файл настроек РеШарпера, для тех, у кого он есть и кто его хочет использовать.
Файл настроек решарпера с самого начала лежит в репе рядом с sln.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Sinix, Вы писали:
S>>Лучше не с явы, на SO есть почти рабочее решение, очень близкое к нативной StrCmpLogical. В коде опечатка падает при сравнении строк из нулей, как поправить в комментариях есть.
AVK>Да я вроде жабное портанул уже, вполне рабочее. Так что ХЗ как лучше. Ты как считаешь?
А насколько близкое нужно к StrCmpLogicalW? Сейчас ожидаемые результаты лежащие в гите и StrCmpLogical расходятся:
Здравствуйте, _Raz_, Вы писали:
_R_>А насколько близкое нужно к StrCmpLogicalW?
Без понятия. Реквест не мой.
_R_> Сейчас ожидаемые результаты лежащие в гите и StrCmpLogical расходятся: _R_>Получается что компарер со StackOverflow не будет работать с текущими expected.
Что то мне результат StrCmpLogical вообще не кажется правдоподобным. Пробелы, к примеру, обрабатываются некорректно.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Что то мне результат StrCmpLogical вообще не кажется правдоподобным. Пробелы, к примеру, обрабатываются некорректно.
Легко проверить
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace ConsoleApplication2
{
class Program
{
public class StrCmpLogicalWComparer : IComparer<string>
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
public int Compare(string x, string y)
{
return StrCmpLogicalW(x, y);
}
}
static void Main()
{
var data = new[]
{
" b3.txt",
"10",
"x10m.txt",
"20",
"2",
"444444",
"b10.txt",
"a10b1.txt",
"10.txt",
"3.txt",
"x2m.txt",
"a1b1.txt",
"a2b2.txt",
" ",
"01",
"a2b1.txt",
"a2b11.txt",
" b4.txt ",
"b1.txt",
"1.txt",
"0000010.txt",
"b2.txt",
"1",
"",
" 15",
" 16"
};
var sorted = new List<string>(data);
sorted.Sort(new StrCmpLogicalWComparer());
foreach (var s in sorted)
{
Console.WriteLine("\"{0}\"", s);
}
Console.ReadKey();
}
}
}
Здравствуйте, AndrewVK, Вы писали: AVK>Что то мне результат StrCmpLogical вообще не кажется правдоподобным. Пробелы, к примеру, обрабатываются некорректно.
Здравствуйте, xy012111, Вы писали:
X>Может ты просто экспортнёшь свои настройки C# и C# Editor из студии и как отдельный проект в Rsdn опубликуешь?
В приличных домах это делается через Rebracer + CodeMaid + StyleCop rule set + CodeAnalysis rule set. Всё настраивается per solution.
Ну и .EditorConfig можно положить чтоббыл, но его редко кто использует.
CodeMaid настраивается на автоформатирование кода при сохранении и любые соглашения по форматированию сводятся к "это правило можно применить автоматически при сохранении файла? нет — до свидания".
Ничего круче (просто открываешь студию, ставишь рекомендованные расширения и просто пишешь код) по удобству не будет.
Не, конечно можно попытать счастья с решарпером, но он во-первых есть не у всех, а во-вторых он использует свои соглашения типа
//NOTTODO: IT: The name is the best ever. Don't change it.public static string Args([NotNull] this string format, params object[] args) => string.Format(format, args);
Чот я не уверен в best ever.
UPD: Я знатно протупил с вариантом .Format(), AndrewVK намекнул ниже Но Args мне всё равно не нравится
Аргументы против в произвольном порядке: 0. Guidelines. Имя метода не совпадает с производимым действием.
1. WTF test fail.
Возьми произвольного девелопера и спроси: "эй, у нас будет метод-расширение для форматирования строк, как он должен выглядеть?"
Сколько напишут
var sayHelloFormat = @"Hello, {0}"!
...
return sayHelloFormat.Args(wellKnownNames[0]); // WTF???
вместо
var sayHelloFormat = @"Hello, {0}"!
...
return sayHelloFormat.Format(wellKnownNames[0]);
?
2. Совместимость с другими решениями. В куче проектов используется SmartFormat с extensions вида
var x = "You have {0} new {0:message|messages}".SmartFromat(emails.Count);
var y = "You have new message(s): {0}".Args(emails.Count); // WTF???
3. Too noisy. Подобные узкоприменимые расширения должны быть opt-in. Иначе после подключения юзинга ради полезной фичи (например, NotNullNorEmpty()) intellisence засоряется куда менее полезными Точнее, абсолютно бесполезными с учётом пары SmartFromat + c# string interpolation. Только чур не спорить "это ж один метод, фигня!".
У меня из-за таких дачобудет в одном из доставшихся в подарок проектов только на object 12 extension-ов вылазят. Нафиг-нафиг.
Ну, т.е.
1. Переименовать в .Format().StringFormat() или что-то типа того.
2. Спрятать в отдельный namespace.
Это всё не ради срача, а чтоб сделать код лучше. Если решение принципиально будет "всё равно останется как есть" — можно не спорить, просто так и скажи
Здравствуйте, Sinix, Вы писали:
S>1. Переименовать в .Format()
Компилятор против
S>2. Спрятать в отдельный namespace.
Спорно.
S>Это всё не ради срача, а чтоб сделать код лучше. Если решение принципиально будет "всё равно останется как есть" — можно не спорить, просто так и скажи
Добавил вообще то IT, а не я.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
S>>1. Переименовать в .Format() AVK>Компилятор против
Слона я не заметил
У меня эти штуки сделаны парой UserStringFormat()/ InvariantStringFormat(), забыл про конфликт с static-методом.
Ну и в пару два статик-класса UserString/InvariantString, вызывают методы из System.String, только с соответствующей культурой/comparison.
Может, их тоже добавить?
AVK>Добавил вообще то IT, а не я.
Так ему и отвечал
Здравствуйте, AndrewVK, Вы писали:
S>>Не, конечно можно попытать счастья с решарпером, но он во-первых есть не у всех, AVK>Так и CodeMaid со стайлкопом тоже не у всех.
Зато бесплатные и вызывают гораздо меньше проблем
AVK>Большая часть настраивается. И ну ее нафик, такую каноничность как в примере — читать неудобно.
Ну тут опять-таки вкус фломастеров
Из практики, когда не у всех в команде есть решарпер, поддержать общий стиль форматирования заметно сложнее — получается "или все прогинаемся под R#, или никак".