[C#, Этюд] равно или нет
От: nikov США http://www.linkedin.com/in/nikov
Дата: 28.08.09 10:01
Оценка: 2 (1)
Что напечатает такая программа?

using System;

class Program
{
    static void Main()
    {
        int? x = null;
        bool? y = null;

        Console.WriteLine(x < x || x == x);
        Console.WriteLine(x <= x);

        Console.WriteLine(x == (x | 1));
        Console.WriteLine(y == (y | true));
    }
}
Re: [C#, Этюд] равно или нет
От: matumba  
Дата: 28.08.09 10:31
Оценка:
Здравствуйте, nikov, Вы писали:

N>Что напечатает такая программа?


Да ерунду она напечатает!

null <= null — это оказывается false! ппц...

null | 1 = null — хорошо, вполне логично (а-ля NULL в SQL)
Но null | true = true — это ерунда полная.

О, сколько нам граблюшек чудных готовит микрощенья дух...
Re: [C#, Этюд] равно или нет
От: Ромашка Украина  
Дата: 28.08.09 10:38
Оценка:
nikov написав(ла):
> Что напечатает такая программа?

false во всех случаях?
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: Гм... А почему? (-)
От: Ромашка Украина  
Дата: 28.08.09 10:44
Оценка:
сабж
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: [C#, Этюд] равно или нет
От: Пельмешко Россия blog
Дата: 28.08.09 10:52
Оценка: 89 (4)
Здравствуйте, matumba, Вы писали:

M>Да ерунду она напечатает!


M>null | 1 = null — хорошо, вполне логично (а-ля NULL в SQL)

M>Но null | true = true — это ерунда полная.

Если бы Вы знали логику SQL относительно null так же хорошо, как пытаетесь критиковать MS..
Special for you, учите матчасть:
Re: [C#, Этюд] равно или нет
От: Ellin Россия www.rsdn.ru
Дата: 28.08.09 10:55
Оценка:
Здравствуйте, nikov, Вы писали:
Вообще как мне известно nullable типы пришли под веяньем работы с БД. А там, как известно тема NULL весьма и весьма деликатная. Так что сейчас в любом случае будут недовольные.
Re[3]: [C#, Этюд] равно или нет
От: Ellin Россия www.rsdn.ru
Дата: 28.08.09 10:57
Оценка:
Здравствуйте, Пельмешко, Вы писали:
Вот только в трехзначной логике не null используется, а unknown. Им нужно было вводить не nullable типы, а voidable.
и было бы еще одно использование ключ. слова void.
Re: [C#, Этюд] равно или нет
От: Пельмешко Россия blog
Дата: 28.08.09 11:02
Оценка:
Здравствуйте, nikov, Вы писали:

N>Что напечатает такая программа?

        Console.WriteLine(x == (x | 1));

В этом случае true.

§ 7.2.7 Lifted operators

• For the binary operators
+ — * / % & | ^ << >>
a lifted form of an operator exists if the operand and result types are all non-nullable value types. The lifted form is constructed by adding a single ? modifier to each operand and result type. The lifted operator produces a null value if one or both operands are null (an exception being the & and | operators of the bool? type, as described in §7.10.3). Otherwise, the lifted operator unwraps the operands, applies the underlying operator, and wraps the result.


Так как правый операнд — null, то и всё выражение null, дальше null == null.
Тут же указано исключение насчёт следующего случая касательно операторов & и |.
Re[4]: [C#, Этюд] равно или нет
От: Пельмешко Россия blog
Дата: 28.08.09 11:14
Оценка: +1
Здравствуйте, Ellin, Вы писали:

E>Здравствуйте, Пельмешко, Вы писали:

E>Вот только в трехзначной логике не null используется, а unknown. Им нужно было вводить не nullable типы, а voidable.
E>и было бы еще одно использование ключ. слова void.

А разве важно как называть третье состояние? И почему именно void?

Основное значение null — адресный ноль.
Значение void — ничто, просто метка метода без возвращаемого значения.

null — это возможное состояние ссылки на объект, а вот void никак не связан с состоянием.

Nullable<T> добавляет ещё одно состояние структурам типа T и из имеющихся в языке ключевых слов null подходит больше всего для обозначения нового состояния, это позволяет провести некую параллель с reference-типами, хотя семантика иногда не совпадает (был тут разговор про то, что (int?).ToString(); не даёт NRE).
Re[3]: [C#, Этюд] равно или нет
От: matumba  
Дата: 28.08.09 11:16
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Если бы Вы знали логику SQL относительно null так же хорошо, как пытаетесь критиковать MS..


Т.е. достаточно скопировать поведение языка 100-летней давности, чтобы сразу отмести все аргументы? Великолепно!
Поведение в SQL вполне логично, т.к. что бы ни выводилось, это будут данные. А что делать с алгоритмами? Например:
if (ImNullable & false) — понятно, что при любом раскладе условие не пройдёт, ну а вдруг это ошибка прогера и
в данном месте ImNullable обязан иметь значение? Конечно, можно как всегда и костылями if (ImNullable == null), но это загромождение кода.
Я б в данном случае сильно подумал, стоит ли допускать в if'е такие "неопределённые вычисления".
Re[2]: [C#, Этюд] равно или нет
От: Пельмешко Россия blog
Дата: 28.08.09 11:16
Оценка:
Здравствуйте, matumba, Вы писали:

M>null <= null — это оказывается false! ппц...


Там же в §7.2.7:

• For the relational operators
< > <= >=
a lifted form of an operator exists if the operand types are both non-nullable value types and if the result type is bool. The lifted form is constructed by adding a single ? modifier to each operand type. The lifted operator produces the value false if one or both operands are null. Otherwise, the lifted operator unwraps the operands and applies the underlying operator to produce the bool result.

Re: [C#, Этюд] равно или нет
От: cvetkov  
Дата: 28.08.09 11:20
Оценка:
null?
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[4]: [C#, Этюд] равно или нет
От: Ellin Россия www.rsdn.ru
Дата: 28.08.09 11:22
Оценка:
Здравствуйте, matumba, Вы писали:

M>Здравствуйте, Пельмешко, Вы писали:


П>>Если бы Вы знали логику SQL относительно null так же хорошо, как пытаетесь критиковать MS..


M>Т.е. достаточно скопировать поведение языка 100-летней давности, чтобы сразу отмести все аргументы? Великолепно!

Нет, достаточно скопировать поведение языка который развивался 100 лет и за это время отточил все что только можно? Или ты считаешь, что сыренький, молоденький язычок котором от роду 2 года круче 100 летнего?

M>Поведение в SQL вполне логично, т.к. что бы ни выводилось, это будут данные. А что делать с алгоритмами? Например:

А что алгоритмы не работают с данными? И что же делают алгоритмы?

M>if (ImNullable & false) — понятно, что при любом раскладе условие не пройдёт, ну а вдруг это ошибка прогера и

M>в данном месте ImNullable обязан иметь значение? Конечно, можно как всегда и костылями if (ImNullable == null), но это загромождение кода.
M>Я б в данном случае сильно подумал, стоит ли допускать в if'е такие "неопределённые вычисления".
Пример не понял.
Re[2]: [C#, Этюд] равно или нет
От: Кондор Россия  
Дата: 28.08.09 11:23
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>null?

bool?
int?
null?
ДДТ!
Re[3]: [C#, Этюд] равно или нет
От: cvetkov  
Дата: 28.08.09 11:51
Оценка:
Здравствуйте, Кондор, Вы писали:

К>Здравствуйте, cvetkov, Вы писали:


C>>null?

К>bool?
К>int?
К>null?

знак вопроса имеет более широкое хождение нежели синтаксический сахар для Nullable.
В русском языке, например, используется
... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Re[4]: [C#, Этюд] равно или нет
От: Sabrian  
Дата: 31.08.09 11:30
Оценка: 6 (1)
Здравствуйте, matumba, Вы писали:

M>Т.е. достаточно скопировать поведение языка 100-летней давности, чтобы сразу отмести все аргументы? Великолепно!

M>Поведение в SQL вполне логично, т.к. что бы ни выводилось, это будут данные. А что делать с алгоритмами? Например:
M>if (ImNullable & false) — понятно, что при любом раскладе условие не пройдёт, ну а вдруг это ошибка прогера и
M>в данном месте ImNullable обязан иметь значение? Конечно, можно как всегда и костылями if (ImNullable == null), но это загромождение кода.
M>Я б в данном случае сильно подумал, стоит ли допускать в if'е такие "неопределённые вычисления".

Поведение && и || абсолютно логично, кроме того оно единственно верное для троичного була. Нельзя конъюнкцию и дизъюнкцию по другому определить,
что бы при этом они следовали всем привычным тождествам булевой алгебры.
Вводится порядок false < null < true.
&& = min(a,b);
|| = max(a,b);
Re[5]: [C#, Этюд] равно или нет
От: Ellin Россия www.rsdn.ru
Дата: 31.08.09 12:49
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, Ellin, Вы писали:


E>>Здравствуйте, Пельмешко, Вы писали:

E>>Вот только в трехзначной логике не null используется, а unknown. Им нужно было вводить не nullable типы, а voidable.
E>>и было бы еще одно использование ключ. слова void.

П>А разве важно как называть третье состояние? И почему именно void?

Ну вообще я говорил про налаживание связей с БД. Т.е. в БД тоже есть null и он имеет определенный смысл. В БД null != null. Например в C# null == null. Это является источником путаницы.

П>Основное значение null — адресный ноль.

Здесь я согласен...

П>Значение void — ничто, просто метка метода без возвращаемого значения.

Ну да... просто как-то логически оно больше походит на null из БД... но это ИМХО.

П>null — это возможное состояние ссылки на объект, а вот void никак не связан с состоянием.

ну так вот. а в БД что такое null? совсем другое. получаем здесь null — это одно, а там null — совсем другое. Одно названия для разных вещей, путаница.

П>Nullable<T> добавляет ещё одно состояние структурам типа T и из имеющихся в языке ключевых слов null подходит больше всего для обозначения нового состояния, это позволяет провести некую параллель с reference-типами, хотя семантика иногда не совпадает (был тут разговор про то, что (int?).ToString(); не даёт NRE).

Вопрос в другом. А зачем потребовалась эта параллель с reference-типами? Для взаимодействия с БД. Так может быть здесь в данном случае играть по их правилам?
Re[4]: [C#, Этюд] равно или нет
От: iOgre  
Дата: 01.09.09 14:27
Оценка:
Здравствуйте, matumba, Вы писали:

M>Здравствуйте, Пельмешко, Вы писали:


П>>Если бы Вы знали логику SQL относительно null так же хорошо, как пытаетесь критиковать MS..


M>Т.е. достаточно скопировать поведение языка 100-летней давности, чтобы сразу отмести все аргументы? Великолепно!

M>Поведение в SQL вполне логично, т.к. что бы ни выводилось, это будут данные. А что делать с алгоритмами? Например:
M>if (ImNullable & false) — понятно, что при любом раскладе условие не пройдёт, ну а вдруг это ошибка прогера и
M>в данном месте ImNullable обязан иметь значение? Конечно, можно как всегда и костылями if (ImNullable == null), но это загромождение кода.
M>Я б в данном случае сильно подумал, стоит ли допускать в if'е такие "неопределённые вычисления".

А если бы ты еще немного подумал, то вместо if(ImNullable & false) использовал бы
if(ImNullable.HasValue && false)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.