Будет ли компилятор C# оптимизировать этот код?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Будет ли компилятор C# оптимизировать этот код?

Сообщение Anonymous »

Я часто сталкиваюсь с этим сценарием. На первый взгляд, я думаю: «Это плохое кодирование; Я выполняю метод дважды и обязательно получаю один и тот же результат ». Но, подумав об этом, я должен задаться вопросом, является ли компилятор таким умным, как и я, и могу прийти к тому же выводу. < /P>

Код: Выделить всё

var newList = oldList.Select(x => new Thing {
FullName = String.Format("{0} {1}", x.FirstName, x.LastName),
OtherThingId = x.GetOtherThing() != null : x.GetOtherThing().Id : 0 // Might call x.GetOtherThing() twice?
});
< /code>

зависит ли поведение компилятора от содержимого метода getotherthing < /code>? Скажем, это выглядит так (в некоторой степени похоже на мой настоящий код прямо сейчас): < /p>

public OtherThing GetOtherThing() {
if (this.Category == null) return null;
return this.Category.OtherThings.FirstOrDefault(t => t.Text == this.Text);
}
< /code>

это будет, за исключением очень плохо обработанных асинхронных изменений в любом хранилище, из которого поступают эти объекты, определенно верните одно и то же, если запустить дважды подряд. Но что, если это выглядело так (бессмысленный пример ради аргумента): < /p>

public OtherThing GetOtherThing() {
return new OtherThing {
Id = new Random().Next(100)
};
}
< /code>

Запуск этого дважды подряд приведет к созданию двух разных объектов, с разными идентификаторами по всей вероятности. Что будет делать компилятор в этих ситуациях? Это так же неэффективно, как кажется, это то, что я показал в своем первом списке?   Я запустил что -то очень похожее на этот первый список кодов и поместил точку останова в методе экземпляра GetOtherThing 
. Точка останова была поражена один раз. Таким образом, похоже, что результат действительно кэширован. Что произойдет во втором случае, где метод может возвращать что -то другое каждый раз? Компилятор оптимизируется неправильно? Есть ли какие -либо предостережения в результате, который я нашел? Этот вывод был недействительным. Смотрите комментарии в соответствии с ответом @USR.

Подробнее здесь: https://stackoverflow.com/questions/218 ... -this-code
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»