У меня есть метод, который вызывает вспомогательный метод из цикла . Метод помощника содержит относительно дорогостоящее объявление переменной и определение, которое включает в себя отражение (см. Ниже.) Мне интересно, можно ли подсчитать компилятор, чтобы встроить метод вызов и поднять объявление и определение из цикла, или если мне нужно Рефактор метод, чтобы гарантировать, что оператор определения не выполняется с каждой итерацией. < /p>
private class1[] BuildClass1ArrayFromTestData()
{
var class1Count = int.Parse(testContextInstance.DataRow["class1[]"].ToString());
var class1s = new List(class1Count);
for (var c = 0; c < class1Count; c++)
{
class1s.Add(BuildClass1FromTestData(string.Format("class1[{0}]", c)));
}
return class1s.ToArray();
}
private class1 BuildClass1FromTestData(string testContextName)
{
DataColumnCollection columns = testContextInstance.DataRow.Table.Columns;
var class1Fields = typeof(class1).GetFields();
var class1Object = new class1();
foreach (var field in class1Fields)
{
var objectContextName = string.Format("{0}.{1}", testContextName, field.Name);
if (!columns.Contains(objectContextName))
continue;
// Assume that all fields are of type "string" for simplicity
field.SetValue(
class1Object,
testContextInstance.DataRow[objectContextName].ToString()
);
}
return class1Object;
}
< /code>
Обновление: < /strong> < /p>
Вот альтернатива, которую я предполагаю, для разъяснения Цели: < /p>
private class1[] BuildClass1ArrayFromTestData()
{
var class1Count = int.Parse(testContextInstance.DataRow["class1[]"].ToString());
var class1s = new List(class1Count);
// Moved from BuildClass1FromTestData()
DataColumnCollection columns = testContextInstance.DataRow.Table.Columns;
var class1Fields = typeof(class1).GetFields();
for (var c = 0; c < class1Count; c++)
{
class1s.Add(BuildClass1FromTestData(string.Format("class1[{0}]", c)), columns, class1Fields);
}
return class1s.ToArray();
}
private class1 BuildClass1FromTestData(string testContextName, DataColumnCollection columns, FieldInfo[] class1Fields)
{
var class1Object = new class1();
foreach (var field in class1Fields)
{
var objectContextName = string.Format("{0}.{1}", testContextName, field.Name);
if (!columns.Contains(objectContextName))
continue;
// Assume that all fields are of type "string" for simplicity
field.SetValue(
class1Object,
testContextInstance.DataRow[objectContextName].ToString()
);
}
return class1Object;
}
Подробнее здесь: https://stackoverflow.com/questions/244 ... alled-with
Согласно ли объявление переменных компилятора C# из -за методов, называемых в циклах? ⇐ C#
Место общения программистов C#
1739620868
Anonymous
У меня есть метод, который вызывает вспомогательный метод из цикла . Метод помощника содержит относительно дорогостоящее объявление переменной и определение, которое включает в себя отражение (см. Ниже.) Мне интересно, можно ли подсчитать компилятор, чтобы встроить метод вызов и поднять объявление и определение из цикла, или если мне нужно Рефактор метод, чтобы гарантировать, что оператор определения не выполняется с каждой итерацией. < /p>
private class1[] BuildClass1ArrayFromTestData()
{
var class1Count = int.Parse(testContextInstance.DataRow["class1[]"].ToString());
var class1s = new List(class1Count);
for (var c = 0; c < class1Count; c++)
{
class1s.Add(BuildClass1FromTestData(string.Format("class1[{0}]", c)));
}
return class1s.ToArray();
}
private class1 BuildClass1FromTestData(string testContextName)
{
DataColumnCollection columns = testContextInstance.DataRow.Table.Columns;
var class1Fields = typeof(class1).GetFields();
var class1Object = new class1();
foreach (var field in class1Fields)
{
var objectContextName = string.Format("{0}.{1}", testContextName, field.Name);
if (!columns.Contains(objectContextName))
continue;
// Assume that all fields are of type "string" for simplicity
field.SetValue(
class1Object,
testContextInstance.DataRow[objectContextName].ToString()
);
}
return class1Object;
}
< /code>
Обновление: < /strong> < /p>
Вот альтернатива, которую я предполагаю, для разъяснения Цели: < /p>
private class1[] BuildClass1ArrayFromTestData()
{
var class1Count = int.Parse(testContextInstance.DataRow["class1[]"].ToString());
var class1s = new List(class1Count);
// Moved from BuildClass1FromTestData()
DataColumnCollection columns = testContextInstance.DataRow.Table.Columns;
var class1Fields = typeof(class1).GetFields();
for (var c = 0; c < class1Count; c++)
{
class1s.Add(BuildClass1FromTestData(string.Format("class1[{0}]", c)), columns, class1Fields);
}
return class1s.ToArray();
}
private class1 BuildClass1FromTestData(string testContextName, DataColumnCollection columns, FieldInfo[] class1Fields)
{
var class1Object = new class1();
foreach (var field in class1Fields)
{
var objectContextName = string.Format("{0}.{1}", testContextName, field.Name);
if (!columns.Contains(objectContextName))
continue;
// Assume that all fields are of type "string" for simplicity
field.SetValue(
class1Object,
testContextInstance.DataRow[objectContextName].ToString()
);
}
return class1Object;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/24419936/does-the-c-sharp-compiler-hoist-variable-declarations-out-of-methods-called-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия