繁体   English   中英

重载operator =在C#中。 我怎么能接受其他类型?

[英]overload operator = in C#. How can i accept other types?

所以一位朋友告诉我游戏是如何被黑客入侵的,以及该技术是如何运作的。 然后他问最新的防止这种攻击的方法。 我知道的最直接的方式是A)洗牌重要值的比特B)散列值并每次比较它们(保持得分或金钱的int很可能很少被检查)。

然后我尝试在C#中实现,我无法重载=运算符。 我怎样才能做到这一点?

前代码。

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

你正在寻找implicitexplicit运算符,而不是说= 这允许您定义在隐式(即,仅仅是赋值)和显式(即,有一个转换运算符)时强制转换的方式。

public static implicit operator Type1(Type2 p) {}
public static explicit operator Type1(Type2 p) {}

您可以将值封装在类中,并重载与类之间的隐式转换:

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;

不允许在C#中重载赋值运算符。 这是关于它的MSDN文档

您必须为此行为创建自己的函数。

我假设您来自C ++,其中编写像原始数据类型一样使用的类是很常见的。 在C#中,您可以更明确地执行操作。

我会把它写成属性或两种方法,例如:

class EncryptVal <T>
{
    T v;
    public T Value
    {
      get
      {
        //return unshuffle bits
      }
      set
      {
        //shuffle bits
      }
    }
}

不要使用=来设置值。 你不能超载任务。

你能做的就是把它隐藏在一个房产后面。

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

你可以选择解密/加密

我会为实现部分进行隐式/显式运算符重载。

可能是明确的,因为您的转换会进行大量处理,并且最终可能会失败。

我只想补充说,洗牌位似乎只是一种混淆技术,如果你对你的游戏感兴趣,那肯定会持续很长时间。 您可能需要更强大的加密来保护您的数据,但需要更多的上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM