using System.Numerics; namespace ExamPrep; /* interface I1 { public int X { get; } } class A1 : I1 { public virtual int X { get; set; } = 10; } class B1 : A1 { public override int X => 20; public int Special => base.X + 1; } class C1 : B1 { public override int X { get; set; } } */ /* class A6 { public int X { get; } public A6() { X = f(); } public virtual int f() => 4; } class B6 : A6 { private int _y = 10; public override int f() => _y + 1000; } class C6 : B6 { public new virtual int f() => 20; } class D6 : C6 { public sealed override int f() => 2; } class Program { static void Main(string[] args) { var d = new D6(); Console.WriteLine(m1(d)); Console.WriteLine(d.X); } public static int m1(A6 a) => m2((C6)a); public static int m2(C6 c) => c.f(); } */ /* interface I1 { public char f(); } class A1 : I1 { public virtual char f() => 'A'; } class B1 : A1 { public override char f() => 'B'; } class C1 : B1 { public virtual char f() => (char)(base.f() + 10); } class D1 : C1, I1 {} class E1 : D1 { public new char f() => (char)(base.f() + 5); } class Program { static void Main(string[] args) { E1? a1 = new E1(); Console.WriteLine(a1.f()); I1? i1 = a1; Console.WriteLine(i1.f()); Console.WriteLine(a1 is B1); a1 = null; Console.WriteLine(a1 is A1); } } */ /* interface I5 { public int X { get; set; } } struct S(int a, int b, int c) : I5 { public int X { get; set; } = 5; public int Y { get; } = 5; public int f() { return a + b + c; } } class Program { private static void Update(I5 i) { i.X *= 10; } static void Main(string[] args) { S s1 = new S(11, 12, 13); I5 i1 = s1; // boxed, so it has the normal overhead + only Update(i1); Console.WriteLine(s1.X); Console.WriteLine(i1.X); S[] sa = new S[3]; Console.WriteLine(sa[0].X); } } */ /* class Program { enum E { One = 1, Four = 4, Five } static void Main(string[] args) { E e1 = E.One; Console.WriteLine(e1); e1++; Console.WriteLine((e1)); E e = E.Five; Console.WriteLine((int)e); } } */ /* class Prg8 { public static void Main() { var items = new List<int>(); m1(items); Console.WriteLine(items.Count); m2(ref items); Console.WriteLine(items.Count); } static void m1(List<int> ints) // the reference in items is copied to the variable ints { ints.Add(6); ints = null!; } static void m2(ref List<int> ints) // modifies the original variable itself { ints.Add(7); ints = null!; } } */ /* interface I1 { int f(); } class A1 { public int f() { return 4; } } class B1 : A1, I1 { public int f(int x) => x * 10; } class C1 : B1 { public new int f() { return 8; } } class Program { static void Main() { I1 i1 = new C1(); Console.WriteLine(i1.f()); A1 a1 = (A1)i1; Console.WriteLine(a1.f()); } } */ /* struct S3 { public int X; public int Y => X + 10; public void QuadrupleX() { X *= 4; } } class Program { static void Main() { S3 s1 = new S3 { X = 10 }; s1.QuadrupleX(); Console.WriteLine(s1.Y); // Nullable<T>.Value is a property, hence it returns a copy of the struct and does not modify the // original one. The output will be 10. S3? s2 = new S3() { X = 10 }; if (s2 is not null) { s2.Value.QuadrupleX(); Console.WriteLine(s2.Value.X); } } } */ /* interface I1 { int f(); } class A1 { public int f() { return 1; } } class B1 : A1, I1 { public int f(int x) => x * 2; } class C1 : B1 { public new int f() { return 3; } } class Program { static void Main() { I1 i1 = new C1(); Console.WriteLine(i1.f()); A1 a1 = (A1)i1; Console.WriteLine(a1.f()); } } */ /* class Program { enum DayOfWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; static void Main() { var day = DayOfWeek.Sunday; day++; Console.WriteLine(day); } } */ /* interface I6 { public char f(); } class A6 { public virtual char f() => 'A'; } class B6 : A6, I6 // !!! Interface looks at the signature, not implementation { public override char f() => 'B'; } class C6 : B6 { public virtual char f() => 'C'; } class D6 : C6 { public override char f() => (char)(base.f() + 1); // base forcefully calls the father object's method (think about endless recursion) } class E6 : D6 { public override char f() => (char)(base.f() + 1); } class Program { static void Main() { C6 c6 = new E6(); Console.WriteLine(c6.f()); I6 i6 = new C6(); Console.WriteLine(i6.f()); } } */ /* class Prg6 { public ref int m(ref int a) { var x = 5; ref int r1 = ref x; return ref m(ref r1); } } */ /* public class X { public void m(int i) { Console.WriteLine("X.f(int)"); } } public class Y : X { public void m(float f) { Console.WriteLine("Y.f(float)"); } public void Test() { int i = 1; m(i); // Y.m(float) is called because int fits well into the new method. } } class Prg6 { static void Main(string[] args) { Y y = new Y(); y.Test(); } } */ /* abstract class A { public virtual void m() => Console.Write("A"); } class B : A { public virtual void m(int i = 42) => Console.Write($"B-{i}"); } class C : B { public override void m() => Console.Write("C1"); public virtual void m(int j = 333) => Console.Write($"C2-{j}"); } class D : C { public void m() => Console.Write("D"); } class Prg7 { static void Main() { var x = new C(); x.m(); } } */ interface I7 { public char f(); } class A7 : I7 { public virtual char f() => 'A'; } class B7 : A7 { public override char f() => 'B'; } class C7 : B7 { public virtual char f() => (char)(base.f() + 5); } class D7 : C7 { public override char f() => 'D'; } class E7 : D7 { public override char f() => (char) (base.f() + 10); } class Program { static void Main() { C7? c7 = new E7(); Console.WriteLine(c7.f()); I7 i7 = new D7(); Console.WriteLine(i7.f()); } } /* class X1 { public int Value { get { Console.WriteLine("X"); return 10; } } } class Program { static void Main() { var x1 = new X1(); if (x1.Value > 7 && x1.Value < 25 && x1.Value != 8) { Console.WriteLine("OK1"); } Console.WriteLine("+"); if (x1.Value is > 7 and < 25 and not 8) { Console.WriteLine("OK2"); } } } */ /* struct S { private int x = 7; private int y = 8; public S() { } } class Program { static void Main() { S[] sField = new S[3]; // gets initialized to zeroes } } */ /* class Program { public static void Main(string[] args) { var before = GC.GetAllocatedBytesForCurrentThread(); var r1 = Calc([1, 2, 3, 4], 0); var after = GC.GetAllocatedBytesForCurrentThread(); Console.WriteLine($"Allocated {after - before} B."); Console.WriteLine(r1); var r2 = Calc(null, 0); Console.WriteLine(r2); } static int Calc(int[] a, int b) => a switch { [] => b, [var x, .. var y] when x % 2 == 0 => Calc(y, x + b), [_, .. var z] => Calc(z, b) }; } */ /* class Prgram { static void Main() { try { try { throw new ArgumentException(); } finally { Console.WriteLine("A"); try { try { throw new IndexOutOfRangeException(); } finally { Console.WriteLine("B"); try { try { throw new NotSupportedException(); } finally { Console.WriteLine("C"); } } catch (Exception ex) { Console.WriteLine($"{ex.GetType()}"); throw; } Console.WriteLine("D"); } } catch (Exception ex) { Console.WriteLine($"{ex.GetType()}"); } Console.WriteLine("E"); } } catch (Exception ex) { Console.WriteLine($"{ex.GetType()}"); } } } */