Пара вопросов по языку с# из тестов...
От: Аноним  
Дата: 05.06.08 10:14
Оценка:
Не буду уточнять откуда вопросы, чтобы рекламы не было

Вопрос1: не очень понимаю, о чем вообще в вопросе спрашивают, слова по отдельности понимаю, но вот вместе они не складываются...

Within an instance constructor of a struct type, which one of the following key words behaves exactly as an output parameter of the struct type?
Choice 1
base
Choice 2
ref
Choice 3
this
Choice 4
object
Choice 5
value


Вопрос2: объясните, как после такого приведения выводится 4 ? Мне не очень понятно...

    public enum Parts {
 Engine = 1,
 Wheels,
 Brakes
}
    class c
    {
        public static void Main()
        {
            try
            {
                Parts lineItem = (Parts)4;
                Console.WriteLine(lineItem);
            }
            catch
            {
                Console.WriteLine("Exception");
            }


            Console.ReadKey();
        }
    }
Re: Пара вопросов по языку с# из тестов...
От: Овощ http://www.google.com
Дата: 05.06.08 10:29
Оценка:
Первый вопрос уже подробно обсуждался здесь
Автор: MozgC
Дата: 23.09.07
.
Re: Пара вопросов по языку с# из тестов...
От: C...R...a...S...H  
Дата: 05.06.08 10:30
Оценка:
Здравствуйте, Аноним, Вы писали:




When this is used in a primary-expression within an instance constructor of a struct, it is classified as a variable. The type of the variable is the struct within which the usage occurs, and the variable represents the struct being constructed. The this variable of an instance constructor of a struct behaves exactly the same as an out parameter of the struct type—in particular, this means that the variable must be definitely assigned in every execution path of the instance constructor.
Там было написано русским по белому...
Re: Пара вопросов по языку с# из тестов...
От: ksg71 Германия  
Дата: 05.06.08 10:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не буду уточнять откуда вопросы, чтобы рекламы не было


А>Вопрос2: объясните, как после такого приведения выводится 4 ? Мне не очень понятно...


А>
А>    public enum Parts {
А> Engine = 1,
А> Wheels,
А> Brakes
А>}
А>    class c
А>    {
А>        public static void Main()
А>        {
А>            try
А>            {
А>                Parts lineItem = (Parts)4;
А>                Console.WriteLine(lineItem);
А>            }
А>            catch
А>            {
А>                Console.WriteLine("Exception");
А>            }


А>            Console.ReadKey();
А>        }
А>    }
А>



Each enum type has a corresponding integral type called the underlying type of the enum type. An enum type that does not explicitly declare an underlying type has an underlying type of int. An enum type’s storage format and range of possible values are determined by its underlying type. The set of values that an enum type can take on is not limited by its enum members. In particular, any value of the underlying type of an enum can be cast to the enum type and is a distinct valid value of that enum type.

Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re: Пара вопросов по языку с# из тестов...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.06.08 10:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос1: не очень понимаю, о чем вообще в вопросе спрашивают, слова по отдельности понимаю, но вот вместе они не складываются...

А>Within an instance constructor of a struct type, which one of the following key words behaves exactly as an output parameter of the struct type?
Это дословная цитата из стандарта C#. Проверка, читал ты его или нет.
Обсуждение находится поиском: http://img.meta.ua/rsdnsearch/?q=behaves+exactly+as+an+output

А>Вопрос2: объясните, как после такого приведения выводится 4 ? Мне не очень понятно...


А>
А>                Parts lineItem = (Parts)4;
А>


Опять-таки, ответ в стандарте:

4.1.9 Enumeration types
....
The set of values of the enumeration type is the same as the set of values of the underlying type. Values of the enumeration type are not restricted to the values of the named constants.


Множество значений перечисления совпадает со множеством значений (целочисленного) типа, лежащего в его основе. Оно не ограничено именованными константами (объявленными в этом перечислении).

То есть 4 является допустимым членом перечисления Parts. Просто оно не имеет представления в виде идентификатора. В этом случае (при условии, если перечисление не помечено атрибутом FlagsAttribute) метод ToString (который вызывается внутри Console.WriteLine) просто выводит числовое значение. Насколько я помню, это также обсуждается у Рихтера.
Re[2]: Пара вопросов по языку с# из тестов...
От: Aikin Беларусь kavaleu.ru
Дата: 05.06.08 11:11
Оценка: -2
K>The set of values that an enum type can take on is not limited by its enum members.
Ужос. Это в стандарте так написано?
Единственная страница в инете где это написано: http://wiki.ecmascript.org/doku.php?id=proposals:enumeration_type Это стандарт C#? НА главной странице написан, что это

Интересно с какого перепугу это было сделано? ИМХО, логичнее всего было бы выкинуть исключение на Parts lineItem = (Parts)4;.
Кроме того, интересно следующе: "an explicit enumeration conversion is required to convert between two enum types". Опять же нах такое может понадобиться?

P.S. Насколько понимаю, это brainbench? Всегда считал, что такие методы оценки знаний отстой, а теперь уверился в этом еще больше.
Re[3]: Пара вопросов по языку с# из тестов...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.06.08 11:19
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Ужос. Это в стандарте так написано?


Да.

A>Единственная страница в инете где это написано: http://wiki.ecmascript.org/doku.php?id=proposals:enumeration_type


Единственная страница, говоришь? Что у тебя за такая отстойная поисковая система? Нормальный поиск показывает 55 результатов: http://search.live.com/results.aspx?q="The+set+of+values+that+an+enum+type+can+take+on+is+not+limited+by+its+enum+members"

A>Интересно с какого перепугу это было сделано?

С целью сделать простую и быстродействующую реализацию. Если нужен контроль за значениями, то нужно использовать F# с его discriminated unions или эмулировать их в C#.
Re[4]: Пара вопросов по языку с# из тестов...
От: Aikin Беларусь kavaleu.ru
Дата: 05.06.08 11:35
Оценка:
N>Единственная страница, говоришь? Что у тебя за такая отстойная поисковая система? Нормальный поиск показывает 55 результатов
Гугл

A>>Интересно с какого перепугу это было сделано?

N>С целью сделать простую и быстродействующую реализацию.
Да, я думал об этом. Не считаю это приоритетным. ИМХО, стандарт не должен писаться в стиле "чтобы было удобнее реализовывать".

P.S. С другой стороны эксплисит приведения типов полностью на совести программиста...
Re[4]: Пара вопросов по языку с# из тестов...
От: matumba  
Дата: 05.06.08 11:36
Оценка: 1 (1) +1
A>>Интересно с какого перепугу это было сделано?
N>С целью сделать простую и быстродействующую реализацию. Если нужен контроль за значениями... [реклама Ф# поскипана]

Довольно глупо выглядит enum со значениями ВНЕ списка. Вам это не напоминает грабли в профиль? Всё равно, что к переменной типа "целые" сунуть число Пи.
Re[5]: Пара вопросов по языку с# из тестов...
От: Aikin Беларусь kavaleu.ru
Дата: 05.06.08 11:55
Оценка: 1 (1) +1
A>>P.S. С другой стороны эксплисит приведения типов полностью на совести программиста...
Нет, не так. Мы ведь можем получить невалидное значение энума как аргумент метода!
Отстой какой-то. Правильно я делал, что всегда добавлял в switch вариант default с исключением
Re[5]: Пара вопросов по языку с# из тестов...
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 05.06.08 11:59
Оценка:
Здравствуйте, matumba, Вы писали:

A>>>Интересно с какого перепугу это было сделано?

N>>С целью сделать простую и быстродействующую реализацию. Если нужен контроль за значениями... [реклама Ф# поскипана]
M>Довольно глупо выглядит enum со значениями ВНЕ списка. Вам это не напоминает грабли в профиль?

Не напоминает.
Присмотрись к "Flags"
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re[6]: Пара вопросов по языку с# из тестов...
От: _FRED_ Черногория
Дата: 05.06.08 12:08
Оценка:
Здравствуйте, xvost, Вы писали:

M>>Довольно глупо выглядит enum со значениями ВНЕ списка. Вам это не напоминает грабли в профиль?

X>Не напоминает.
X>Присмотрись к "Flags"

+1, но вот тут-то, ИМХО, и грабли — что и набор битовых флагов, и перечислители свели вместе. Если бы получше потрудились над дизайном и разделили — было бы не однозначно, но не очень просто для понимания.
... << RSDN@Home 1 alpha 3 rev. 0>>
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Пара вопросов по языку с# из тестов...
От: Aikin Беларусь kavaleu.ru
Дата: 05.06.08 12:16
Оценка:
M>>Довольно глупо выглядит enum со значениями ВНЕ списка. Вам это не напоминает грабли в профиль?
X>Присмотрись к "Flags"
И?
[Flags]
enum Flags
{
    First = 0,
    Second = 1,
    Third = 2
}

Flags f = (Flags) 4; // те же грабли и с той же стороны


Для флагов "значения списка" расширяются комбинацией значений.
Re[7]: Пара вопросов по языку с# из тестов...
От: _FRED_ Черногория
Дата: 05.06.08 12:40
Оценка:
Здравствуйте, Aikin, Вы писали:

A>Для флагов "значения списка" расширяются комбинацией значений.


Ты себе представляешь количество сочетаний для ControlStyles, например?
... << RSDN@Home 1 alpha 3 rev. 0>>
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Пара вопросов по языку с# из тестов...
От: Aikin Беларусь kavaleu.ru
Дата: 05.06.08 13:00
Оценка:
_FR>Ты себе представляешь количество сочетаний для ControlStyles, например?
1) Какое это имеет отношение к вопросу?
Отвечаю на то что понял: ИМХО, лучше пожертвовать скоростью нечасто используемого приведения в угоду безопасности.
2) 131072 = 2^17
Re[5]: Пара вопросов по языку с# из тестов...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.06.08 13:47
Оценка: 2 (1) +2
Здравствуйте, Aikin, Вы писали:

N>>С целью сделать простую и быстродействующую реализацию.

A>Да, я думал об этом. Не считаю это приоритетным. ИМХО, стандарт не должен писаться в стиле "чтобы было удобнее реализовывать".

Это все связано с тем, как реализованы перечисления в CLR. Там они практически неотличимы от целочисленных типов данных. Вот выдержки из Ecma-335:

Partition I, 8.5.2 Assemblies and scoping
....
The CTS supports an enum (also known as an enumeration type), an alternate name for an existing type. For
the purposes of matching signatures, an enum shall not be the same as the underlying type. Instances of an
enum, however, shall be assignment-compatible with the underlying type, and vice versa. That is, no cast
(see §8.3.3) or coercion (see §8.3.2) is required to convert from the enum to the underlying type, nor are they
required from the underlying type to the enum.

Partition II, 14.3 Enums
....
Unlike Pascal, the CLI does not provide a guarantee that values of the enum type are integers
corresponding to one of the symbols. In fact, the CLS (see Partition I, CLS) defines a convention for using
enums to represent bit flags which can be combined to form integral value that are not named by the enum type
itself.
....
For binding purposes (e.g., for locating a method definition from the method reference used to call it) enums
shall be distinct from their underlying type. For all other purposes, including verification and execution of
code, an unboxed enum freely interconverts with its underlying type.


Например, CLR позволяет привести массив целых чисел к массиву enum-ов, или же распаковать упакованный целочисленный тип в enum:

class A
{
    static void Main()
    {
        object x = new int[] { 1, 2, 3 };
        E[] y = (E[])x;

        object a = 1;
        E b = (E)a;
    }
}

enum E{}


C# накладывает некоторые искусственные ограничения на enum-ы (например, запрещает некоторые виды неявных преобразований), но все равно позволяет арифметические операции и операции сравнения (больше, меньше).

Если программист ожидает от enum-ов большего, то он просто не понимает, чем они являются на самом деле. Это просто целочисленный тип, некоторые значения которого имеют символические имена.
Re[6]: Пара вопросов по языку с# из тестов...
От: matumba  
Дата: 05.06.08 13:53
Оценка:
Здравствуйте, xvost, Вы писали:

M>>Довольно глупо выглядит enum со значениями ВНЕ списка. Вам это не напоминает грабли в профиль?


X>Не напоминает. Присмотрись к "Flags"


Я догадываюсь, что мелкомягким было просто влом делать проверки, но вообще-то речь сейчас о перечислимом типе, а не его
(дотнетовски-специфичном) подвиде "флаги". Enum — это ограниченное множество значений, причём явно указанное. Хотел бы
я просто именованные целые — завёл бы константы. А раз есть тип — он обязан не вылезать за рамки разумного, интуитивно-ожидаемого
поведения.
Re[7]: Пара вопросов по языку с# из тестов...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.06.08 14:09
Оценка:
Здравствуйте, matumba, Вы писали:

M>А раз есть тип — он обязан не вылезать за рамки разумного, интуитивно-ожидаемого поведения.


На самом деле, тип обязан только лишь следовать тому, что написано в спецификации. Ибо спецификация — она одна и утверждена международным комитетом по стандартизации, и а интуиция у каждого своя.
Re[6]: Пара вопросов по языку с# из тестов...
От: Aikin Беларусь kavaleu.ru
Дата: 05.06.08 14:16
Оценка: -1
N>Это все связано с тем, как реализованы перечисления в CLR. Там они практически неотличимы от целочисленных типов данных. Вот выдержки из Ecma-335:
Стандарт не должен писаться "от реализации". Он должен быть нацелен на максимальное удобство использования, безопасность и тыды (я имею ввиду стандарт C#, а не стандарт вообще).

N>Если программист ожидает от enum-ов большего, то он просто не понимает, чем они являются на самом деле.

Мне все равно чем является что-то на самом деле. Мне важно как это что-то подходит для решения моих задач.
Может мне экземпляр класса воспринимать как набор битов в памяти моего компа?

N>Это просто целочисленный тип, некоторые значения которого имеют символические имена.

А по мне так все наоборот: группа символических имен которые имеют целочисленные значения (ввиду реализации).
Я говорю про перечисления вообще, а не про их реализацию в .net



Еще раз: меня интересует почему было выбрано решение о представлении перечислений как "целочисленный тип, некоторые значения которого имеют символические имена". Причем отмазка "так удобнее реализовывать" не катит.
Мне все же кажется, что существуют реальные юзкейсы, когда такое поведения перечислений оправдано. Вот их я и хочу найти.

P.S. Могу притянуть за уши следующий вариант:
работа с WinAPI через .net обертку; возможные значения параметра зашиты в энум; ВинАПИ изменилось (добавился новое значение параметра); старой оберткой можно пользоваться используя explicit cast.
Re[7]: Пара вопросов по языку с# из тестов...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 05.06.08 14:35
Оценка: +1
Здравствуйте, Aikin, Вы писали:

A>Мне важно как это что-то подходит для решения моих задач.


Совершенно верно. Если перечисления не подходят для твоих задач — не используй перечисления. Используй подходящий инструмент — например, discriminated unions. И будь готов платить overhead, который они дают.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.