2014-04-11 121 views
0

我是C#的新手,但我來自C++背景。重構C#代碼

這三個函數是否可以重構爲帶模板的單個函數? 請注意,這三個函數不在通用類中。

private void CheckValue(bool temp, ref bool variable) 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 

    private void CheckValue(float temp, ref float variable) 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 

    private void CheckValue(int temp, ref int variable) 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 
+0

難道是不是* *無效,有人提供了兩種類型相似這三種類型之一? – Servy

+0

@Servy它只是一個Unity對象。 – Andre

+0

另請注意C#沒有模板。它有不同的泛型。 – Servy

回答

0

基於這個問題,似乎所有的代碼做的是驗證變量,並將它與一些暫時的價值,如果它是不同的分配臨時的變量。

我在我的commonlib中有一個助手類,它有一個函數將驗證傳遞的值的正確類型,並返回所需類型的值或將所需類型的默認值返回給調用者。

所以,你可以參照如下內容加入到該項目,並使用調用諸如:

var variable = Helper.Validate<put your type here>(temp); 

OR

var tmp = Helper.Validate<put your type here>(temp); 
var variable = !variable.Equal(tmp) ? tmp : variable 
EditorUtility.SetDirty(target); 


using System.ComponentModel; 
namespace CommonLib.Helpers 
{ 
public static partial class Helper 
{ 
    public static T Validate<T>(object param) 
    { 
     return TryParse<T>(param); 
    } 

     private static T TryParse<T>(object inValue) 
     { 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 

      try 
      { 
       return (T)converter.ConvertFromString(inValue.ToString().Trim()); 
      } 
      catch 
      { 
       return default(T); 
      } 
     } 
} 
} 
0

如何使用泛型?

private void CheckValue<T>(T temp, ref T variable) 
{ 
    if (temp != variable) 
    { 
     variable = temp; 
     EditorUtility.SetDirty(target); 
    } 
} 
+0

現在可以使用多於這三種類型來調用該方法。這可能無效。 – Servy

+0

@AmmarCSE這個類不是一個泛型類,它只是一個普通的類,它具有這三個函數。 – Andre

+2

另外,不能對泛型類型使用'!='運算符。可能必須用'if(!EqualityComparer .Default.Equals(temp,variable))' –

-2

您可以使用泛型類型,但是你需要的「其中T:類」末,以獲得比較編譯,因爲類型T不一定是引用類型...

private static void CheckValue<T>(T temp, ref T variable) where T : class 
    { 
     if (temp != variable) 
     { 
      variable = temp; 
      EditorUtility.SetDirty(target); 
     } 
    } 
+1

由於類限制,現在這三種類型的任何一種都可以用於此方法。 – Servy

+0

啊 - 好點。 – randeroo

0

沒有針對此不支持,至少directly.You 不能指定類型應該是boolfloatint可以使用struct約束做.The最近的事情然後執行type-check,如果該類型不是其中之一受支持的類型會引發異常。

下面是一個例子:

private static void CheckValue<T>(T temp, T variable) where T : struct 
{ 
    if (!new[] {typeof (bool), typeof (float), typeof (int)}.Contains(typeof (T))) 
    { 
      // invalid type 
    } 
    if (temp.Equals(variable)) 
    { 
     EditorUtility.SetDirty(target);  
    } 
} 
+0

當然,你現在已經失去了所有編譯時的類型安全性,所以你最好使用OP的代碼。 – Servy

+0

@Servy是的,如果我們可以指定一個約束,比如'where T:int,float,bool': –