C# agytorna #01

Szembetalálkoztam egy érdekes kis “hibával”. Igazából a hiba nem jó kifejezés – csak arról van szó, hogy egy kód nagyon nem azt csinálja, amit első ránézésre várna tőle az ember. Az egyik osztálynál előjött bizonyos helyzetekben, a másik osztálynál nem.

Tekintsük az alábbi osztályt:

internal class Alma
{
    public string Szín { get; set; }
}

Majd pedig legyen egy (statikus) almánk a Program osztályban (ami tegyük fel, hogy iszonyat nagy), egy metódusunk, ami elpusztítja és egy, ami naplózza ezt az eseményt. A Main metódusban pedig hozzuk létre az almát, együk meg, logolással, és ezután írjuk ki a színét! (Igen, miután elvileg megettük!)

private static Alma alma = null;

private static string Megesz()
{
    alma = null;
    return "Megettem.";
}

static void Main(string[] args)
{
    alma = new Alma { Szín = "zöld" };
    Log(Megesz());
    Console.WriteLine(alma.Szín);
}

Érezhető, gondolom, hogy ennek a kódnak el kellene szállnia, hiszen a Megesz nullozza az almát, így utána a WriteLine-ban NullReferenceExceptionnek kellene jönnie, amikor megpróbálunk a színéhez hozzáférni.

De nem feltétlenül. 🙂 És ez akkor szép igazán, amikor nem egy ilyen 3 soros kódban, hanem egy 3000 sorosban fordul elő. 🙂

Egészítsétek ki a Program osztályt úgy (vagyis írjátok meg a Log metódust, meg amit szeretnétek), hogy ne dobjon kivételt a kód, hanem szépen kiírja a 3. sor a színt.

Megkötések – hogy elkerüljük a nyilvánvalót:

– Sem a Megesz, sem a Main metódushoz nem nyúlhattok.

– Azt, hogy a Lognak mit kell csinálnia, nem szabom meg, akár üres is lehet, teljesen rátok bízom. De semmilyen módon nem adhat értéket az alma objektumnak. (Nem trükközünk, nem hívhat olyan metódust sem, ami értéket adna neki stb.)

– Attribútumok, fordítási direktívák használata tilos.

– Az alma definíciójával való trükközés (factory, singleton, akármi) is azonnali diszkvalifikációt von maga után. De lehet, hogy csak kizárást. :]

Válaszokat kommentbe! 🙂 Néhány nap múlva leírom a megoldást is, de szerintem pár perc/óra gondolkodás után kitalálható a dolog.

…és most vissza kódolni.

 

Update: a megoldást kommentben írtam le, így ha valaki előbb megpróbálna önerőből rájönni a megoldásra, egyelőre ne olvassa el a kommenteket!

AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDetect languageDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddishAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddish

English (auto-detected) » English
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDetect languageDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddishAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddish

English (auto-detected) » English
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDetect languageDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddishAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddish

English (auto-detected) » English
Reklámok