本文告诉大家一个特殊的做法,可以修改一个字符串常量
我们来写一个简单的程序,把一个常量字符串输出
private const string str = "lindexi";
static void Main(string[] args)
{
Foo();
Console.WriteLine(str);
}
其中的 Foo 是其他的函数,大家可以猜到输出是 lindexi ,但是,实际上把Foo调用函数添加之后,输出是 Lindexi 被大写了。那么这时 Foo 做了什么?
Foo 做的就是
C# 字符串首字符大写
public static unsafe void Foo()
{
fixed (char* ptr = str)
{
*ptr = char.ToUpper(*ptr);
}
}
虽然出现了问题,但是找到问题很简单,如果这时需要做一个安全有关的。让别人看到源代码也不知道怎么使用,那么就可以使用这个科技,下面就是显示技术的时候
我把 Foo 做一些修改,把 str 变量去掉,这样大家就难以通过搜索变量引用找到了这个函数。但是我在其他的某个地方使用了这个常量字符串,于是就把上面的 str 修改为 "lindexi" 。大家也许会想,这是两个变量,对他做什么修改也不会对之前的 str 有什么影响。实际上,请跑一下下面的代码。
public static unsafe void Foo()
{
fixed (char* ptr = "lindexi")
{
*ptr = char.ToUpper(*ptr);
}
}
这时输出 str 结果是 Lindexi ,因为编译器把相同的常量视为同一个地址,这样修改一个地方的常量就可以修改其他地方的。所以可以写的是一个常量,实际上这个常量在另一个地方被修改。
如果我代码很多,在某个地方使用了反射,反射一个方法,这个方法是修改一个常量的值,常量是写自己写的,没有引用。这时可以发现代码执行就可以更改之前的字符串值。实际上不只字符串,其它的常量也可以修改。多使用这些技术,可以让看代码的人成为强大的杀人狂。
这个方法是不推荐在一般情况使用,因为谁都不能说没有其他地方使用一样的字符串。
欢迎大家访问我搭建的博客 C# 谁改了我的代码 我自己搭建的博客会不断更新
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
使用 Resharper 快速做适配器
如果需要做一个类的重写,需要重新写这个类的所有属性和函数,本文提供一个简单的方法让大家快速重写一个类的所有属性和函数。
在有 Resharper 之后,对一个比较长的类进行重构。例如有这个类
class Foo
{
public string F1 { get; set; }
public void F2()
{
}
}
来写出这个类
class Foo1
{
private Foo _foo;
public Foo1(Foo fooImplementation)
{
_foo = fooImplementation;
}
public string F1
{
get { return _foo.F1; }
set { _foo.F1 = value; }
}
public void F2()
{
_foo.F2();
}
}
难道需要自己全部写一遍?实际上可以使用这个方法来快速写。
使用 ctrl+shift+R 把 Foo 弄出一个接口
可以看到接口
internal interface IFoo
{
string F1 { get; set; }
void F2();
}
写另外的类继承这个接口
class Foo1 : IFoo
{
private IFoo _foo;
public Foo1(IFoo foo)
{
_foo = foo;
}
}
在这个类按 alt+insert 可以看到 Delegating Members ,点击
这样就可以拿到这个类的所有属性和函数
class Foo1 : IFoo
{
public void F2()
{
_foo.F2();
}
private IFoo _foo;
public Foo1(IFoo foo)
{
_foo = foo;
}
public string F1
{
get => _foo.F1;
set => _foo.F1 = value;
}
}
如果需要复制一个类,可以使用 ctrl+shift+R 点击 Copy Type
复制一个类可以复制静态属性、方法,拿到类的接口不能获得静态的属性方法。
同时欢迎大家访问我搭建的博客 使用 Resharper 快速做适配器 我自己搭建的博客会不断更新
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。