С# Примитивные типы или сложные типы в качестве сигнатур метода?

Каковы плюсы и минусы использования типов Primitve или сложных типов?

Когда вы должны использовать примитивные типы над сложными типами и наоборот?

то есть:.

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public int IQ { get; set; }
}


public void FooPrimitiveTypes (string firstName, string lastName, int age, int IQ)
{

}

public void FooComplexTypes(Person person)
{

}

Ответ 1

  • Чтобы передать каждое свойство отдельно, обычно используются, когда вы имеете дело с непересекающимися значениями. Также иногда используется для конструкторов. Плохая практика.

  • Этот способ является предпочтительным, когда значения связаны.

Почему # 1 - плохая практика - предположим, что вам нужно добавить height. Я бы скорее обновил один класс, добавив другое свойство вместо 50 методов.

Ответ 2

Концептуально ли Foo имеет дело с Лицом? Все ли (или, по крайней мере, большинство) Личность используется Foo, или просто использует несколько бит информации, которая находится в Person? Неужели Фо может когда-либо иметь дело с чем-то, что не является Человеком? Если Foo является InsertPersonIntoDB(), то, вероятно, лучше всего иметь дело с Person.

Если Foo является PrintName(), возможно, PrintName (строка FirstName, строка LastName) более подходит (или, альтернативно, вы можете определить класс Name вместо этого и сказать, что у человека есть имя).

Если вы обнаружите, что создаете половину инициализированных временных объектов Person только для перехода к Foo, тогда вы, вероятно, захотите сломать параметры.

Ответ 3

Следует отметить, что при использовании примитивов они передаются по значению... ссылка на объект также передается по значению, но поскольку все базовые ссылки на значения являются ссылками, они эффективно передаются по ссылке. Поэтому в зависимости от того, что вы делаете, этот пропуск по значению или пропуск по ссылке может иметь значение. Также в первом случае модификации примитивов не будут влиять на значения переменных в области вызова, однако изменение переданного объекта повлияет на объект в области вызова.