Альтернатива перегрузке оператора присваивания - C#

Узнай цену своей работы

Формулировка задачи:

Я знаю, что перегрузка оператора присваивания в C# не возможна. Мне нужно найти альтернативный способ для решения следующей задачи, которая бы легко решалось, если бы перегрузка оператора присваивания была возможна.

В нижеприведенном коде я создаю структуру ObscuredInt, которая предназначена для скрытия от просмотрщиков памяти используемого в ней int-значения с помощью симметричного шифрования. Мне необходимо видоизменить этот код таким образом, чтобы в нем появилась возможность вызова метода RandomizeCryptoKey() ПЕРЕД осуществлением операции присваивания для переменных с типом структуры ObscuredInt. Сейчас мне каждый раз в основном коде тестовой программы приходится вручную вызывать метод RandomizeCryptoKey() на каждом экземпляре переменной типа ObscuredInt.

Подскажите, как нужно видоизменить код для структуры ObscuredInt, чтобы метод RandomizeCryptoKey() вызывался в ней каждый раз перед выполнением операции присваивания для переменной этого типа?

Листинг программы
  1. using System;
  2. namespace SecureMemoryApp
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. ObscuredInt integer = 1;
  9. // Как перенести выполнение приведенного ниже оператора с вызовом метода RandomizeCryptoKey()
  10. // в код структуры ObscuredInt таким образом, чтобы его вызов осуществлялся автоматически перед
  11. // выполнением операции присваивания для идущей следом переменной?
  12. integer.RandomizeCryptoKey();
  13. integer = 2;
  14. Console.ReadKey();
  15. }
  16. public struct ObscuredInt : IEquatable<ObscuredInt>, IFormattable
  17. {
  18. private static int cryptoKey = 444444;
  19. private int currentCryptoKey;
  20. private int hiddenValue;
  21. private bool inited;
  22. private Random random;
  23. private ObscuredInt(int value)
  24. {
  25. currentCryptoKey = cryptoKey;
  26. hiddenValue = value;
  27. inited = true;
  28. random = new Random();
  29. }
  30. public static int Encrypt(int value)
  31. {
  32. return Encrypt(value, 0);
  33. }
  34. public static int Encrypt(int value, int key)
  35. {
  36. if (key == 0)
  37. {
  38. return value ^ cryptoKey;
  39. }
  40. return value ^ key;
  41. }
  42. public static int Decrypt(int value)
  43. {
  44. return Decrypt(value, 0);
  45. }
  46. public static int Decrypt(int value, int key)
  47. {
  48. if (key == 0)
  49. {
  50. return value ^ cryptoKey;
  51. }
  52. return value ^ key;
  53. }
  54. public void ApplyNewCryptoKey()
  55. {
  56. if (currentCryptoKey != cryptoKey)
  57. {
  58. hiddenValue = Encrypt(InternalDecrypt(), cryptoKey);
  59. currentCryptoKey = cryptoKey;
  60. }
  61. }
  62. public void RandomizeCryptoKey()
  63. {
  64. hiddenValue = InternalDecrypt();
  65. do
  66. {
  67. currentCryptoKey = random.Next(int.MinValue, int.MaxValue);
  68. } while (currentCryptoKey == 0);
  69. hiddenValue = Encrypt(hiddenValue, currentCryptoKey);
  70. }
  71. public int GetEncrypted()
  72. {
  73. ApplyNewCryptoKey();
  74. return hiddenValue;
  75. }
  76. public void SetEncrypted(int encrypted)
  77. {
  78. inited = true;
  79. hiddenValue = encrypted;
  80. }
  81. private int InternalDecrypt()
  82. {
  83. if (!inited)
  84. {
  85. currentCryptoKey = cryptoKey;
  86. hiddenValue = Encrypt(0);
  87. inited = true;
  88. }
  89. int decrypted = Decrypt(hiddenValue, currentCryptoKey);
  90. return decrypted;
  91. }
  92. #region operators, overrides, interface implementations
  93. public static implicit operator ObscuredInt(int value)
  94. {
  95. ObscuredInt obscured = new ObscuredInt(Encrypt(value));
  96. return obscured;
  97. }
  98. public static implicit operator int(ObscuredInt value)
  99. {
  100. return value.InternalDecrypt();
  101. }
  102. public static ObscuredInt operator ++(ObscuredInt input)
  103. {
  104. int decrypted = input.InternalDecrypt() + 1;
  105. input.hiddenValue = Encrypt(decrypted, input.currentCryptoKey);
  106. return input;
  107. }
  108. public static ObscuredInt operator --(ObscuredInt input)
  109. {
  110. int decrypted = input.InternalDecrypt() - 1;
  111. input.hiddenValue = Encrypt(decrypted, input.currentCryptoKey);
  112. return input;
  113. }
  114. public override bool Equals(object obj)
  115. {
  116. if (!(obj is ObscuredInt))
  117. return false;
  118. return Equals((ObscuredInt)obj);
  119. }
  120. public bool Equals(ObscuredInt obj)
  121. {
  122. if (currentCryptoKey == obj.currentCryptoKey)
  123. {
  124. return hiddenValue == obj.hiddenValue;
  125. }
  126. return Decrypt(hiddenValue, currentCryptoKey) == Decrypt(obj.hiddenValue, obj.currentCryptoKey);
  127. }
  128. public override int GetHashCode()
  129. {
  130. return InternalDecrypt().GetHashCode();
  131. }
  132. public override string ToString()
  133. {
  134. return InternalDecrypt().ToString();
  135. }
  136. public string ToString(string format)
  137. {
  138. return InternalDecrypt().ToString(format);
  139. }
  140. public string ToString(IFormatProvider provider)
  141. {
  142. return InternalDecrypt().ToString(provider);
  143. }
  144. public string ToString(string format, IFormatProvider provider)
  145. {
  146. return InternalDecrypt().ToString(format, provider);
  147. }
  148. #endregion
  149. }
  150. }
  151. }

Решение задачи: «Альтернатива перегрузке оператора присваивания»

textual
Листинг программы
  1. ObscuredInt integer = new ObscuredInt(1);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы