Pull to refresh

Comments 37

UFO landed and left these words here
UFO landed and left these words here
А как же для строк, виндовые пути проще писать.
UFO landed and left these words here
а разве там "/" не подходит вместо "\\"?

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

UFO landed and left these words here
А вот в регулярках @ действительно незаменима :)
Результатом работы, как всегда в этой статье, будет вывод числа «20», а никак не «10».


и результатом работы следующий программы будет 5, а не 10.

:)
UFO landed and left these words here
Альтернативы? Java не предлагать.
UFO landed and left these words here
Статья полезная, приятно, что не пришлось ничего гуглить, а только освежить знания.
P.S. Хм, в последнем примере IsValid по семантике больше похоже на IsInvalid.
> Кроме выше описанных, есть еще одно чудо-слово __arglist, которое позволяет сделать функцию с переменным числом параметров, да еще и любого типа.
> Странным является то, что нельзя из коробки организовать проход по элементам с помощью foreach, да и напрямую к элементу из списка не обратиться. Так что до С++ или JavaScript c его arguments не дотягивает.:)

Вообще-то и в этом плане дотягивает и ещё мощнее даже — используйте params ( url=https://msdn.microsoft.com/en-us/library/w5zay9db.aspx ). Cтрогая типизация и можно совмещать в одной сигнатуре метода постоянное и переменное число аргументов. Например, такой метод:
void Test(int a, params int[] extraArgs) { }
// пример вызова
Test(1, «extraArg», «extraArg2», «extraArgN»);
params — всё же типизирован, в отличии __arglist. Хотя никто не мешает сделать всё тот же пресловутый dynamic.
static void Main(string[] args)
{
  Foo(10, "asd");
}
public static void Foo(params dynamic[] list)
{
  foreach (var item in list)
    Console.WriteLine(item);
}

Вот в чем смысл всюду dynamic совать? Конкретно в этом примере достаточно object.

Немаловажное отличие __arglist от params — в него можно передавать unsafe указатели, а затем доставать их через __refvalue. Указатель нельзя скастовать ни к object ни к dynamic.
А, вот где олигарх зарыт… Век живи — век учись.) Спасибо большое.
Ну на самом деле пользы от этого никакой, т.к. указатель можно скастовать к IntPtr и таки передать через params.
На практике вроде бы единственное реальное применение __arglist — это p/invoke вызовы всяких там printf.
Я не придираюсь, но по поводу пары вещей:

А еще можно написать так:

class A
{
public List Numbers => new List();
}

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

class A
{
public List Numbers { get { return new List(); } }
}


А чего еще можно ожидать создав метод который возвращает новый список? Здесь нет никакого сюрприза.

Аналогично к
Результатом работы будет вывод числа «20», а никак не «10».
, вы же сами написали что это мутатор.
Про символ @ в документации к языку все сказано, введен чтобы можно было использовать ключевые слова, также ожидаемое поведение.

Т.е. про большую часть статьи сказать WTF C# нельзя, поведение соответствует ожидаемому и документации.
По поводу @ и value.
VS подсвечивает, value в set-ре как ключевое слово, и тем самым создавая определенную неоднозначность в этом моменте.
В приведенном примере, мы, казалось бы, изменяем одно и тоже поле класса А:
  get { return @value; }
  set { @value = value; }

Но это не так. Данное поведение происходит из-за не соответствия @value в get и @value в set. @value в get будет являться ничем иным, кроме как, полем класса A. А @value в set на самом деле — это параметр функции set. Таким образом мы просто пишем value само в себя и никак не затрагиваем поле value в классе А.
Именно эту суть я и хотел донести. А кстати, в VS2012 и ниже подсветка переменных осуществляется некорректно.

А, касаемо
  public List Numbers => new List();

В предыдущем стандарте языка такого не было [Ну или как минимум VS 2013 выдает ошибку синтаксиса]. Вот и хотелось поведать о таких вот способах и предостеречь от ошибок.:)
Действительно, не знал про эту особенность о понимании одного написания по разному в get и set. Хотя идея писать @ вместо this.value вряд ли кому придет.
На самом деле при помощи __makeref() и __refvalue() реализуется всякий брутальный unsafe в стиле «а теперь берем этот указатель на массив байтов и ловким движением руки превращаем его в указатель на структуру».

Я только что побенчил — функция «GenericPtrToStructure» получается примерно в 100 раз быстрее чем лучший ответ на StackOverflow: stackoverflow.com/questions/2871/reading-a-c-c-data-structure-in-c-sharp-from-a-byte-array
Люто бешенно плюсую за статью! Некоторые моменты открыл для себя.
А по поводу замыканий и примера:
for (int i = 0; i < numbers.Length; i++)
    result[i] = numbers.Where(index => index < i);

есть добавить пять копеек…

Действительно, цикл for захватывает замыкания и значение будет определятся на момент использования результата. «Фиксится» копированиев во временную переменную
var localIndex = i;

Но вот тут:
foreach(var f in fooList)

доовольно интересная тема — до C# 5.0 была аналогичная ситуация, что и для for, а вот с выходом указанной версии на каждой итерации создается новая копия f (что-то типа «фикса»).

MS официально признала это изменение в языке версии 5.0 ломающим написанный ранее код, но в то же время были вынуждены пойти на этот шаг, так как по концепции foreach скоуп создаваемых переменных внутри foreach.
UFO landed and left these words here
Многие упомянутые вещи с натяжкой можно назвать «подводными камнями». Больше похоже на намеренный выстрел себе в ногу.
UFO landed and left these words here
Хорошая статья — дает представление о возможных пунктах, которые стоит упомянуть в coding conditions…
UFO landed and left these words here
Да.
Взять в кавычки — это наиболее простой вариант описания подобного синтаксиса.
Хехе… public void Foo(__arglist) напрочь вышибает VS2015. Может в resharper проблема, но студия крашится через 2 секунды :).
Данной проблемы я у себя не наблюдал. Но я фанатик максимально чистой студии без дополнительных плагинов, за исключением PVS-Studio.:)
Sign up to leave a comment.