Цитата:
Сообщение от
otkudao
2 belugin
Не уверен, что смогу подробнее раскрыть , подобрав другие слова, но попробую: Рихтер указывает, что многие методы базовых объектов (System.Object) реализованы не самым эффективным с точки зрения скорости выполнения образом и их нужно заменять. Также приводит в пример , кажется, System.Decimal и System.String (у стринга это методы Concat), в которых "правильно" реализованы линейки перегруженных методов с тем, чтобы не использовать стандартный массив параметров ( params ). Создавая конструкторы, нужно тщательно продумывать, будут ли создаваться объекты по значению, в какой момент сработают конструкторы типов. Для методов: будут ли генерироваться параметры как динамические объекты в куче, минимизировать их число, вынося генерацию объектов из методов. если можно обойтись одним объектом; советует перегружать методы только из-за того, чтобы они возвращали различные типы значений (и не было операции конвертации, уж больно дюже она неэффективна) , что-то еще , что сейчас вечером уже не в силах вспомнить.
ааа, Вы про упаковку... Не все объекты получится разместить в стеке потока, от кучи никуда не уйти. В C++, например, у разработчика вообще нет контроля над тем куда разместить объект в стек потока или в кучу. Так что в .NET это плюс - у разработчика больше свободы.
На самом деле, я считаю, что .NET в аксапте не нужен. В таких приложениях большую часть времени занимают операции ввода-вывода, и зачастую, временем, за которое выполняется код можно вообще пренебречь - настолько мизерную часть от общего времени он составляет. Поэтому, мне кажется, не стоит ждать того, что после перехода с x++ на c# аксапта "залетает".
А еще я думаю, что читать код на c# будет сложнее, т.к. нужно будет следить за всякими нюансами .NET, а не только за бизнес логикой. Вот примерчик, для демонстрации того, о чем я говорю:
X++:
class Program
{
static void Main(string[] args)
{
Shape shape1 = new Shape(1, 2, 3, 4, "descr1", 5);
Console.WriteLine(shape1.ToString());
Shape shape2 = shape1;
shape2.description = "descr2";
shape2.intValue = 6;
shape2.p1.x = 7;
shape2.p1.y = 8;
Console.WriteLine(shape1.ToString());
Console.WriteLine(shape2.ToString());
Console.ReadLine();
}
public class Point
{
public int x;
public int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
public struct Shape
{
public Point p1;
public Point p2;
public string description;
public int intValue;
public Shape(int x1, int y1, int x2, int y2, string descr, int i)
{
p1 = new Point(x1, y1);
p2 = new Point(x2, y2);
description = descr;
intValue = i;
}
public override string ToString()
{
return String.Format("p1 = {0}:{1}, p2 = {2}:{3} descr: {4} int: {5}", p1.x, p1.y, p2.x, p2.y, description, intValue);
}
}
}
Вот результат выполнения:
Цитата:
p1 = 1:2, p2 = 3:4 descr: descr1 int: 5
p1 = 7:8, p2 = 3:4 descr: descr1 int: 5
p1 = 7:8, p2 = 3:4 descr: descr2 int: 6