重构C#代码

本文关键字:代码 重构 | 更新日期: 2023-09-27 17:57:58

我是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);
        }
    }

重构C#代码

基于这个问题,似乎所有的代码都在验证变量,并将其与某个临时值进行比较,如果不同,则将临时值分配给变量。

我的commonlib中有一个helper类,它有一个函数,该函数将验证传递值的正确类型,并将所需类型的值或所需类型默认值返回给调用者。

因此,您可以将其添加到项目中,并使用类似的调用

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

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);
            }
        }
 }
}

使用泛型类型怎么样?

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

没有对此的支持,至少是直接支持。不能指定类型应为boolfloatint。最接近的方法是使用struct约束,然后执行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);     
   }
}

C#具有出色的泛型类型。您可以使用此方法在单个方法中执行操作。

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

您可以使用泛型类型,但是您需要末尾的"where T:class"来获得要编译的比较,因为类型T不一定是引用类型。。。

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