оператор перегрузки = в C #. Как я могу принять другие типы? - PullRequest
2 голосов
/ 23 апреля 2009

Итак, друг рассказывал мне, как игра была взломана и как работала техника. Затем он спросил, как лучше всего предотвратить подобные атаки. Самый простой способ, который я знал, состоял в том, чтобы А) перемешать биты важного значения Б) хэшировать значения и сравнивать их каждый раз (int, который содержит счет или деньги, вероятно, будет проверяться редко).

Затем я попробовал реализацию в C #, я не мог перегрузить оператор =. Как я могу это сделать?

бывший код.

class EncryptVal <T>
{
    T v;
    public T operator = (T v2)
    {
        //shuffle bits
    }
    public T operator ()()
    {
        //return unshuffle bits
    }
}

Ответы [ 6 ]

13 голосов
/ 23 апреля 2009

Вы ищете оператор implicit и explicit, а не говорите =. Это позволяет вам определить, как все будет работать, когда приведение выполняется неявно (т. Е. Просто присваивание) и явно (т. Е. Есть оператор приведения).

public static implicit operator Type1(Type2 p) {}
public static explicit operator Type1(Type2 p) {}
10 голосов
/ 23 апреля 2009

Вы можете инкапсулировать значение в классе и перегружать неявные преобразования в и из класса:

public class EncryptVal<T> {

    private T _value;

    private EncryptVal(T value) {
        _value = value;
    }

    public static implicit operator EncryptVal<T>(T value) {
        //shuffle bits
        return new EncryptVal<T>(value);
    }

    public static implicit operator T(EncryptVal<T> value) {
        //unshuffle bits
        return value._value;
    }

}

Использование:

// implicit conversion from int
EncryptVal<int> e = 42;

// implicit conversion to int
int i = e;
2 голосов
/ 23 апреля 2009

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

Я бы написал это как свойство или как два метода, например:

class EncryptVal <T>
{
    T v;
    public T Value
    {
      get
      {
        //return unshuffle bits
      }
      set
      {
        //shuffle bits
      }
    }
}
2 голосов
/ 23 апреля 2009

Вы не можете перегружать оператор присваивания в C #. Вот документация MSDN .

Вам нужно будет создать собственную функцию для этого поведения.

0 голосов
/ 23 апреля 2009

Я бы пошел для неявной / явной перегрузки операторов для части реализации.

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

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

0 голосов
/ 23 апреля 2009

Не использовать = для установки значения. Вы не можете назначить перегрузку.

Что вы можете сделать, это спрятать его за свойством.

int _encyptedValue;
Public int myInt
{
    get
    {
        return Decrypt(_encryptedValue);
    }
    set
    {
         _encryptedValue = Encrypt(value);
    }
}

Вы можете выбрать расшифровку / шифрование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...