Строковый литерал имеет тип string
. А new String()
имеет тип object
. Они не совсем одно и то же. У объектов любого вида в JS могут быть установлены новые свойства; примитивы не могут. Проверьте это сами: выведите typeof "Something"
и он скажет, что это строка; но выведите typeof new String("Something")
и он скажет, что это объект.
Я обычно предпочитаю удобочитаемость и понимающий по скорости. Пойдите с именем. Вы могли (должен) использовать строковые константы, которые могут быть обновлены в одном месте, если Вы решаете изменить имена столбцов базы данных.
Доступ к значениям столбцов/строки через имена столбцов лучше для чтения человека и для прямой совместимости (если в будущем кто-то заявка на изменение или количество столбцов).
Значения столбцов/строки Accissing через индексы столбца лучше для производительности.
Так, если Вы хотите изменение некоторое значение в one/two/..... строки, имена столбцов в порядке. Но если Вы хотите изменение некоторое значение в тысячах строк, необходимо использовать индекс столбца, вычисленный из имени столбца:
int ndxMyColumn = table.Columns.IndexOf( "MyColumn" );
foreach(DataRow record in table.Rows ) {
record[ndxMyColumn] = 15;
}
Я думал бы, что имя столбца является лучшим способом пойти. Легче определить то, что Вы вытягиваете, и порядок столбцов определяется избранным оператором, который мог измениться когда-то в будущем. Вы могли утверждать, что имя столбца могло измениться также, но я буду думать, что это было бы гораздо менее вероятно.
Править:
На самом деле, если бы Вы были действительно изогнуты при использовании индексов столбца, то Вы могли бы создать константы индексов столбца и назвать константу названием столбца. Так:
PRIMARY_KEY_COLUMN_NAME_INDEX = 0
Это, по крайней мере, сделало бы это читаемым.
Это зависит от того, в чем Вы нуждаетесь. В моем случае у меня была ситуация, где скорость была главной, поскольку я выполнял интенсивную обработку на тысячах строк в DataSet, таким образом, я принял решение записать часть кода, который кэшировал индексы столбца по имени. Затем в коде цикла я использовал кэшируемые индексы. Это дало разумное увеличение производительности по использованию имени столбца непосредственно.
Ваш пробег может варьироваться, конечно. Моя ситуация была скорее изобретенным и необычным случаем, но в том экземпляре она работала скорее хорошо.
Мое мнение - то, что необходимо только переключиться на индексы, если бы Вы представили свой код, и он показал узким местом. Я не думаю, что это произойдет.
Именование материала хорошо, это заставляет наш ограниченный мозг понять проблемы и создать легче ссылки. Вот почему мы - имена, такие как Fred, Martin, Jamie, а не Человек [189333847], Человек [138924342] и Человек [239333546].
Пойдите с именем, Вы получаете лучшие сообщения об ошибках :)
Если бы Вы действительно решали запутать базу данных путем изменения имен столбцов в будущем, то Вы могли исказить те столбцы в своем запросе для хранения кода индексатора функциональным. Я предлагаю индексировать по имени.
Я выбираю строки для простоты чтения и пригодности для обслуживания. Я использую строку contstants для определения значений имен столбцов. Исключая:
public class ExampleDataColumns
{
public const string ID = "example_id";
public const string Name = "example_name";
....
}
Затем я могу сослаться на него позже как это:
row[ExampleDataColumns.ID]
Используйте имена столбцов для DataRow к тому же, что RDBMS не получит скорость, требуя, чтобы программисты указали индекс столбца в SQL. Но можно, возможно, подражать способу, которым работает RDBMS, когда Вы делаете заявление SELECT, в механизме RDBMS это запрашивает столбец, index/offset из столбцов, указанных в ИЗБРАННОМ пункте перед ним, пересекают строки, таким образом, это может работать быстрее.
Если Вы действительно хотите получить скорость, не делайте этого константа/перечисление путь (порядок столбцов мог бы измениться на Вашей базе данных или уровне ORM). Сделайте это как предложенный TcKs (перед фактическим циклом):
int ndxMyColumn = table.Columns.IndexOf( "MyColumn" );
foreach(DataRow record in table.Rows ) {
record[ndxMyColumn] = 15;
}
для меня я использую отражение (не уверенный, что это - корректный способ назвать то, что я делаю) получить columnnameColumn от таблицы
никакое "жесткое кодирование" не лучше
int price = (int)dr[DatableVar.PriceColumn];
Полностью агресс с другими идти на читабельность и ремонтопригодность по скорости. У меня, однако, имел общий метод, который, необходимый для того, чтобы быть названным столбцами, переданными в качестве параметров, поэтому имел смысл разработать то, что были индексы столбцов.
В бенчмаркеринге ниже используя индекс столбца показал большое улучшение, поэтому, если это область узкого места или важная ваша часть вашего кода, она может быть полезной.
Вывод из кода ниже:
515МС с Columnindex
1031MS с столбцем
static void Main(string[] args)
{
DataTable dt = GetDataTable(10000, 500);
string[] columnNames = GetColumnNames(dt);
DateTime start = DateTime.Now;
TestPerformance(dt, columnNames, true);
TimeSpan ts = DateTime.Now.Subtract(start);
Console.Write("{0}ms with ColumnIndex\r\n", ts.TotalMilliseconds);
start = DateTime.Now;
TestPerformance(dt, columnNames, false);
ts = DateTime.Now.Subtract(start);
Console.Write("{0}ms with ColumnName\r\n", ts.TotalMilliseconds);
}
private static DataTable GetDataTable(int rows, int columns)
{
DataTable dt = new DataTable();
for (int j = 0; j < columns; j++)
{
dt.Columns.Add("Column" + j.ToString(), typeof(Double));
}
Random random = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < rows; i++)
{
object[] rowValues = new object[columns];
for (int j = 0; j < columns; j++)
{
rowValues[j] = random.NextDouble();
}
dt.Rows.Add(rowValues);
}
return dt;
}
private static void TestPerformance(DataTable dt, string[] columnNames, bool useIndex)
{
object obj;
DataRow row;
for (int i =0; i < dt.Rows.Count; i++)
{
row = dt.Rows[i];
for(int j = 0; j < dt.Columns.Count; j++)
{
if (useIndex)
obj = row[j];
else
obj = row[columnNames[j]];
}
}
}
private static string[] GetColumnNames(DataTable dt)
{
string[] columnNames = new string[dt.Columns.Count];
for (int j = 0; j < columnNames.Length; j++)
{
columnNames[j] = dt.Columns[j].ColumnName;
}
return columnNames;
}