Пара ключ / значение с ключами из определенного набора

#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 Спасибо! Похоже, что это будет случай выбора из ряда неидеальных альтернатив, и анонимный тип может быть лучшим вариантом