重构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);
}
}
基于这个问题,似乎所有的代码都在验证变量,并将其与某个临时值进行比较,如果不同,则将临时值分配给变量。
我的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);
}
}
没有对此的支持,至少是直接支持。不能指定类型应为bool
、float
或int
。最接近的方法是使用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);
}
}