Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2013, 18:49   #31
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Например нулю. Второй вариант не соображу сразу так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.12.2013, 21:44   #32
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Вопрос, конечно, не про .NET; я просто продолжил старую тему.
ds.Dante вне форума Ответить с цитированием
Старый 24.12.2013, 18:12   #33
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

В общем, смотрю, никто не отвечает.

Два варианта - ноль и int.MinValue. Во втором случае унарный минус вызывает арифметическое переполнение и снова даёт MinValue.

Два моих друга правильно ответили на этот вопрос. Один сообразил проверить граничные условия, а другой тупо написал перебор всех чисел.
ds.Dante вне форума Ответить с цитированием
Старый 24.12.2013, 18:26   #34
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
унарный минус вызывает арифметическое переполнение и снова даёт MinValue.
Хы... Не знал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.12.2013, 20:53   #35
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Оказывается, это число отдельным пунктом упоминается в Википедии.

Java при вызове Math.abs(Integer.MIN_VALUE) тупо возвращает исходное отрицательное число, а .NET кидает исключение.

Код:
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static int Abs(int value)
{
	if (value >= 0)
	{
		return value;
	}
	return Math.AbsHelper(value);
}

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
private static int AbsHelper(int value)
{
	if (value == -2147483648)
	{
		throw new OverflowException(Environment.GetResourceString("Overflow_NegateTwosCompNum"));
	}
	return -value;
}
Цитата:
System.OverflowException: Negating the minimum value of a twos complement number is invalid.

Последний раз редактировалось ds.Dante; 24.12.2013 в 20:55.
ds.Dante вне форума Ответить с цитированием
Старый 25.02.2014, 20:07   #36
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию Как нельзя ловить исключения

Продолжу свои развлекательно-познавательные заметки (правда, на этот раз - без вопроса и засыпки).

Код:
using System;
using System.Collections.Generic;

static class Program
{
    static void Main()
    {
        IEnumerable<int> stuff;
        try
        {
            stuff = GetStuff();
        }
        catch
        {
            Console.WriteLine("Can't get the stuff!");
            return;
        }
        foreach (var foo in stuff)
            Console.WriteLine(foo);
    }

    static IEnumerable<int> GetStuff()
    {
        throw new NotImplementedException();
        yield return 0;
    }
}
Изначальный замысел понятен: программер вызывает GetStuff() внутри блока try, обрабатывая его исключения. Однако ленивая коллекция прокрастинирует, и вылетает с ошибкой только при последующем обращении, уже вне try-catch. Обратите внимание, что если убрать строчку yield return 0 в конце, то дотнет додумается побороть свою лень и вылететь сразу в нужном месте.

Всё это - следствие закона дрырявых абстракций: ленивые коллекции - это очень удобно и красиво, но без знания их устройства они иногда внезапно лягаются.

Что делать?

1) Самое простое - сразу материализовать GetStuff() с помощью ToList().
2) Если вы пишете библиотеку, с осторожностью принимайте параметры IEnumerable<T> из неизвестного источника. Лучше требуйте ICollection<T>, чтобы пользователь библиотеки сам вызывал ToList().
3) Если коллекция может быть очень большой, и материализация ударит по производительности, то просто держите в уме, что любой вызов foreach и расширений LINQ потенциально может вылететь с исключением.

Последний раз редактировалось ds.Dante; 25.02.2014 в 20:15.
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос на засыпку по show columns smoke888 SQL, базы данных 5 17.09.2012 12:46
Вопрос на засыпку mnbvcxz13 Свободное общение 3 09.11.2011 18:36
вопрос на засыпку...... Rukata Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 19.09.2009 23:39
Вопрос на засыпку BuT@JL Помощь студентам 6 08.03.2009 12:56