Advertisement
Guest User

Untitled

a guest
Jul 6th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. IComparable F;
  2. F.ToString(); // или любой другой метод object, написал для демонстрации
  3. Console.WriteLine(typeof(IComparable).BaseType) //пустая строка
  4.  
  5. using System;
  6. internal struct Point : IComparable
  7. {
  8. private Int32 m_x, m_y;
  9. // Конструктор, просто инициализирующий поля
  10. public Point(Int32 x, Int32 y)
  11. {
  12. m_x = x;
  13. m_y = y;
  14. }
  15. // Переопределяем метод ToString, унаследованный от System.ValueType
  16. public override String ToString()
  17. {
  18. // Возвращаем Point как строку (вызов ToString предотвращает упаковку)
  19. return String.Format("({0}, {1})", m_x.ToString(), m_y.ToString());
  20. }
  21. // Безопасная в отношении типов реализация метода CompareTo
  22. public Int32 CompareTo(Point other)
  23. {
  24. // Используем теорему Пифагора для определения точки,
  25. // наиболее удаленной от начала координат (0, 0)
  26. return Math.Sign(Math.Sqrt(m_x * m_x + m_y * m_y)
  27. - Math.Sqrt(other.m_x * other.m_x + other.m_y * other.m_y));
  28. }
  29. // Реализация метода CompareTo интерфейса IComparable
  30. public Int32 CompareTo(Object o) {
  31. if (GetType() != o.GetType())
  32. {
  33.  
  34. throw new ArgumentException("o is not a Point");
  35. }
  36.     // Вызов безопасного в отношении типов метода CompareTo
  37. return CompareTo((Point) o);
  38. }
  39. }
  40. public static class Program
  41. {
  42. public static void Main()
  43. {
  44. // Создаем в стеке два экземпляра Point
  45. Point p1 = new Point(10, 10);
  46. Point p2 = new Point(20, 20);
  47. // p1 НЕ пакуется для вызова ToString (виртуальный метод)
  48. Console.WriteLine(p1.ToString()); // "(10, 10)"
  49. // p1 ПАКУЕТСЯ для вызова GetType (невиртуальный метод)
  50. Console.WriteLine(p1.GetType()); // "Point"
  51. // p1 НЕ пакуется для вызова CompareTo
  52. // p2 НЕ пакуется, потому что вызван CompareTo(Point)
  53. Console.WriteLine(p1.CompareTo(p2)); // "-1"
  54. // p1 ПАКУЕТСЯ, а ссылка размещается в c
  55. IComparable c = p1;
  56. Console.WriteLine(c.GetType()); // "Point"
  57. // p1 НЕ пакуется для вызова CompareTo
  58. // Поскольку в CompareTo не передается переменная Point,
  59. // вызывается CompareTo(Object), которому нужна ссылка
  60. // на упакованный Point
  61. // c НЕ пакуется, потому что уже ссылается на упакованный Point
  62. Console.WriteLine(p1.CompareTo(c)); // "0"
  63. // c НЕ пакуется, потому что уже ссылается на упакованный Point
  64. // p2 ПАКУЕТСЯ, потому что вызывается CompareTo(Object)
  65. Console.WriteLine(c.CompareTo(p2));// "-1"
  66. // c пакуется, а поля копируются в p2
  67. p2 = (Point)c;
  68. // Убеждаемся, что поля скопированы в p2
  69. Console.WriteLine(p2.ToString());// "(10, 10)"
  70. }
  71. }
  72.  
  73. Point pt = new Point();
  74. IComparable a = pt;
  75. Point p2 = (Point) a;
  76.  
  77. ldloca.s pt
  78. initobj MyNamespace.Point
  79. ldloc.0
  80. box MyNamespace.Point
  81. stloc.1
  82. ldloc.1
  83. unbox.any MyNamespace.Point
  84. pop
  85. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement