èšèšãã¿ãŒã³ãŸãã¯ãã¿ãŒã³ã¯ãé »ç¹ã«çºçããã³ã³ããã¹ãå
ã®èšèšåé¡ã®è§£æ±ºçã§ããå埩å¯èœãªã¢ãŒããã¯ãã£èšèšã§ãã
ãã®å®çŸ©ãäœååãèããããšãããããã§ã...çšèªãšãã¿ãŒã³ãç¥ãããšã«å ããŠãå®éã®ãããžã§ã¯ãã§ããããã©ã®ããã«äœ¿çšãããŠããããç¥ãããšã¯è峿·±ãã§ãã
ãã®èšäºã§ã¯ã.NETã§äœ¿çšãããæãäžè¬çãªãã¿ãŒã³ã®ããã€ãã«ã€ããŠèª¬æããŸãã ãããã®ããã€ãã¯ã.NETã€ã³ãã©ã¹ãã©ã¯ãã£ã«æ·±ãçµ±åãããŠããŸãããBCLã§åºæ¬ã¯ã©ã¹ãèšèšãããšãã«åçŽã«äœ¿çšããããã®ããããŸãã
1ããŒã¹ä»¥äžã®æ¬ããã¶ã€ã³ãã¿ãŒã³ã«å°å¿µããŠããŸããã1åã®æ¬ãéç«ã£ãŠãããããã¯æåãªæ¬ãã®ã£ã³ã°ãªããã©ãŒãã§ãã ãããã£ãŠãç¶æ³ãããããçè§£ããããã«ããã®æ¬ããç°¡åãªèª¬æãæäŸããŸãã
次ã®6ã€ã®ãã¿ãŒã³ã«ã€ããŠèª¬æããŸãã
- ãªãã¶ãŒããŒ
- ã€ãã¬ãŒã¿;
- ãã³ã¬ãŒã¿;
- ã¢ããã¿ãŒ;
- å·¥å Ž
- æŠç¥ã
ããã§ã¯å§ããŸãããã
ãªãã¶ãŒããŒ
ããããã.NETã§äœ¿çšãããæãæåãªãã¿ãŒã³ã¯ãªãã¶ãŒããŒã§ãã ããã¯ããªã²ãŒãã®åºç€ã§ããããç¥ãããŠããŸããããªã²ãŒãã¯ãåœåãã.NETã®äžå¯æ¬ ãªéšåã§ããã .NETãªããžã§ã¯ãã¢ãã«ãžã®è²¢ç®ã«æè¬ããããšã¯é£ãããããŸãããç¹ã«ãåŸã®ããŒãžã§ã³ïŒã©ã ããã¯ããŒãžã£ãªã©ïŒã§äœãæµãããã®ããèãããšãé£ããããšã§ã¯ãããŸããã
ãã¿ãŒã³ã®ç®çã¯ãGOFã®ãªãã¶ãŒããŒã§ãã1ã€ã®ãªããžã§ã¯ãã®ç¶æ
ãå€åãããšããªããžã§ã¯ãã«äŸåãããã¹ãŠã®ãªããžã§ã¯ãã«éç¥ãããèªåçã«æŽæ°ãããããã«ããªããžã§ã¯ãéã®1
察å€ã®é¢ä¿ãå®çŸ©ããŸãã
CïŒã§ã®ãã®ãã¿ãŒã³ã®æãåçŽãªå®è£
ã¯ã次ã®ããã«ãªããŸãã
åçŽãªãªãã¶ãŒããŒpublic interface IObserver
.NETãã©ãããã©ãŒã ã§è¿°ã¹ãããã«ããªãã¶ãŒããŒã®æœè±¡åã¯ããªã²ãŒãã«ãã£ãŠå®è£
ãããŸãã ããªã²ãŒããšã®ãã䟿å©ãªäœæ¥ã®ããã«ãã€ãã³ãã¯CïŒã§äœ¿çšãããŸãã æ¬¡ã®äŸã§ã¯ããããã䜿çšããŸãã
.NETã®ãªãã¶ãŒã㌠public delegate void MyEventHandler();
é¡ã®èгå¯è
ãã¿ãŒã³ãšã®é¡äŒŒã ã€ãã³ãã¯ãµããžã§ã¯ããšããŠæ©èœããããªã²ãŒãã¯ãªãã¶ãŒããŒãšããŠæ©èœããŸãã
ãæ³šæäžèšã®ã³ãŒãã«ã¯1ã€ã®æ¬ ç¹ããããŸããã©ã ãåŒã䜿çšããå Žåãããªã²ãŒããã€ãŸãã³ãŒããåæããããšã¯ã§ããŸããã
s.MyEvent -= () => Console.WriteLine("Hello habrahabr");
å¥ã®ã€ã³ã¹ã¿ã³ã¹ã§ããããããã®ããªã²ãŒãã¯åé€ãããŸããã ããªã²ãŒããããã«åãé¢ãã«ã¯ãããªã²ãŒãïŒã©ã ãåŒïŒã倿°ã«ä¿åããå¿
èŠããããŸãã
static void Main(string[] args) { Subject s = new Subject(); MyEventHandler myEv1 = () => Console.WriteLine("Hello habarhabr"); MyEventHandler myEv2 = () => Console.WriteLine("Hello world"); s.MyEvent += myEv1; s.MyEvent += myEv2; s.MyEvent -= myEv1; s.RaiseEvent();
.NET 4.0ã§ã¯ããªãã¶ãŒããŒãã¿ãŒã³ãçŽæ¥å®è£
ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå°å
¥ãããŸããã æ¬¡ã®ããã«ãªããŸãã
public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); } public interface IObserver<in T> { void OnCompleted(); void OnError(Exception error); void OnNext(T value); }
ã芧ã®ãšãããIObservableã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã¯ããªãã¶ãŒããŒãšã¯å°ãç°ãªããŸãã ãªãã¶ãŒããŒã远å ããã³åé€ããã¡ãœãããæã€ä»£ããã«ããªãã¶ãŒããŒãç»é²ããã¡ãœããã®ã¿ãæã£ãŠããŸãã ãã®ã¡ãœããã¯ããããã€ããŒãéç¥ã®éä¿¡ã忢ããåã«ããªãã¶ãŒããŒãéç¥ããã€ã§ããã£ã³ã»ã«ã§ããããã«ããIDisposableå®è£
ãè¿ããŸãã ããã§ãã©ã ãåŒã䜿çšããDisposeã¡ãœãããåŒã³åºããŠã©ã ãåŒãåæã§ããŸãã
ãæ³šæã€ãã¬ãŒã¿
.NETã§ã®äœ¿çšãããã»ã©äžè¬çã§ã¯ãªã次ã®ãã¿ãŒã³ã¯ãã€ãã¬ãŒã¿ã§ãã
GOFã®å埩åãã¿ãŒã³ã®ç®çïŒå
éšè¡šçŸãæããããšãªããè€åãªããžã§ã¯ãã®ãã¹ãŠã®èŠçŽ ã«é 次ã¢ã¯ã»ã¹ããæ¹æ³ãæäŸããŸãã
.NETãã©ãããã©ãŒã ã§ã¯ãIEnumerableãšIEnumeratorã®2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãã€ãã¬ãŒã¿ãã¿ãŒã³ã®å®è£
ãæ
åœããŸãã
public interface IEnumerable { IEnumerator GetEnumerator(); } public interface IEnumerator { object Current { get; } bool MoveNext(); void Reset(); }
ããã³ãããã®äžè¬åãããé¡äŒŒäœïŒ
public interface IEnumerable<out T> : IEnumerable { IEnumerator<T> GetEnumerator(); } public interface IEnumerator<out T> : IDisposable, IEnumerator { T Current { get; } }
foreachã«ãŒãã䜿çšããŠãšã³ãã£ãã£ãå埩åŠçã§ããããã«ããã«ã¯ãIEnumerable <>ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã€ãã¬ãŒã¿èªäœïŒIEnumerator <>ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã¯ã©ã¹/æ§é äœïŒãäœæããå¿
èŠããããŸãã
yieldããŒã¯ãŒãã䜿çšããŠCïŒ2.0ã§ã€ãã¬ãŒã¿ãããã¯ãåºçŸããããšãèæ
®ãããšãIEnumerator <>ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã«ã¹ã¿ã ã¿ã€ãã®äœæã¯ã»ãšãã©è¡ãããŸããïŒã³ã³ãã€ã©ããããè¡ããŸãïŒã
foreachã«ãŒãã¯ãã€ãã¬ãŒã¿ãŒãã¿ãŒã³ãšäžŠãã§æ©èœããŸãã æ¬¡ã®ã³ãŒã
foreach (var item in Enumerable.Range(0, 10)) { Console.WriteLine(item); }
ããã¯ã³ãŒãã®æ§æç³è¡£ã§ãïŒ
IEnumerator<int> enumerator = Enumerable.Range(0, 10).GetEnumerator(); try { while (enumerator.MoveNext()) { int item = enumerator.Current; Console.WriteLine(item); } } finally { if (enumerator != null) { enumerator.Dispose(); } }
ãããã£ãŠãã€ãã¬ãŒã¿ãã¿ãŒã³ã¯ãèšèªæ§æïŒforeachïŒã䜿çšãããããCïŒèšèªã®åºç€ãšãªããŸãã
ãæ³šæforeachã«ãŒãã¯ãå埩å¯èœãªãšã³ãã£ãã£ãIEnumerableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããšãå®éã«å¿
èŠãšããªããšããäºå®ïŒãã ããç¹å®ã®ã·ã°ããã£ãæã€ç¹å®ã®ã¡ãœããã®ååšã®ã¿ãå¿
èŠãšããïŒã¯å€ãã®äººã«ãã£ãŠæžãããŠããã®ã§ã説æããŸããã Sergey Teplyakov
SergeyTã«ã¯ãforeachãµã€ã¯ã«ã®äœæ¥ã«ç¹åããåªãã
æçš¿ããããŸãã
foreachã«ãŒãã«é¢ããŠã.NETã«ã¯ããã€ãã®æé©åããããŸãã ã€ãã¬ãŒã¿ãªããžã§ã¯ãã¯åå埩ã§äœæããããããç¹ã«è€æ°ã®foreachã«ãŒããããå Žåãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãããããã£ãŠãé
åãšæååïŒCLRã«æ·±ãçµ±åãããåïŒãå埩ãããšãforeachã«ãŒãã¯éåžžã®forã«ãŒãã«å±éãããŸãã
ãæ³šæãã³ã¬ãŒã¿
ãã¿ãŒã³No. 3-ãªããžã§ã¯ãã®ãã³ã¬ãŒã¿ãŒã
GOFã®ãã¿ãŒã³ãã³ã¬ãŒã¿ã®ç®çïŒãªããžã§ã¯ãã«æ°ãã責任ãåçã«è¿œå ããŸãã æ©èœãæ¡åŒµããããã®ãµãã¯ã©ã¹åã®æè»ãªä»£æ¿ææ®µã§ãã
.NETã®ãã³ã¬ãŒã¿ã¯ãSystem.IO.Streamã¯ã©ã¹ãšãã®åå«ã«ãã£ãŠè¡šãããŸãã æ¬¡ã®ã³ãŒããæ€èšããŠãã ããã
public static void WriteBytes(Stream stream) { int oneByte; while ((oneByte = stream.ReadByte()) >= 0) { Console.WriteLine(oneByte); } } static void Main(string[] args) { var memStream = new MemoryStream(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); WriteBytes(memStream); var buffStream = new BufferedStream(memStream); WriteBytes(buffStream); Console.ReadLine(); }
WriteBytesã¡ãœããã¯ã©ã®ã¹ããªãŒã ã§ãæ©èœããŸãããåžžã«ãããå¹ççã«è¡ããšã¯éããŸããã ãã£ã¹ã¯ãã1ãã€ããèªã¿åãããšã¯ããŸãè¯ããªãã®ã§ãBufferedStreamã¯ã©ã¹ã䜿çšã§ããŸãããã®ã¯ã©ã¹ã¯ãããŒã¿ããããã¯åäœã§èªã¿åããããã«ããããè¿ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®BufferedStreamã¯ã©ã¹ã¯ãStreamã¿ã€ãïŒä»»æã®ã¹ããªãŒã ïŒãåãå
¥ããããã«ãããããå¹ççãªã·ã§ã«ã§ãããã©ããïŒè£
食ïŒããŸãã BufferedStreamã¯ãReadãWriteãªã©ã®Streamã¯ã©ã¹ã®åºæ¬ã¡ãœãããåå®çŸ©ããŠãããå€ãã®æ©èœãæäŸããŸãã
System.Security.Cryptography.CryptoStreamã¯ã©ã¹ã䜿çšãããšããªã³ã¶ãã©ã€ã§ã¹ããªãŒã ãæå·åããã³åŸ©å·åã§ããŸãã ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒã§Streamåã®ãã©ã¡ãŒã¿ãŒãåãå
¥ããã·ã§ã«ã§ãããã©ããããŸãã

