[英]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
}
}
你正在寻找implicit
和explicit
运算符,而不是说=
。 这允许您定义在隐式(即,仅仅是赋值)和显式(即,有一个转换运算符)时强制转换的方式。
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.