niedziela, 26 lipca 2015

Komentarze i dyrektywy

Niezależnie od języka programowania, czytelność kodu to podstawowa zasada współpracy grupy programistów. Nie mniej ważne są komentarze, które pozwalają na opis ważnych lub niezrozumiałych fragmentów kodu. C#, należący do rodziny języków C, udostępnia dwa style komentowania kodu.

Komentarze jednowierszowe tworzone są przez sekwencję dwóch znaków: //. W przypadku komentarzy oddzielnych sekwencja rozpoczynająca to: /*, a zamykająca: */. Cały tekst wprowadzony w komentarzach jest ignorowany przez kompilator. Dodatkowo, komentarz oddzielny może zostać zapisany w kilku liniach kodu.

using System;

namespace HelloWorld
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Wyświetlamy 
            Console.Write("Hello world C#");    // komunikat 

            /*
                Komentarz 
                zapisany
                w 
                kilku
                liniach.
            */
        }
    }
}

Komentarze przydają się również w sytuacji, w której chcemy tymczasowo pominąć fragment kodu w kompilacji. Visual Studio udostępnia przydatną funkcjonalność umożliwiającą komentowanie oraz odkomentowanie zaznaczonego bloku kodu.

Oczywiście to samo możemy uzyskać za pomocą skrótów klawiszowych, klikając Ctrl + E, C w przypadku komentowania oraz Ctrl + E, U w przypadku odkomentowania. Kompilator Visual Studio pomija nie tylko komentarze, ale również białe znaki.

using System;

namespace HelloWorld
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.Write("Hello world C#");
            Console    .    Write    ("Hello world C#")    ;
            Console.
                Write
                ("Hello world C#");
        }
    }
}

Język C#, a dokładnie Visual Studio, pozwala również na tworzenie dokumentacji kodu w formacie XML. Domyślnie opcja jest wyłączona. W celu włączenia jej, należy przejść do właściwości projektu, wybrać zakładkę Build, a następnie zaznaczyć opcję XML documentation file w sekcji Output. Po zaznaczeniu, Visual Studio generuje ostrzeżenia dla publicznych elementów, które nie posiadają opisu. Aby uzupełnić opis, wystarczy umieścić trzy znaki /// przed linią zawierającą opis, a środowisko automatycznie wygeneruje strukturę. Szczegółowy opis tworzenia dokumentacji XML można znaleźć tutaj. Poniżej zamieszczam kod programu HelloWorld, rozszerzony o dokumentację.

using System;

namespace HelloWorld
{
    /// <summary>
    /// Podstawowa klasa projektu
    /// </summary>
    public class Program
    {
        /// <summary>
        /// Punkt uruchomienia programu
        /// </summary>
        /// <param name="args">Tablica parametrów wejściowych</param>
        public static void Main(string[] args)
        {
            Console.Write("Hello world C#");
        }
    }
}

C# udostępnia dyrektywy preprocesora, podobnie jak język C. Jednak C# nie posiada odrębnej fazy wstępnego przetwarzania kodu. Zaczynając od najprostszej dyrektywy #region, która nie powoduje żadnych zmian w działaniu programu, z wyjątkiem sytuacji, w której kompilator po wystąpieniu #region nie znajdzie #endregion, zgłaszając błąd kompilacji. Para dyrektyw rozpoznawana jest przez Visual Studio jako "region kodu", umożliwiając "zwinięcie" kodu objętego dyrektywami. Po dyrektywie rozpoczynającej możemy wstawić dodatkowy opis, reprezentujący zwinięty kod. Dyrektywy #region i #endregion możemy zagnieżdżać wewnątrz siebie.

Ten sam efekt możemy uzyskać poprzez zaznaczenie tekstu i kliknięcie prawym przyciskiem myszy, a następnie wybierając z menu Surround With... / #region.

Dyrektywa #pragma pozwala na wyłączenie ostrzeżeń kompilatora. W poniższym przykładzie wyłączamy ostrzeżenie generowane przez kompilator w sytuacji deklaracji zmiennej, która nie została użyta w dalszym kodzie.

Dyrektywa #define pozwala na definiowanie symbolu kompilacji. Visual Studio domyślnie posiada dwa zdefiniowane symbole kompilacji: Debug i Release. Najczęstszym zastosowaniem dyrektyw jest ich połączenie z dyrektywami: #if, #else, #elif oraz #endif, dzięki czemu możemy zapewnić kompilację bloku kodu wyłącznie dla określonego symbolu kompilacji.

using System;

namespace HelloWorld
{
    public class Program
    {
        public static void Main(string[] args)
        {
#if DEBUG
            Console.WriteLine("Uruchomienie metody: Main");
#endif

            Console.WriteLine("Hello world C#");

#if DEBUG
            Console.WriteLine("Zakończenie metody: Main");
#endif
            Console.ReadLine();
        }
    }
}

Jeżeli wybierzemy kompilację Release, kod objęty dyrektywą #if DEBUG zostanie wyszarzony, informując o pominięciu w kompilacji. Alternatywnym rozwiązaniem jest wykorzystanie metod warunkowych opisanych przy okazji omawiania System.Diagnostics. Na koniec wspomnę o istnieniu dyrektyw: #error oraz #warning, pozwalających na generowanie błędów i ostrzeżeń kompilatora oraz #line wskazującej miejsce powstania błędu. Dokładny opis dyrektyw można znaleźć na stronie Microsoft.

Troska Robert