Перечисления действительно ли C# безопасны с точки зрения типов?

Проблема с кодом, как таковая, на самом деле не очень связана с Rust, но вы потребляете читателей, когда читаете их. Ваш код в основном делает (в псевдокоде):

file1 = open("file1");
file2 = open("file2");
for line1 in read_lines(file1):
    for line2 in read_lines(file2):
        compare(line1, line2)

С file1 все в порядке, так же как и с file2 при первом чтении. Но во второй итерации внешний цикл file2 находится в конце файла, поэтому из него больше не будут считываться строки, и цикл заканчивается.

Самое простое решение - читать file2 каждый раз:

file1 = open("file1");
for line1 in read_lines(file1):
    file2 = open("file2");
    for line2 in read_lines(file2):
        compare(line1, line2)

Это не очень эффективно, потому что вы читаете один и тот же файл снова и снова.

Если вы хотите прочитать его только один раз, вы можете собрать все Records из file2 в Vec, а затем повторить Vec столько раз, сколько необходимо:

[112 ]
11
задан Willbill 8 August 2010 в 09:51
поделиться

8 ответов

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

enum Foo { A = 1, B = 2, C = 3 }    
static void Main()
{
    Foo foo = (Foo)500; // works fine
    Console.WriteLine(foo); // also fine - shows 500
}

Поэтому необходимо заботиться для проверки значений - например, с a default в a switch это выдает исключение.

Можно также проверить (для не -[Flags] значения) через:

bool isValid = Enum.IsDefined(typeof(Foo), foo);

15
ответ дан 3 December 2019 в 03:19
поделиться

Да они.

Следующее из http://www.csharp-station.com/Tutorials/Lesson17.aspx

Перечисления являются константами со строгим контролем типов. Они - чрезвычайно уникальные типы, которые позволяют Вам присваивать символьные имена интегральным значениям. В традиции C# они со строгим контролем типов, означая, что перечисление одного типа не может быть неявно присвоено перечислению другого типа даже при том, что базовое значение их участников является тем же. В том же направлении целочисленные типы и перечисления не неявно interchangable. Все присвоения между различными перечислимыми типами и целочисленными типами требуют явного броска.

11
ответ дан 3 December 2019 в 03:19
поделиться

Да они.

Перечисления являются константами со строгим контролем типов. Они - чрезвычайно уникальные типы, которые позволяют Вам присваивать символьные имена интегральным значениям. В традиции C# они со строгим контролем типов, означая, что перечисление одного типа не может быть неявно присвоено перечислению другого типа даже при том, что базовое значение их участников является тем же. В том же направлении целочисленные типы и перечисления не неявно interchangable. Все присвоения между различными перечислимыми типами и целочисленными типами требуют явного броска.

0
ответ дан 3 December 2019 в 03:19
поделиться

Для тех, которые предлагают использовать Перечисление. IsDefined, чтобы сделать проверку аргумента... не делают! На Brad Abrams (от Обновления Инструкций по Дизайну Платформы на Перечислимом Дизайне):

Существует действительно две проблемы с Перечислением. IsDefined (). Сначала это загружает отражение и набор холодных метаданных типа, делающих это обманчиво дорогой вызов. Во-вторых, поскольку примечание ссылается на, здесь существует проблема управления версиями.

2
ответ дан 3 December 2019 в 03:19
поделиться

Да.

C#: перечислимые типы:

- Безопасное с точки зрения типов перечисление именованных значений.

- Предотвращает программные ошибки

- Пользователь может управлять базовым типом (значения по умолчанию к интервалу)

- Также может управлять базовыми значениями

0
ответ дан 3 December 2019 в 03:19
поделиться

Технически не, потому что можно представить Перечисление как его основное значение (интервал, долго, и т.д.). Однако, если Вы удостоверитесь, чтобы Вы только использовали перечисление его обеспеченными именами, то Вы получите ошибки времени компиляции, если Вы измените имя перечисляемого значения, не обновляя его ссылки. В этом отношении да это безопасно с точки зрения типов.

0
ответ дан 3 December 2019 в 03:19
поделиться

Я опаздываю стороне здесь, но я хотел вывести немного что-то дополнительное... Обновление Руководства по проектированию Платформы.NET от Krzysztof Cwalina. В дополнение к превосходной подсказке выше относительно проверки для обеспечения допустимого значения передается Перечислениям, это обеспечивает другое руководство и совет для того, как использовать их эффективно, набор глюков (особенно включенный Flags перечисления), и т.д.

0
ответ дан 3 December 2019 в 03:19
поделиться

yes they r strongly-typed safed u cannot it does not do impilcit convertion of enum constant variables to integeral value u hv 2 expilcitly do dat eg enum days { sun, mon } int e = (int ) days.sun; console.writeline(e);

0
ответ дан 3 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: