Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Serginio1, Вы писали:
S>> Получаем. Ибо для всех нод кроме первой и последней у нас будет проверка, а с null у нас этой проверки не будет.
S>Нет. Ни для какой из нод никакой проверки нет.
S>То, что вы кому-то из них что-то установили, никак не контролируется компилятором.
S>Вот код — ошибка копипаста:
S>S>var node1 = new Node("Hello") { Next = Node.EmptyNode, Previous = Node.EmptyNode };
S>var node2 = new Node("World") { Next = node1, Previous = Node.EmptyNode) };
S>node1.Previous = node2;
S>foreach(var n in Iterate(node1)
S> Console.WriteLine(n);
S>
S>Компилятор молчит. Дальше что? Где проверка-то?
Это просто набросок. По уму нужно делать проверку на первый и последний узел который будет у родителя. А именно.
void AddBeforeNode(Node node)
{
if (node == FirstNode) // if (node.Previous == Node.Empty)
{
var node = new Node(Node.Empty,node);
}
else
{
// Вернее этот код будет работать и для первой ноды так как node.Previous == Node.Empty
var node = new Node(node.Previous ,node);
node.Previous.Next = node;
}
node.Previous = node;
}
void AddNodeToEnd()
{
if (LastNode == node.Empty)
{
LastNode = new Node(Node.Empty,Node.Empty);
FirstNode = LastNode;
}
else
{
var node = new Node(LastNode ,LastNode.Next);
LastNode.Next = node;
LastNode = node;
}
}
S>> Еще раз читай внимательно для всех узлов кроме первой и последней будет "правильная "проверка, чего лишен Node?
S>Сколько бы раз я не читал, неправда правдой быть не перестанет. Проверка либо есть, либо её нету. EmptyNode проверку затыкает — ничуть не лучше, чем null!.
Нет не затыкает! Ибо для крайних узлов это не null!
S>>Меня беспокоило то, что в алгоритме Влада будет вызываться ошибка, так как первый и последний узел не будут инициализироваться!
S>Ну так и в вашем коде они не инициализируются.
Устал писать. Для последней ноды Next = Node.EmptyNode для первой Previous = Node.EmptyNode
S>var node2 = new Node("World") { Next = node1, Previous = Node.EmptyNode
S>>Я предложил , что не нужно изменять язык, достаточно добавить свой анализатор типа
S>Ну так Влад примерно это и предлагает. Только встроить "анализатор" в компилятор, где уже процентов 70% этого анализа проведено. Плюс есть ещё несколько интересных вопросов про то, как должен этот анализатор выяснять, что именно ему нужно проверить. Влад пытался навелосипедить специальный стейтмент, который позволяет указать границы "опасной зоны" вместе с конкретными объектами, которые нужно доинициализировать в её пределах. А как прагма поможет понять, за кем следить? Что, если прагмы будут стоять не по границам C# scope?
Значит будет смотреть все переменные в прагме, как это делается для всех прагм.
Возможно и стоит сделать для нового языка этот init, но прагма лучше подходит для старых языков. У многих стоит ограничение на фреймворки.