ãã®å®çŸ©ãäœååãèããããšãããããã§ã...çšèªãšãã¿ãŒã³ãç¥ãããšã«å ããŠãå®éã®ãããžã§ã¯ãã§ããããã©ã®ããã«äœ¿çšãããŠããããç¥ãããšã¯èå³æ·±ãã§ãã
ãã®èšäºã§ã¯ã.NETã§äœ¿çšãããæãäžè¬çãªãã¿ãŒã³ã®ããã€ãã«ã€ããŠèª¬æããŸãã ãããã®ããã€ãã¯ã.NETã€ã³ãã©ã¹ãã©ã¯ãã£ã«æ·±ãçµ±åãããŠããŸãããBCLã§åºæ¬ã¯ã©ã¹ãèšèšãããšãã«åçŽã«äœ¿çšããããã®ããããŸãã
1ããŒã¹ä»¥äžã®æ¬ããã¶ã€ã³ãã¿ãŒã³ã«å°å¿µããŠããŸããã1åã®æ¬ãéç«ã£ãŠãããããã¯æåãªæ¬ãã®ã£ã³ã°ãªããã©ãŒãã§ãã ãããã£ãŠãç¶æ³ãããããç解ããããã«ããã®æ¬ããç°¡åãªèª¬æãæäŸããŸãã
次ã®6ã€ã®ãã¿ãŒã³ã«ã€ããŠèª¬æããŸãã
- ãªãã¶ãŒããŒ
- ã€ãã¬ãŒã¿;
- ãã³ã¬ãŒã¿;
- ã¢ããã¿ãŒ;
- å·¥å Ž
- æŠç¥ã
ããã§ã¯å§ããŸãããã
ãªãã¶ãŒããŒ
ããããã.NETã§äœ¿çšãããæãæåãªãã¿ãŒã³ã¯ãªãã¶ãŒããŒã§ãã ããã¯ããªã²ãŒãã®åºç€ã§ããããç¥ãããŠããŸããããªã²ãŒãã¯ãåœåãã.NETã®äžå¯æ¬ ãªéšåã§ããã .NETãªããžã§ã¯ãã¢ãã«ãžã®è²¢ç®ã«æè¬ããããšã¯é£ãããããŸãããç¹ã«ãåŸã®ããŒãžã§ã³ïŒã©ã ããã¯ããŒãžã£ãªã©ïŒã§äœãæµãããã®ããèãããšãé£ããããšã§ã¯ãããŸããã
ãã¿ãŒã³ã®ç®çã¯ãGOFã®ãªãã¶ãŒããŒã§ãã1ã€ã®ãªããžã§ã¯ãã®ç¶æ ãå€åãããšããªããžã§ã¯ãã«äŸåãããã¹ãŠã®ãªããžã§ã¯ãã«éç¥ãããèªåçã«æŽæ°ãããããã«ããªããžã§ã¯ãéã®1 察å€ã®é¢ä¿ãå®çŸ©ããŸãã
CïŒã§ã®ãã®ãã¿ãŒã³ã®æãåçŽãªå®è£ ã¯ã次ã®ããã«ãªããŸãã
åçŽãªãªãã¶ãŒããŒ
public interface IObserver // { void Notify(); } public abstract class Subject // { private List<IObserver> observers = new List<IObserver>(); public void Add(IObserver o) { observers.Add(o); } public void Remove(IObserver o) { observers.Remove(o); } public void Notify() // { foreach (IObserver o in observers) o.Notify(); } }
.NETãã©ãããã©ãŒã ã§è¿°ã¹ãããã«ããªãã¶ãŒããŒã®æœè±¡åã¯ããªã²ãŒãã«ãã£ãŠå®è£ ãããŸãã ããªã²ãŒããšã®ãã䟿å©ãªäœæ¥ã®ããã«ãã€ãã³ãã¯CïŒã§äœ¿çšãããŸãã 次ã®äŸã§ã¯ããããã䜿çšããŸãã
.NETã®ãªãã¶ãŒããŒ
public delegate void MyEventHandler(); // public class Subject { public Subject() { } public MyEventHandler MyEvent; // public void RaiseEvent() // { MyEventHandler ev = MyEvent; if (ev != null) ev(); } } static void Main(string[] args) { Subject s = new Subject(); s.MyEvent += () => Console.WriteLine("Hello habrahabr"); // s.MyEvent += () => Console.WriteLine("Hello world"); // s.RaiseEvent(); // Console.ReadKey(); }
é¡ã®èŠ³å¯è ãã¿ãŒã³ãšã®é¡äŒŒã ã€ãã³ãã¯ãµããžã§ã¯ããšããŠæ©èœããããªã²ãŒãã¯ãªãã¶ãŒããŒãšããŠæ©èœããŸãã
ã泚æ
äžèšã®ã³ãŒãã«ã¯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(); // Console.ReadKey(); }
.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ã€ã³ãã©ã¹ãã©ã¯ãã£å šè¬ãžã®ã€ãã³ããšã€ãã¬ãŒã¿ã®è²¢ç®ãé«ãè©äŸ¡ããªãããšã¯é£ããã®ã§ããããå€å žçãªãã¶ã€ã³ãã¿ãŒã³ã®å®è£ ã§ããããšãç¥ãããšã¯åã«å¿ èŠã§ãã
èªãã§ãããŠããããšãã ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã