вызов функции без создания объекта в C # - PullRequest
2 голосов
/ 06 апреля 2011

Есть ли разница между этими двумя случаями в приведенной ниже программе?

static void Main(string[] args)
{
     //Case 1:
     new Program().a();    

     //Case 2:
     Program p = new Program();
     p.a();
}

void a()
{
     // Do some stuff
}

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

В первом случае вы не сохраняете объект Program в локальной переменной. Функция выполнена, но вы можете получить доступ к вашему объекту, который вызвал операцию.

Во втором случае вы сохраняете свой объект в локальной переменной и снова вызываете метод. Метод выполняется, и вы можете получить доступ к тому же объекту позже.

Так что это зависит от того, что вы собираетесь делать. Относительно выполненного метода разницы нет. Вам нужно подумать, нужен ли вам объект Program еще раз где-нибудь в вашем коде. Затем вы должны сохранить его в переменной. В противном случае вы можете сделать это так же, как в первом случае.

1 голос
/ 06 апреля 2011

Нет. (Кроме того, последний может быть немного более удобным для отладки.)

Я предполагаю, что код выше все код. Конечно, если вы впоследствии сделаете что-то еще с p, тогда вы сделаете разницу между ними: -).

1 голос
/ 06 апреля 2011

Нет. Вы создаете объект, когда вызываете new Program(). p - это просто ссылка на этот объект, он почти ничего не добавляет в плане использования памяти или производительности.

С точки зрения стиля и читабельности вашего кода, желательно избегать таких утверждений, как new Program().a(); - это затрудняет отладку кода, потому что вы не можете поставить точку торможения на требуемый оператор и не можете расскажите, что вызвало исключение, которое вы могли вызвать.
Также не очень понятно, что вы делаете - вам, вероятно, придется прочитать это снова, чтобы полностью понять, что создано , а что выполнено и возвращено.

0 голосов
/ 06 апреля 2011

Существует только одно отличие (поскольку вы создаете новый объект в обоих случаях) - во втором вы все равно можете получить к нему доступ, набрав что-то вроде

p.AnotherMethod();

РЕДАКТИРОВАТЬ:

Если вы не хотите создавать объект для вызова метода «а», сделайте этот метод статическим .

...