#c#
#c#
Вопрос:
Извините, если формулировка этого вопроса неверна; Я исхожу из опыта работы с Javascript / Typescript.
То, что я хочу создать, — это набор пар ключ / значение, который является неизменяемым, где IDE / компилятор будут знать, какие ключи присутствуют или отсутствуют в этом списке. Я предполагаю, что это возможно с классом, и, возможно, это действительно лучший вариант, но мне интересно понять, есть ли альтернативы.
Например, для конфигурации приложения в Typescript я мог бы иметь:
const config = {
applicationName: 'Some application',
port: 8000,
};
const testOne = config.applicationName;
const testTwo = config.fail; // this would not work
То есть компилятор или какой-либо интерпретатор, который использует IDE, может определить на основе структуры, что ключ / значение не существует для этой структуры.
Мне кажется, что класс является избыточным для такого рода данных; хотя, поскольку я относительно новичок в языке, это может быть связано с моей наивностью. Я хотел бы знать, существует ли в C # структура, которая может хранить ключи и значения неизменяемым образом, и знать во время компиляции, доступна ли пара ключ / значение в этой коллекции.
Комментарии:
1. Как в словаре ?
2. Я не думаю, что IDE / компилятор проверяет содержимое коллекций. Да, вы хотите создать класс.
3. Ах, я думаю, я неправильно понял ваш вопрос. Вы хотите знать, перед компиляцией,
myObj.PropertyThatDoesExist
покажет ли вам IDE ошибку?4. Я не уверен, что понимаю этот вопрос. Вы пробовали использовать класс? Какой код C # вы пробовали, который не давал вам такой функциональности? Кроме того, под «не будет работать», что именно вы имеете в виду? Ошибка компилятора? Ошибка времени выполнения? Причина, по которой я спрашиваю, заключается в том, что из коробки, если вы используете типы с элементами, это будет делать именно то, что вы хотите. Просто создайте класс с двумя свойствами, ApplicationName и Port, тогда вы не сможете задавать для него произвольные значения.
5. Это проблема XY (вопрос) . То есть вы пытаетесь решить проблему, используя решение, о котором у вас возник вопрос, вместо того, чтобы фактически представить реальную проблему. У вас есть все эти требования (например, неизменяемые) без описания, зачем они нужны. Это не очень хороший вопрос.
Ответ №1:
Используйте анонимный тип:
var obj = new
{
applicationName = "",
port = 9000
};
var name = obj.applicationName;
var something = obj.fail; //doesn't compile
Хотя, я действительно рекомендую вам создавать классы и давать им имена, поскольку вы можете предоставлять их из API.
Комментарии:
1. Как это можно изменить?
2. @ErikPhilips вы правы, я пропустил это. Теперь я обновил ответ, чтобы отразить эту проблему.
3. Это полезный ответ, я рассмотрю анонимные типы и структуры, и в ожидании любых дальнейших ответов я приму этот как правильный
4. @OliverRadini чтобы ответить на ваш отредактированный вопрос: нет, я не думаю, что существует такая структура, которая является неизменяемой и анонимной, по крайней мере, не из того, что я видел в своем опыте работы с C # до сих пор.
5. @meJustAndrew Спасибо! Похоже, что это будет случай выбора из ряда неидеальных альтернатив, и анонимный тип может быть лучшим вариантом