Szukaj…


Składnia

  • scope (exit) - instrukcje są wywoływane bez względu na sposób wyjścia z bieżącego bloku
  • zakres (sukces) - instrukcje są wywoływane, gdy bieżący blok został zakończony normalnie
  • zakres (błąd) - instrukcje są wywoływane, gdy bieżący blok został zakończony przez zgłoszenie wyjątku

Uwagi

Użycie osłon zakresu sprawia, że kod jest znacznie bardziej przejrzysty i pozwala na umieszczenie alokacji zasobów i wyczyszczenie kodu obok siebie. Ci mali pomocnicy również poprawiają bezpieczeństwo, ponieważ zapewniają, że pewien kod czyszczenia jest zawsze wywoływany niezależnie od tego, które ścieżki są faktycznie pobierane w czasie wykonywania.

Funkcja zakresu D skutecznie zastępuje idiom RAII używany w C ++, co często prowadzi do specjalnych obiektów chroniących zakres dla specjalnych zasobów.

Osłony zakresów są wywoływane w odwrotnej kolejności niż są zdefiniowane.

Graj z osłonami lub zobacz obszerny samouczek .

Umieść kod przydzielania i czyszczenia obok siebie

Osłony zakresu pozwalają na wykonywanie instrukcji w określonych warunkach, jeśli pozostanie bieżący blok.

import core.stdc.stdlib;

void main() {
    int* p = cast(int*)malloc(int.sizeof);
    scope(exit) free(p);
}

Wiele zagnieżdżonych zakresów

import std.stdio;

void main() {
    writeln("<html>");
    scope(exit) writeln("</html>");
    {
        writeln("\t<head>");
        scope(exit) writeln("\t</head>");
        "\t\t<title>%s</title>".writefln("Hello");
    } // the scope(exit) on the previous line is executed here

    writeln("\t<body>");
    scope(exit) writeln("\t</body>");

    writeln("\t\t<h1>Hello World!</h1>");
}

odciski

<html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        <h1>Hello World!</h1>
    </body>
</html>


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow