1. 程式人生 > >C# 誰改了我的代碼 使用 Resharper 快速做適配器

C# 誰改了我的代碼 使用 Resharper 快速做適配器

params 比較 lin nbsp UNC nal set return 程序

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

我們來寫一個簡單的程序,把一個常量字符串輸出

        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 ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請與我聯系。

C# 誰改了我的代碼 使用 Resharper 快速做適配器