Tag Archives: Programátorská hádanka

Programátorská hádanka: Exceptions

Co bude výstupem?

try
{
  try
  {
    throw new Exception("A");
  }
  catch
  {
    throw new Exception("B");
  }
  finally
  {
    throw new Exception("C");
  }
}
catch (Exception ex)
{
  Console.Write(ex.Message);
}

Výsledek: https://dotnetfiddle.net/6SWPqL

Programátorská hádanka: ArgumentException, ArgumentNullException

Přijde vám na následujícím kódu něco divného?

public void DoSomething(MyClass firstParameter)
{
  if (firstParameter == null)
  {
    throw new ArgumentNullException(nameof(firstParameter), "My message.");
  }
  if (firstParameter.SomeProperty < 0)
  {
    throw new ArgumentException(nameof(firstParameter), "My other message.");
  }

  // do something...
}

Programátorská hádanka: Statický field na generické třídě

Co myslíte, že je v Member v jednotlivých případech?

class BaseClass<T>
{
	public static string Member;
}

class DerivedClass1 : BaseClass<int>
{
}

class DerivedClass2 : BaseClass<double>
{
}

class DerivedClass3 : BaseClass<int>
{
}

void Main()
{
	DerivedClass1.Member = "test";
	Console.WriteLine(DerivedClass1.Member);
	Console.WriteLine(DerivedClass2.Member);
	Console.WriteLine(DerivedClass3.Member);
}

Programátorská hádanka – catch & throw

Jaký je rozdíl v prapagaci výjimky z bloku catch:

try
{
...
}
catch (Exception e)
{
   throw;
}

versus

try
{
...
}
catch (Exception e)
{
   throw e;
}

Odpověď je tentokrát jednoduchá a jako obvykle ji najdete o řádku níže napsanou bílým písmem (pro odtajnění třeba označte):

>>> Při vyhození výjimkt přes „throw;“ se nezmění stack trace – výjimka se stále tváří, že vzešla z původní metody. Při vyhození přes „throw e;“ je změněn stack trace, výjimka se tváří, že vzešla z naší metody obsluhující výjimku. <<<

Programátorská hádanka – Výjimka ve výjimkách

Jaký je rozdíl v zachytávání výjimek při použití typu výjimky Exception

try
{
...
}
catch (Exception e)
{
...
}

a bez použití tohoto typu, tedy

try
{
...
}
catch
{
...
}

Zdůrazňuji, že tento rozdíl existuje jen v .NET Frameworku 1.x, ve verzi 2.0 jsou způsoby funkčně rovnocenné.

Odpověď najdete o řádku níže napsanou bílým písmem (pro odtajnění třeba označte):

>>> Konstrukce catch (Exception e) zachytává jen CLS-compliant výjimky, catch zachytává všechny chyby. Praktický rozdíl je při zachytávání chyb z COM objektů, jejichž chyby nejsou CLS-compliant výjimkami. .NET Framework 2.0 tyto chyby z COM objektů zabalí do RuntimeWrappedException, které jsou CLS-compliant, takže je chyba zachycena i při použití catch (Exception e).  <<<

…a jako posledně: teď se přiznejte, kdo jste to znal!

Programátorská hádanka – neprobádaná zákoutí C#

Víte co znamená @ v následujícím bloku kódu?

ICollection @is = dataSource as ICollection;
if (@is != null)
{
     this.Items.Capacity = @is.Count + this.Items.Count;
}

Odpověď najdete o řádku níže napsanou bílým písmem (pro odtajnění třeba označte):

>>> Zavináč je možné použít na začátku identifikátoru, pokud chceme, aby identifikátorem mohlo být i klíčové slovo (is, null, for, …) <<<

…a teď se přiznejte, kdo jste to znal?