Вопрос про c # оптимизатор - PullRequest
0 голосов
/ 20 апреля 2009

Если я напишу:

SomeType simpleName = classWithLongName.otherLongName;

А затем использовать «simpleName» вместо «classWithLongName.otherLongName», изменит ли это программу каким-либо образом (например, с точки зрения производительности)?

Что компилятор делает с этим? Копирует + вставляет "classWithLongName.otherLongName", везде я использую "simpleName".

Ответы [ 7 ]

2 голосов
/ 20 апреля 2009

Нет, компилятор C # не переводит вызов "simpleName" так же, как копирование и вставка "classWithLongName.otherLongName". Различие может быть глубоким или просто семантическим, но то, что вы делаете, это присваиваете значение из classWithLongName.otherLongName в simpleName. Является ли тип типом значения или ссылочным типом, будет точно определено, что произойдет и что произойдет, если вы манипулируете этим значением, но при этом вы не создаете указатель функции или делегат.

Вне зависимости от того, повлияет ли это на производительность, здесь нет ответа, кроме как сказать, что это не будет ОТРИЦАТЕЛЬНЫМ. Мы не можем сказать, будет ли это иметь положительный эффект, поскольку это будет зависеть от того, что на самом деле происходит, когда вы звоните classWithLongName.otherLongName. Если это дорогостоящая операция, то это может сделать ее быстрее, но недостатком будет то, что любые различия в значении при последующих вызовах classWithLongName.otherLongName не будут отражены, если вы кэшируете ее значение в simpleName.

1 голос
/ 20 апреля 2009

Это зависит от того, что на самом деле делает otherLongName. Если это свойство, то разница между выполнением свойства несколько раз или выполнением только один раз. Это может или не может существенно изменить поведение программы, в зависимости от того, что она делает.

0 голосов
/ 20 апреля 2009

Если предположить, что ваш тип является объектным (ссылочным) типом, тогда simpleName будет содержать ссылку на объект, возвращаемый classWithLongName.otherLongName . Если вы собираетесь выполнить множество обращений к свойствам этого объекта, то вы можете получить улучшение производительности, особенно если otherLongName - это свойство, а не поле.

0 голосов
/ 20 апреля 2009
  • Если classWithLongName.otherLongName является свойством, то изменения в simpleName НЕ изменят classWithLongName.otherLongName.

  • Если classWithLongName.otherLongName является открытым элементом данных (полем) типа значения, то изменения в simpleName НЕ изменят classWithLongName.otherLongName.

  • Если classWithLongName.otherLongName является открытым элементом данных (полем) ссылочного типа, то изменение в simpleName изменит classWithLongName.otherLongName.

0 голосов
/ 20 апреля 2009

Это вопрос об экземплярах или классах?

Например

namespace MyCompany.MyApp.LongNamespaceName
{
    public class MyClassWithALongName {

        public SomeType AnInstanceProperty {get;set;}

        public static SomeType AStaticProperty {get { ... }}
    }
}

Сейчас:

//this gets the static property
SomeType simpleName = MyClassWithALongName.AStaticProperty;

В качестве альтернативы:

MyClassWithALongName anInstanceWithALongName = new MyClassWithALongName();

//this gets the instance property
SomeType simpleName = anInstanceWithALongName.AnInstanceProperty;

Они будут вести себя по-разному.

Здесь есть еще один случай, вы можете создать псевдоним для фактического имени класса:

using simpleName = MyCompany.MyApp.LongNamespaceName.MyClassWithALongName;

...
simpleName anInstance = new simpleName (); 
0 голосов
/ 20 апреля 2009

Компилятору разрешено кэшировать значение и использовать его повторно только тогда, когда вы всегда набираете "classWithLongName.otherLongName", если он знает, что значение не изменится в курсе. Тем не менее, это редко так.

Поэтому, если «classWithLongName.otherLongName» действительно выполняет какое-то вычисление, вы, как правило, получаете лучшую производительность, кэшируя ее вручную в локальной переменной, как вы предлагали. Однако имейте в виду, что вы работаете с кэшированным значением и что изменения исходного значения или свойства не будут отражены в вашем кэшированном значении.

Длина имени, однако, является всего лишь метаданными и никак не влияет на производительность во время выполнения, поскольку имя уже разрешено во внутренний дескриптор во время компиляции.

0 голосов
/ 20 апреля 2009

Вы всегда можете сделать это функцией.

SomeType simpleName() { return classWithLongName.otherLongName; }
...