Мне надо чтоб метод вернул четыре значения один bool, один string и два float. Я делаю это с помощью Dictionary<bool, string>
Но Dictionary мне кажется создан для списков и этот вариант я думаю не совсем правильный. Как обычное вы делаете, когда функция должна вернуть более одного значения? Как это сделать правильней и эффективней?
Рассмотрим вариант номер 1 - простейший массив
public object[] GetPerson1()
{
return new object[] { "Vasya", 120, new DateTime(1980, 1, 1) };
}
Все вроде ок, но вот пробема. Если кто то вызывает вашу функцию, ему надо догадываться, что это за значения вы передаете. То есть без вашего кода, например, не понять, что такое 120.
Второй вариант уже лучше
public Dictionary<string, object> GetPerson2()
{
return new Dictionary<string, object> { { "name", "Vasya" }, { "height", 120 }, { "birthday", new DateTime(1980, 1, 1) }};
}
Но тут, чтобы пользователю функции понять назначения переменных, не достаточно просто вызвать функцию - придется проитерировать словарь или снова идти читать ваш код.
Следующий вариант ещё немного лучше
public (string name, int height, DateTime birthDate) GetPerson3()
{
return ("Vasya", 120, new DateTime(1980, 1,1));
}
Но в этом случае, как и во всех предыдущих, есть 2 минуса: значения никак не валидированы (то есть вы легко можете отправить значение роста человека отрицательным или указать ему пустое имя), второе - вызывающий код может просто поменять эти значения и все сломать, например
var person3 = GetPerson3();
person3.height = -100;
Потому, если вы хотите делать вещи правльно, но сначала определим класс человека
public sealed class Person
{
public string Name { get; }
public int Height { get; }
public DateTime BirthDate { get; }
public Person(string name, int height, DateTime birthDate)
{
if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException(nameof(name));
if (height <= 0) throw new ArgumentException(nameof(height));
if (birthDate.Year < 1900) throw new ArgumentException(nameof(birthDate));
Name = name;
Height = height;
BirthDate = birthDate;
}
}
Вы видите тут 3 вещи:
Ну и как бонус, программисту, который будет вызывать ваш метод, нет смысла смотреть на код вашего метода, какой бы он ни был. В принципе, он даже на код класса Person может не глядеть - все поля ему подскажет Intellisense. Поменять созданный класс он тоже не сможет, что уменьшет количество ошибок в разы, хотя и увеличивает кодичество кода.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть рубрика, в которой много постовПосты начинаются, к примеру, с "21 декабря 2019 года"
Нужен совет по обработке сравнительно большого количества данных