2013年4月20日

JetBrain Resharper 7 工具介紹

Resharper  7 是Visual Studio DEV受歡迎的Plug-in,這是一套提高程式撰寫生產力和品質的工具,支援C#,XAML,XML,ASP.NET,ASP,NET MVC,可以幫助進行程式分析和給建議重構語法,快速介紹可看一下線上介紹。因為功能還蠻強的,所以電腦的CPU,RAM不能太差,我目前的NB是i7 M 系列CPU,RAM有8G,OS為Win 7 64 Ultimate,跑起來還順。
如果使用VS 2012的朋友或許會疑問,VS 2012不是已經有即時分析程式錯誤和建議的功能?這邊有個比較表可參考看看。

安裝說明

  1. 下載:請至Resharper下載URL下載
  2. 安裝;下載後直接執行MSI檔,安裝程式會詢問要安裝在哪些Visual studio ,點"I Have read and ..",點Install就可以開始裝了。
    image
  3. 安裝中畫面
    image
  4. 安裝完成,在VS2012上面功能選項可以看到Resharp
    image

基本操作說明

改善程式碼:
安裝完Resharper後在程式碼檢視器右邊會有幾個顏色的bar,點那些bar就會跳到對應程式碼,在旁邊有個燈泡,點下去就會有建議:
image
紅色:明顯錯誤,這邊比VS 2012好的是可以批次修正
橘色:執行階段才會發生的錯誤,像有使用LINQ並使用了IEnumerable, IEnumerable
在 System.Collection.Generic命名空間有,System.Linq命名空間也有,應該要Using System.Linq才對
土色:去除不需要的code,沒用的using, 變數..
綠色:建議的較好寫法
都修正完,會有一個綠色方框在右邊Scroll bar頂端
image

重構

另外Resharper還有比Visual studio更強的Refactor功能,可先看Refactoring這本書後,再來使用比較有感覺。
image
這邊舉一個例子,因為閱讀性要更改變數名稱,Resharp可以自動找到相關的變數,自動改變名稱,這可以大大減少人工錯誤。操作說明:
點兩下變數->Ctrl+Shift+R->就會出現Refactor視窗,選Rename進行更名
image
出現對話框,輸入要改成的名稱
image

增加生產力

以下說明一個快速產生程式的例子:
  • 我們新增一個console專案,新增一個項目"程式碼檔": test.cs,裡面是一片空白
  • 接者我們輸入
    using system;
    • 打n, 帶出namespace ,輸入resharpDemo
      using System;
      
      namespace resharpDemo
      {
          
      
      }

            
  • 接者打c,看到class,enter, 修改名稱為Program

       
    image

         
  • 然後Home, p, 選public, enter

       
    using System;
    
    namespace resharpDemo
    {
        public class Program
        {
             
        }
    
    }

        
    • Program裡打sv,選svm, enter

           
      using System;
      
      namespace resharpDemo
      {
          public class Program    
          {
              static void Main(string[] args)
              {
                  
              }
          }
      
      }

         
    • Main裡輸入
           
      var p = new Person();

      p.Name = "Anderson";
           
      p.age = 12;
      • 點Person,alt+ENTER打開燈泡,選Create class ‘Person’
           
               
        image      
         
    • 會自動建立Person類別
           
           
      using System;
      
      namespace resharpDemo
      {
          public class Program    
          {
              static void Main(string[] args)
              {
                  var p = new Person();
                  p.Name = "Anderson";
                  p.age = 12;
              }
          }
      
          internal class Person
          {
          }
      }

         
    • 接者點Name,alt+enter,選Create property ‘Name’, enter
           
      image
              
    • 會在Class裡產生Property,別急著離開,上面有提示,接著按TAB,可以選Auto Property,只有Get/set的型式
                 
      image


           
          internal class Person
          {
              public string Name { get; set; }
      
              public int age { get; set; }
          }

         
    • 過來要自動產生建構子(Consructor),點類別Person,ALT+Ins , 帶出 Generate選單,選 Consructor
           
      image
          
    • 對話框,全選,Finish
       
            image
           
          internal class Person
          {
              public Person(string name, int age)
              {
                  Name = name;
                  this.age = age;
              }
      
              public string Name { get; set; }
      
              public int age { get; set; }
          }

           
    • 再數次對Person,ALT+ENTER, 把equality member/Equality comparer/Formating member都執行過一次,就形成一個複雜的類別
            
           
        internal class Person : IEquatable<Person>
          {
              private sealed class AgeNameEqualityComparer : IEqualityComparer<Person>
              {
                  public bool Equals(Person x, Person y)
                  {
                      if (ReferenceEquals(x, y)) return true;
                      if (ReferenceEquals(x, null)) return false;
                      if (ReferenceEquals(y, null)) return false;
                      if (x.GetType() != y.GetType()) return false;
                      return x.age == y.age && string.Equals(x.Name, y.Name);
                  }
      
                  public int GetHashCode(Person obj)
                  {
                      unchecked
                      {
                          return (obj.age*397) ^ (obj.Name != null ?
       obj.Name.GetHashCode() : 0);
                      }
                  }
              }
      
              private static readonly IEqualityComparer<Person> AgeNameComparerInstance
       = new AgeNameEqualityComparer();
      
              public static IEqualityComparer<Person> AgeNameComparer
              {
                  get { return AgeNameComparerInstance; }
              }
      
              public bool Equals(Person other)
              {
                  if (ReferenceEquals(null, other)) return false;
                  if (ReferenceEquals(this, other)) return true;
                  return age == other.age && string.Equals(Name, other.Name);
              }
      
              public override bool Equals(object obj)
              {
                  if (ReferenceEquals(null, obj)) return false;
                  if (ReferenceEquals(this, obj)) return true;
                  if (obj.GetType() != this.GetType()) return false;
                  return Equals((Person) obj);
              }
      
              public override int GetHashCode()
              {
                  unchecked
                  {
                      return (age*397) ^ (Name != null ? Name.GetHashCode() : 0);
                  }
              }
      
              public static bool operator ==(Person left, Person right)
              {
                  return Equals(left, right);
              }
      
              public static bool operator !=(Person left, Person right)
              {
                  return !Equals(left, right);
              }
      
              public Person(string name, int age)
              {
                  Name = name;
                  this.age = age;
              }
      
              public string Name { get; set; }
      
              public int age { get; set; }
      
              public override string ToString()
              {
                  return string.Format("Name: {0}", Name);
              }
          }
    •    
    • 接者點Person類別,ALT+ENTER,選Create derived type

      image

    •    
    • 產生Employee類別後,增加變數typ型態為EmplyeeType,因為EmplyeeType不存在,為其建class

      image

    •    
    • 選Enum, 增加參數: PartTime, FullTime
                 
      image
    •    
    • 點Employee,ALT+ENTER,點選Construtor,將type Em

      image

    •    
    • 產生後的 Code
           
           
          class Employee : Person
          {
              public Employee(string name, int age, EmplyeeType type) : base(name, age)
              {
                  this.type = type;
              }
      
              public EmplyeeType type { get; set; }
      
          }
      
          internal enum EmplyeeType
          {
              PartTime,
              FullTime
          }

       

常用的快速鍵


主要:

  1. Alt+ENTER: 點某東東,打開建議選單
  2.  
  3. ALT+Ins:產生Code
  4.  
  5. Ctrl-Shift-Space Smart Code Complete
導覽:

  1. Ctrl-N Goto Type (same)
  2.  
  3. Ctrl-F12 Goto file member (Alt-\ in VS bindings)
  4.  
  5. Ctrl-U Goto Base (Alt-Home in VS bindings)
  6.  
  7. Ctrl-Alt-B Goto Inheritor

Refactoring 重構:


  1. Ctrl-Shift-R Refactor 所點的東西! 
  2.  
  3. F2 Rename (Ctrl-R R)
  4.  
  5. Ctrl-F6 Change Signature
  6.  
  7. Extract Interface/Extract Baseclass via Ctrl-shift-R

文件說明/格式::

  1. Ctrl-P Parameter Information
  2.  
  3. Ctrl-f Reformat Cod

參考


  1. 線上手冊
  2.  
  3. Blog event: The 31 Days of ReSharper
  4.  
  5. Support

1 則留言:

  1. Crtl+D可以直接複製游標那行到底下新建一行複製的內容,
    也可以反白一個段落按Crtl+D可以直接複製貼上那個段落

    回覆刪除