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)
{
}