2010-09-30 2 views
1

С одним из моих коллег часто спорят о «правильном пути» написания методов «Получить». Мое мнение object GetSomeObject(). Мой коллега считает, что лучше быть void GetSomeObject(object obj). Я знаю, что в обоих случаях результат один и тот же. Я хочу услышать и другие мнения. Ох, я забыл сказать, для какой платформы мы говорим - .NET Framework - это язык C#.Каков правильный способ написать метод Get?

+9

Я хотел бы услышать аргументы вашего коллеги о том, почему его путь лучше. –

+0

Ну, я постараюсь заставить его сделать учетную запись здесь и опубликовать (но я не уверен, что он это сделает). – ikirachen

ответ

1

Он читает проще и хорошая практика кодирования, чтобы возвращать значение, более модифицирования ссылочный параметр (который мне, по крайней мере, это старая школа способ получения значения обратно)

Если вы ищете более глубокое значение:

Функциональные параметры в C# создаются как Value parameters by default (как указано в ссылочных параметрах).

Для изменения значения параметра и сохранения этого изменения в вызывающем коде параметр должен быть объявлен ссылкой. Вы, наверное, все это знаете.

Вот разница: Оба значения и реф параметры хранятся в стеке (который имеет высокую эффективность), но данные опорного параметра является stored on the heap. Таким образом, накладные расходы с использованием ссылочных значений.

В большинстве случаев это не является проблемой на всех, но некоторые вопросы могут всплывал, как:

  • рекурсивных функций, которые используют слишком много стека (и вы получите переполнение стека)
  • функции которые требуют такой скорости, как вычисление простых чисел или фракталов.

Есть, вероятно, больше и лучшие примеры, чем то, что я дал, но вы поняли эту идею.

+0

Да, я понял, спасибо за полный ответ. Я буду использовать его в следующий раз]:> – ikirachen

1

объект getSomeObject(); лучше.

+0

Согласовано - это самый распространенный способ в самой платформе .NET, поэтому имеет смысл следовать одному и тому же шаблону. –

+1

Это должно быть 'GetSomeObject', в соответствии с Руководством по разработке рамок. –

2

Конечно, object GetSomeObject() лучше. Другой более сеттер, чем добытчик ...

8

Если это просто получить то оно должно быть свойство

public object SomeObject 
{ 
    get { return _someObj; } 
} 

если вычислительное то

object GetSomeObject() { ... } 

Далеко чаще всего ожидается. Кроме того, другой должен был бы иметь либо ref, либо out, переданный в качестве аргумента, который не рекомендуется, если первое может быть достигнуто.

+0

«должны иметь или ref или out» не обязательно, объекты передаются по ссылке по умолчанию. Этот оператор действительно применим только в том случае, если его объект значения (int, char и т. Д.), А не ссылочный объект (если это имеет смысл) ... Но для удобства читаемости обычно лучше понять, что вы пытаетесь сделать, используя ref/out – Xander

+0

Однако я согласен с использованием свойств, если нет какой-либо бизнес-логики, а затем используйте описанный вами метод. – Xander

+0

@ Xander, Фактически указатель на объект передается по значению так же, как тип значения. Это всего лишь указатель, который копируется, а не фактическая структура. Если вы хотите изменить экземпляр вызывающих абонентов, чтобы он был новым, вам нужно указать ref или out (точно так же, как тип значения). Поскольку экземпляр не копируется, все, что вы можете сделать, это изменить его состояние и с помощью метода, имеющего подпись '' '' '' '' '' '' '' ', это не ожидается для метода, чтобы сделать это, в других словах, имеющих побочные эффекты. – aqwert

3

void GetSomeObject(object obj) на самом деле ничего не получит. Если вы превратили его в out параметр можно присвоить ему значение, и было бы технически работать, покупать, почему, когда вы можете использовать возвращаемые типы точно так, как они были предназначены:

public void GetSomeObject(out returnObject) 
{ 
    returnObject = ... 
} 

или

public object GetSomeObject() 
{ 
    return ... 
} 
+0

О, да, я забыл ключевое слово 'out'. Спасибо за исправление. – ikirachen

+0

, если returnObject является фактическим объектом, и вы вносите в него изменения, поскольку он передается по ссылке по умолчанию, вы увидите отраженные изменения ... Однако я по-прежнему считаю, что использование свойств - лучший способ, если вы не выполняете какую-либо бизнес-логику, в в каком случае "объект GetSomeObject() {...}" – Xander

1

Вообще говоря, первый способ более типичен и лучше, потому что object GetSomeObject() позволяет вам делать следующее: GetSomeObject().Foo(). И это несколько интуитивно.

Однако bool GetSomeObject(out object obj) может быть полезен, как в случае TryGetValue(), в классе Dictionary.

0

Я могу довольно много видеть только одну причину для использования void GetSomeObject(out object obj) вместо object GetSomeObject() и что, если вы избавитесь от пустоты и вместо того, чтобы сделать что-то вроде ErrorResult GetSomeObject(out object obj) (и GetSomeObject-операция волосатые и подвержен ошибкам), поскольку вы может затем сообщить статус через возвращаемое значение.

Однако, это все равно было бы лучше обработать через простые старые Исключения IMHO. Хотя я знаю, что некоторые стандарты кодирования говорят о том, что исключения не должны использоваться вообще, и в тех случаях вы можете сделать что-то подобное.

Тем не менее, я бы сказал, просто пойдите с имуществом или object GetSomeObject(), если у вас нет действительно.

Смежные вопросы