ã©ã®ã¹ããªãŒã ã§ããããŒã¿ã¢ã¯ã»ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã倿Žããã«BufferedStreamã§å²ãããšã«ãããå¹ççã«èªã¿åãæ©èœã远å ã§ããŸãã æ©èœãç¶æ¿ããã®ã§ã¯ãªãããè£
食ãããã ããªã®ã§ãç¶æ¿ã䜿çšããå Žåã®ããã«ãã³ã³ãã€ã«æã§ã¯ãªãå®è¡æã«å®è¡ã§ããŸãã
ã¢ããã¿ãŒ
GOFã®ã¢ããã¿ãŒãã¿ãŒã³ã®ç®çïŒ 1ã€ã®ã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ããã¯ã©ã€ã¢ã³ããæåŸ
ããå¥ã®ã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«å€æããŸãã ãã®ã¢ããã¿ãŒã«ãããã¯ã©ã¹ã¯äºææ§ã®ãªãã€ã³ã¿ãŒãã§ãŒã¹ã§åäœã§ããŸãããããããªããã°ã€ã³ã¿ãŒãã§ãŒã¹ã¯æ©èœããŸããã§ããã
COMãš.NETã®å
éšã¢ãŒããã¯ãã£ã¯ç°ãªããŸãã ãããã£ãŠã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«é©åãããå¿
èŠããããŸãã CLRã¯ãã·ã§ã«ãšåŒã°ããã©ã³ã¿ã€ã ïŒRCWïŒãšåŒã°ããäžéäœãä»ããŠCOMãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
ã©ã³ã¿ã€ã ã¯ããã®ãªããžã§ã¯ããžã®æ¢åã®åç
§ã®æ°ã«é¢ä¿ãªããCOMãªããžã§ã¯ãããšã«1ã€ã®ã©ã³ã¿ã€ã ã©ãããŒãäœæããŸãã

ä»ã®æäœã®äžã§ããã·ã§ã«ãšåŒã°ããã©ã³ã¿ã€ã ã¯ãã·ã§ã«ã«ã©ããããããªããžã§ã¯ãã«ä»£ãã£ãŠããããŒãžã³ãŒããšã¢ã³ãããŒãžã³ãŒãã®éã§ããŒã¿ãããŒã·ã£ãªã³ã°ããŸãã ç¹ã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§äº€æãããããŒã¿ãç°ãªãæ¹æ³ã§æç€ºãããå ŽåãåŒã³åºãããã©ã³ã¿ã€ã ã·ã§ã«ã¯åŒæ°ãããŒã·ã£ãªã³ã°ããã¡ãœããã®å€ãè¿ããŸãã
ããšãã°ã.NETã¯ã©ã€ã¢ã³ããåŒæ°ã®äžéšãšããŠã¢ã³ãããŒãžãªããžã§ã¯ãã«Stringãæž¡ããšãã·ã§ã«ã¯ãã®æååãBSTRïŒ.NETã§æååã®æ©èœã説æãã
æçš¿ïŒã«å€æããŸãã COMãªããžã§ã¯ãã管ç察象ã®åŒã³åºãå
ã«BSTRããŒã¿ãè¿ãå ŽåãåŒã³åºãå
ã¯æååããŒã¿ãåãåããŸãã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ããããããããæ¹æ³ã§ããŒã¿ãéåä¿¡ããŸãã
å®éãRCWã¯ãããã€ã³ã¿ãŒãã§ãŒã¹ãå¥ã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å€æããã¢ããã¿ãŒã§ãã
å·¥å Ž
5çªç®ã®ãã¿ãŒã³ã¯äžçš®ã®å·¥å Žã§ãã
GOFã®ãã¡ã¯ããªãã¿ãŒã³ã®ç®çïŒç¹å®ã®ã¯ã©ã¹ãæå®ããã«çžäºæ¥ç¶ãŸãã¯çžäºäŸåãªããžã§ã¯ãã®ãã¡ããªãäœæããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
System.Convertã¯ã©ã¹ã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãæç€ºçã«åŒã³åºããã«ãªããžã§ã¯ããäœæã§ããéçã¡ãœããã®ã»ãããå«ãŸããŠããããã¡ã¯ããªãŒãšããŠæ©èœããŸãã ããšãã°ãæŽæ°ãè«çå€ã«å€æããã«ã¯ãæŽæ°ãåŒã³åºããŠConvert.ToBooleanã¡ãœããã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšãã§ããŸãã ãã®ã¡ãœããã®æ»ãå€ã¯ãæ°å€ããŒã以å€ã®å Žåã¯trueããã以å€ã®å Žåã¯falseã«ãªããŸãã ä»ã®åå€ææ¹æ³ãåæ§ã«æ©èœããŸãã
ãªããžã§ã¯ãã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ãã®ãããªæŠç¥ã¯ããã¡ã¯ããªãã¿ãŒã³ãšããŠç¥ãããŠããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããã«ããã¡ã¯ããªã«ç®çã®ãªããžã§ã¯ããäœæããããã«äŸé Œã§ããŸãã ãããã£ãŠãFactoryãã¿ãŒã³ã¯ããªããžã§ã¯ãäœæã®è€éããé ãããšãã§ããŸãã ãªããžã§ã¯ãäœæã®è©³çްã倿Žããå Žåã¯ããã¡ã¯ããªãŒèªäœã倿Žããã ãã§ãããã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããã³ãŒãå
ã®ãã¹ãŠã®å Žæã倿Žããå¿
èŠã¯ãããŸããã
åæ
å ±ãšçµã¿åããã
Activator.CreateInstanceã¡ãœããã¯ãæœè±¡ã¯ã©ã¹ãã¡ã¯ããªãå®è£
ããŸãã ä»»æã®ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ãããã®ã
æŠç¥
ãã¿ãŒã³ã®ç®çã¯ãGOFã®æŠç¥ã§ããã¢ã«ãŽãªãºã ã®ãã¡ããªãŒãå®çŸ©ãããããããã«ãã»ã«åããŠã亀æå¯èœã«ããŸãã ãã®æŠç¥ã«ãããã¢ã«ãŽãªãºã ã䜿çšãã顧客ã«é¢ä¿ãªãã¢ã«ãŽãªãºã ã倿Žã§ããŸãã
ãã®åçŽãªãã¿ãŒã³ãé©çšããè¯ãäŸã¯ãé
åã®ãœãŒãã§ãã Array.Sortã¡ãœããã®ãªãŒããŒããŒãã®1ã€ã¯ãIComparableåã®ãã©ã¡ãŒã¿ãŒãåããŸãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãäºãã«ç¬ç«ããŠãããç°¡åã«äº€æã§ãããããããæŠç¥çšã®äžé£ã®ãœãŒãã¢ã«ãŽãªãºã ãäœæã§ããŸãã
public interface IComparable<T> { int CompareTo(T other); }
äžŠã¹æ¿ãã³ãŒãã¯ãèŠçŽ æ¯èŒã¢ã«ãŽãªãºã ãšã¯å®è³ªçã«ç¬ç«ããŠããã倿Žãããªãå ŽåããããŸãã
ããã«ã¯ãIComparableã€ã³ã¿ãŒãã§ã€ã¹ãåãå
¥ããArray.BinarySearchã¡ãœãããšãPredicateããªã²ãŒããåãå
¥ããArray.Findã¡ãœãããå«ãŸããŸãã ãããã£ãŠãããŸããŸãªããªã²ãŒãïŒæŠç¥ïŒã倿Žããããšã§ãã¡ãœããã®åäœã倿Žããå¿
èŠãªçµæãååŸã§ããŸãã
äžè¬çã«ãæŠç¥ãã¿ãŒã³ã¯åžžã«äœ¿çšãããŸãã ãã®èšäºãæžãåã«ãç°ãªãã³ã³ãã¬ãŒã¿ãŒã§é
åãäžŠã¹æ¿ãããšãã«æŠç¥ãã¿ãŒã³ã䜿çšããããšãèããŠããŸããã§ããã
ãããã«
.NET Frameworkã§äœ¿çšãããŠãããã¿ãŒã³ã®ããã€ããèŠãŠããã®ã§ãäœæ¥äžã®ã³ãŒãã§ããããèªèããããããå¿
èŠããããšæããŸãã CïŒèšèªãš.NETã€ã³ãã©ã¹ãã©ã¯ãã£å
šè¬ãžã®ã€ãã³ããšã€ãã¬ãŒã¿ã®è²¢ç®ãé«ãè©äŸ¡ããªãããšã¯é£ããã®ã§ããããå€å
žçãªãã¶ã€ã³ãã¿ãŒã³ã®å®è£
ã§ããããšãç¥ãããšã¯åã«å¿
èŠã§ãã
èªãã§ãããŠããããšãã ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã