"Trully zaawansowane C# Questions"

0

Zainspirowany tematem java zaawansowane interview questions

Czy znacie jakieś dziwne/ciekawe/wtf/zaawansowane (ponad poziom seniora) rzeczy w C#?

1

na dobra sprawe takie jak w javie :)
ja czesto prosilam o zaimplementowanie czegos identycznego wydajnosciowo do List<T> ale z gwarancja nie uzywania LOH (tj bez fragmentowania pamieci) albo cos co wymaga message loop czy innych windowsowych bebechow. mozna pogadac o implikacjach zwiazanych z interop jak finalizatory, pinning, memory alignment itp

1

Dużo jest takich pytań. Np. Jaka wersja JIT, będzie optymalna dla urządzeń mobilnych?. W jakim miejscu jest alokowana pamięć dla klas statycznych. Ludzie wykładają się nawet na takich podstawach jak pytaniach o algorytm, jakiego używa sort w linq.

0

Używając tylko System;

Napisz funkcję (jedną) z jednym przeciążeniem, która przyjmie różną ilość argumentów różnego typu i je wyświetli

Bez tworzenia żadnych własnych kolekcji, class lub object[] List<object> itd, bez deklarowania zmiennych, bez użycia new. Bez tego wszystkiego do wrzucenia danych do funkcji. Oczywiście również bez traktowania argsów jako napis

Przykładowe dane

5,"x", 5.0, 15
"test", 'b', 5, -2, 5, 199.3m, 3, 3.0, 4.0, -12, 'q'

0
static void Main(string[] args)
        {
            int number;
            string text;
            decimal number2;

            ReturnSomething(out number, out text, out number2);

            Console.WriteLine($"{number} {text} {number2}");
            Console.ReadKey();
        }

        public static void ReturnSomething(int number, string text, decimal number2)
        {

        }

        public static void ReturnSomething(out int number, out string text, out decimal number2)
        {
            number = 55;
            text = "text";
            number2 = 5.5m;
        }
0

Ja bym zadanie z przeciazeniem zrobi tak:

static void Main(string[] args)
        {
            Test((() => Test(1,1, "dwa", 2.2, 2M)));
            Console.ReadKey();
        }
        public static void Test(Action action)
        {
            action.Invoke();

        }
        public static void Test(params dynamic[] args)
        {
            foreach(var item in args)
            {
                Console.WriteLine(item);
            }
        }
0

A może coś w rodzaju curryingu :)

static void Main(string[] args)
{
    Bar(5)("x")(5.0)(15);
}

delegate Foo Foo(object item);

static Foo Bar(object item)
{
    Console.Write(item);
    return x =>
    {
        Console.Write(", ");
        return Bar(x);
    };
}
2

Chodziło mi o __arglist

public static void Main(string[] args)
{
    Foo(__arglist(1, 'q', 2.0,"zzz"));
    Foo(__arglist('o', -15, "?^", 6, -1, "test"));
}

static void Foo(__arglist)
{
    ArgIterator iter = new ArgIterator(__arglist);
    for (int n = iter.GetRemainingCount(); n > 0; n--)
    {
        Console.WriteLine(TypedReference.ToObject(iter.GetNextArg()));
    }
}
1

Kiedy finally się nie wykona i jak się przed tym chociaż odrobinę uratować.

0

Przychodzą mi do głowy tylko, błędy pamięci albo zewnętrzne środowiska uruchomieniowego, ale w takim momencie powinieneś zakończyć działanie aplikacji, zamiast używać finally. Może masz na myśli jakieś dodatkowe zabezpieczenie nisko poziomowe, nie wiem...

3

99% i tak się wyłoży na pytaniu, czy właściwości mogą być oznaczone jako sealed, więc nie widzę sensu w wymyślaniu trudniejszych pytań.

0

Wiele osób może też nie wiedzieć o tym, że member może być np. private protected czy protected internal.

0

Proszę wymienić najczęstszą sytuację, która wymaga przeciążenia operatorów "== oraz !=". Po czym omówić problemy bezpieczeństwa oraz wydajnościowe związane z tą sytuacją. ;)

2

Proszę wymienić najczęstszą sytuację, która wymaga przeciążenia operatorów "== oraz !="

Robię sobie klasę do obsługi liczb zespolonych i oprócz arytmetyki, którą chcę mieć na operatorach, przeciążam także porównanie, co by mi było prościej na tych liczbach operować. Przykład nawet częsty na studiach. Z tego co się orientuję oba te operatory muszą być przeciążone. Nie można przeciążyć tylko jednego z nich.

PS: od zawsze bardziej podoba mi się określenie "przeładowanie" zamiast "przeciążenie", pewnie pozostałość po dawnej lekturze Grębosza.

0

Jeśli przesłaniasz metodę Equls, powinieneś przeciążyć, również operatory ==, != i zastosować w nich ten sam algorytm. Jeśli przesłaniasz metodę Equls musisz również przesłonić GetHashCode().

Problemy:

  • GetHashCode() zwraca inta, musisz wziąć pod uwagę, że ilość HashCode nie może być większa niż int.MaxValue

  • HashCody powinny być równomiernie rozłożone, Jeśli nie uwzględnisz tego, że stringi oparte na alfabecie łacińskim pokrywają głównie 128 początkowych znaków ASCII "mieszanie xorgiem" da bardzo nierównomierne wyniki.

  • Utrudnienie napastnikowi wysłanie do tablicy dużej ilości obiektów o tym samym HashCode co może posłużyć jako atak DoS

  • Jeśli przesłaniasz Equls, a potem == albo !=, powinieneś wyłącznie używać ReferenceEquals(). Jeśli przeciążasz operator to najczęściej popełnianym błędem oraz najśmieszniejsze jest wykonanie rekurencji przez użycie tego samego operatora jako warunek w ifie.

2

Nie wiem, co u Was w firmach robią seniorzy, ale muszą mieć „ekscytującą” pracę, skoro pytacie ich o przeciążanie operatorów lub modyfikatory widoczności…

0
Afish napisał(a):

Kiedy finally się nie wykona

Jeśli wyjątek nie jest nigdzie złapany (i powoduje crash aplikacji) to nie ma gwarancji wykonania bloku finally.
To dość istotnie ogranicza przydatność bloku finally, który ktoś mógłby sobie wyobrażać jako "na pewno" wykonujący kod niezależnie od tego co się stanie.

2

@Afish

using System;
using System.Windows.Forms;

class Test
{
    [STAThread]
    static void Main()
    {
        var form = new Form();
        form.Load += (sender, e) => throw new Exception();

        try
        {
            MessageBox.Show("I am still alive.");
            Application.Run(form);
        }
        catch(Exception e)
        {
            MessageBox.Show("Can't catch this.");
        }
        finally
        {
            MessageBox.Show("Finally!");
        }
    }
}
0

@Azarien
Zdaje się, że mam rację.

System.Windows.Forms.NativeWindow.Callback

private IntPtr Callback(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
		{
			Message message = Message.Create(hWnd, msg, wparam, lparam);
			try
			{
				if (this.weakThisPtr.IsAlive && this.weakThisPtr.Target != null)
				{
					this.WndProc(ref message);
				}
				else
				{
					this.DefWndProc(ref message);
				}
			}
			catch (Exception e)
			{
				this.OnThreadException(e);
			}
			finally
			{
				if (msg == 130)
				{
					this.ReleaseHandle(false);
				}
				if (msg == NativeMethods.WM_UIUNSUBCLASS)
				{
					this.ReleaseHandle(true);
				}
			}
			return message.Result;
		}

A potem w handlerze wyjątku masz:

System.Windows.Forms.Application.ThreadContext.OnThreadException:

ThreadExceptionDialog threadExceptionDialog = new ThreadExceptionDialog(t);
						DialogResult dialogResult = DialogResult.OK;
						IntSecurity.ModifyFocus.Assert();
						try
						{
							dialogResult = threadExceptionDialog.ShowDialog();
						}
						finally
						{
							CodeAccessPermission.RevertAssert();
							threadExceptionDialog.Dispose();
						}
						if (dialogResult != DialogResult.Abort)
						{
							if (dialogResult == DialogResult.Yes)
							{
								WarningException ex = t as WarningException;
								if (ex != null)
								{
									Help.ShowHelp(null, ex.HelpUrl, ex.HelpTopic);
								}
							}
						}
						else
						{
							Application.ExitInternal();
							new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
							Environment.Exit(0);
						}

Na samym końcu aplikacja jest wyłączana przez Environment.Exit, więc catch na samej górze nie ma żadnego wyjątku do złapania. Finally ciągle się wykonuje, jakby było Environment.FailFast, to nawet on by się nie wykonał.

0

Właśnie wymyśliłem nowe pytanie:

Czy kolejność pól w klasie/strukturze wpływa na rozmiar zajmowanego przez nią miejsca w pamięci?

Pytanie jest fajne, bo otwiera pole do dyskusji na temat reprezentacji obiektów w pamięci.

0
neves napisał(a):

Właśnie wymyśliłem nowe pytanie:

Czy kolejność pól w klasie/strukturze wpływa na rozmiar zajmowanego przez nią miejsca pamięci?

Pytanie jest fajne, bo otwiera pole do dyskusji na temat reprezentacji obiektów w pamięci.

o to chodzi?

class First
{
    private static int a = 10;
    public static long b = CalculateB();

    static long CalculateB()
    {
        return Convert.ToInt64(Math.Pow(a, 10));
    }
}

class Second
{
    public static long b = CalculateB();
    private static int a = 10;

    static long CalculateB()
    {
        return Convert.ToInt64(Math.Pow(a, 10));
    }
}

public static void Main(string[] args)
{
   Console.WriteLine(First.b);

   Console.WriteLine(Second.b);
}
10000000000
0
11

Jeżeli komuś się nudzi i chce "pozaginać" innych, to jedziemy:

  1. Co się stanie, gdy rzucę jako wyjątek coś niedziedziczącego po System.Exception? Co się dzieje w dotnecie 1?
  2. Jak efektywnie połknąć ThreadAbortException?
  3. Jak łapać wyjątki AccessViolation? Jak je łapać w dotnecie 1?
  4. Metoda A woła metodę B z części try bloku try+finally. Metoda B powoduje wyjątek w części try bloku try+finally. Czy możliwe jest, że nie wykona się żaden finally? Czy możliwe jest, że wykona się tylko zewnętrzny finally (z metody A)?
  5. Czym różni się finally od fault?
  6. Czy exception filter jest tylko cukrem składniowym?
  7. Jak skompaktować LOH?
  8. Jakie obiekty poza tymi o rozmiarze 85000+ bajtów lecą na LOH w dotnet frameworku?
  9. Jak poprosić dotnet, żeby nie rzucał wyjątków out of band?
  10. Jak „zmartwychwstać” obiekt? Jak zrobić, aby dotnet ponownie sam z siebie go sprzątnął?
  11. Co to jest VM_HOARDING?
  12. Jak wyłączyć GC?
  13. Jak zrobić fragment kodu, który ubije całą app domenę, jeżeli poleci w nim wyjątek?
  14. Co to są interior pointers?
  15. Czy interfejs może mieć type constructor? Jak go zrobić?
  16. Jak zmienić nazwę indeksera?
  17. Czy interfejs może mieć statyczne pola i metody? Jak je zrobić?
  18. Ile powstaje obiektów przy inicjalizacji przez new Foo {Bar = 1}?
  19. Co to jest kowariancja? Kontrawariancja? Jak działa w tablicach, a jak w generykach?
  20. Czy dynamic wspiera extension methods?
  21. Czym różni się wywołanie equals od == ?
  22. Jak zrobić bezparametrowy konstruktor dla struktury?
  23. Czym różni się wywołanie new Struktura() od default(Struktura) gdzie Struktura to struct?
  24. Jaką rozdzielczość ma TimeSpan?
  25. Ile bajtów zajmuje pusta struktura?
  26. Co to jest typ blittable?
  27. Czy dwie metody mogą różnić się tylko typem zwracanym?
  28. Czym różni się const od readonly?
  29. Jak są przekazywane parametry w C#? Przez wartość? Przez referencję? Inaczej?
  30. W jakiej kolejności obliczane są parametry przy wywoływaniu funkcji?
  31. Czym różni się typeof od GetType?
  32. Jak jest kompilowany using? lock? Jak zmienił się lock koło dotneta 4?
  33. Ile pamięci domyślnie zjada wątek na starcie?
  34. Co to jest string interning?
  35. Do czego jest kompilowany switch?
  36. Co to jest __makeref? __refvalue? __refType? __argslist?
  37. Jak zrobić unię w C#?
  38. Ile jest domyślnie appdomen?
  39. Ile wątków na starcie ma aplikacja?
  40. Co się stanie, gdy w finalizerze poleci wyjątek? Co będzie w przypadku nieskończonej pętli?
  41. Co to jest syncblock?
  42. Czy P/Invoke pinuje obiekty?
  43. Co to jest pinowanie obiektów?
  44. Czy da się zagnieździć klasę w klasie? W interfejsie? Interfejs w klasie? W interfejsie?
  45. Jak zablokować dostęp do prywatnych składników przez refleksję?
  46. Czy foreach wymaga interfejsu? Co to jest WellKnownMember?
  47. Jakiej konwencji wywołania używa dotnet?
  48. Jak awaitować na metodę async void? Jak złapać wyjątek z takiej metody?
  49. Co będzie, gdy poleci wyjątek w metodzie async Task, ale nikt na niego nie zawaituje?
  50. Jak działa query syntax w LINQ? Do czego jest kompilowany?
  51. Czym różni się Select z IEnumerable od tego z IQueryable?
  52. Czy decimal może być const? A string? A instancja class Foo?
  53. Czy x == x może dać false? A x.Equals(x)?
  54. Co to jest card table? A brick table?
  55. Co to jest write barrier?
  56. Czy value type'y mają method table? Co to jest method table?
  57. Czy generacja 0 jest kompaktowana?
  58. Co to jest finalization queue? Co to jest f-reachable queue?
  59. Czy CLR wspiera fibery?
  60. Do czego jest kompilowana klasa niezarządzana w C++/CLI?
  61. Czy Timer może zostać sprzątnięty, jeżeli ma wykonać jakieś callbacki, ale nikt nie trzyma do niego referencji?
  62. Czy da się przekazać zmienną volatile przez referencję?
  63. Czy strumienie są thread safe?
  64. Czy można lockować value type?
  65. Co jest dzielone między app domenami?
  66. Czy Thread.Yield lub Thread.Join pompują wiadomości COM?
  67. Czym różni się Thread.Yield od Thread.Sleep(0)?
  68. Jakie są reguły memory modelu?
  69. Po czym dziedziczy delegat?
  70. Mamy delegat z trzema podpiętymi metodami. Co się stanie, jeżeli pierwsza podpięta metoda rzuci wyjątek?
  71. Czym różni się delegate { ...} od delegate() { ... }?
  72. Czy można zdefiniować pole globalne?
  73. Czy można napisać DllMain w C#?
  74. Czy da się napisać własny Nullable<T>?
  75. Co to jest rzutanie na true i na false?
  76. Czy można mieć try w metodzie z yieldem? A catch? A finally? A w metodzie async?
  77. Co to jest bit-mapped attribute? Custom? Pseudo-custom?
  78. Po czym dziedziczy tablica?
  79. Czy da się zrobić tablicę indeksowaną od dwójki?
  80. Co to jest shim?
0
var list = new List<int>();
list.Add(0);

Jaką pojemność będzie miała lista zainicjalizowana w ten sposób przed i po dodaniu pierwszego elementu i jak się będzie zmieniać, oraz dlaczego jeżeli znamy ilość danych, to lepiej zrobić new List<int>(size);

Jeżeli się gdzieś nie walnąłem ofc :P

Dlaczego w ten sposób

var x = new List<int>();
for (long y = 0; y < long.MaxValue; y++)
    x.Add(0);

outOfMemory exception leci przy y = 268 435 456

A w ten sposób przy

var x = new List<int>(134217728 * 3);
for (long y = 0; y < long.MaxValue; y++)
    x.Add(0);

402 653 184

Jak działa gcAllowVeryLargeObjects?

1 użytkowników online, w tym zalogowanych: 0, gości: 1