Zmiany w c# na przestrzeni lat – part 2

Udostępnij

Kolejna porcja zmian, jakie pojawiły się w c# przez ostatnie lata. Część z nich może się wydawać nieintuicyjna, ale jak człowiek się przyzwyczai to z wielką satysfakcją robi się refactoring.

File-scoped namespaces

Namespace na poziomie całego pliku, dzięki temu jesteśmy w stanie zaoszczędzić jedno zagnieżdżenie, prosta rzecz a cieszy!

namespace ConsoleApp2;

public class Program
{
    public static void Main(string[] args)
    {

    }
}

Using przy typach IDisposable

Również pojawiło się usprawnienie przy deklaracji using dla interfejsu IDisposable, co pozwala nam pozbyć się kolejnych zagnieżdżeń.

public static void Main(string[] args)
{
    using var stream = new FileStream("plik.txt", FileMode.Open);
    using var reader = new StreamReader(stream);
    var content = reader.ReadToEnd();
    Console.WriteLine(content);
}

Zmiany w interfejsach

Interfejsy przechodzą olbrzymią rewolucję, to czego uczyli Was na studiach już powoli możecie zapomnieć 😀 Statyczna metoda w interfejsie? A proszę bardzo!

public interface IStaticMethod
{
    static abstract void Test();
}

public class TestClass : IStaticMethod
{
    public static void Test()
    {

    }
}

A jeśli chcemy napisać jakiś kod w naszym interfejsie? Również jesteśmy w stanie to zrobić! Warto zaktualizować wiedzę przed kolejną rozmową, gdzie pewnie czeka nas pytanie o różnice między interfejsami a klasą abstrakcyjną. 😀 Warto zauważyć, że metoda z domyślną implementacją jest dostępna na obiekcie typu naszego interfejsu. Jeśli posłużymy się typem implementującym, nie będziemy mieć dostępu do nowej metody.

public interface ICalculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

public class Calculator : ICalculator
{

}

public static void Main(string[] args)
{
    ICalculator calculator = new Calculator();

    Console.WriteLine(calculator.Add(1, 2));
}

Primary Constructors

Jeśli nasza klasa ma jeden konstruktor, a w szczególności jest to bardzo prosta klasa, która wykorzystuje parametry z konstruktora, warto skorzystać z Primary Constructors. To podejście ma też ograniczenia – parametry z Primary Constructor nie są udostępnione publicznie! W przypadku prostych klas do przetwarzania, które przyjmują zależności, ten przypadek użycia jest idealny!

public class TestHandler(IDependency dependency)
{

}
Czytaj również  CORS - który to już raz
Scroll to Top