当前位置: 首页 > news >正文

C# 谁改了我的代码 使用 Resharper 快速做适配器

C# 谁改了我的代码

 

本文告诉大家一个特殊的做法,可以修改一个字符串常量

我们来写一个简单的程序,把一个常量字符串输出

        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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

 

相关文章:

  • 学不好Linux?我们分析看看正确的学习方法是什么
  • openssl的应用及创建CA
  • 基于zookeeper的高可用Hadoop HA集群安装
  • 归并排序的相关用法
  • 前端js -- this指向总结。
  • 理解Java集合(三)Map : HashMap/SortedMap/TreeMap
  • java io流
  • Heap Dump (heap=dump)
  • 配置Etcd集群和TLS认证
  • 学习最重要是方法,管理最重要是高度
  • git分支管理和工作流规范:不同场景细化和演示
  • JSON返回DateTime/Date('123123123')/解决办法
  • BZOJ 1926 [Sdoi2010]粟粟的书架
  • 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战
  • Confluence 6 使用 LDAP 授权连接一个内部目录 - 高级设置
  • 自己简单写的 事件订阅机制
  • 「译」Node.js Streams 基础
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 2018一半小结一波
  • CSS 专业技巧
  • ECMAScript6(0):ES6简明参考手册
  • exif信息对照
  • Golang-长连接-状态推送
  • If…else
  • JavaScript设计模式与开发实践系列之策略模式
  • Js基础——数据类型之Null和Undefined
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • SpingCloudBus整合RabbitMQ
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • webgl (原生)基础入门指南【一】
  • win10下安装mysql5.7
  • Windows Containers 大冒险: 容器网络
  • 记录:CentOS7.2配置LNMP环境记录
  • 坑!为什么View.startAnimation不起作用?
  • 如何设计一个比特币钱包服务
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 思否第一天
  • 小李飞刀:SQL题目刷起来!
  • 责任链模式的两种实现
  • 阿里云ACE认证之理解CDN技术
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • !!java web学习笔记(一到五)
  • #NOIP 2014# day.2 T2 寻找道路
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ./configure,make,make install的作用
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复