C# 将对象类型数据转换为值类型的最佳方法
我的任务是创建使用data reader从数据库获取数据的代码,我很好奇下面3种方法之间的最佳实践是什么,我可以使用这3种方法来转换数据读取器中的数据,默认情况下,数据读取器是使用一种对象类型获取的C# 将对象类型数据转换为值类型的最佳方法,c#,.net,object,unboxing,C#,.net,Object,Unboxing,我的任务是创建使用data reader从数据库获取数据的代码,我很好奇下面3种方法之间的最佳实践是什么,我可以使用这3种方法来转换数据读取器中的数据,默认情况下,数据读取器是使用一种对象类型获取的 internal static RoomType SelectRoomType(int roomTypeID) { SqlCommand commRoomTypeSelector = ConnectionManager.MainConnection.CreateCom
internal static RoomType SelectRoomType(int roomTypeID)
{
SqlCommand commRoomTypeSelector = ConnectionManager.MainConnection.CreateCommand();
commRoomTypeSelector.CommandType = CommandType.StoredProcedure;
commRoomTypeSelector.CommandText = "Rooms.asp_RMS_RoomType_Select";
commRoomTypeSelector.Parameters.AddWithValue("RoomTypeID", roomTypeID);
SqlDataReader dreadRoomType = commRoomTypeSelector.ExecuteReader();
if (dreadRoomType.FieldCount != 0)
{
dreadRoomType.Read();
RoomType roomType = new RoomType();
roomType.RoomTypeID = (int)dreadRoomType["RoomTypeID"];
roomType.RoomTypeName = (string)dreadRoomType["RoomType"];
roomType.IsActive = ((string)dreadRoomType["IsActive"]).ToUpper() == "Y";
roomType.LastEditDate = (string)dreadRoomType["LastEditDate"] != string.Empty ? DateTime.Parse((string)dreadRoomType["LastEditDate"]) : DateTime.MinValue;
roomType.LastEditUser = (string)dreadRoomType["LastEditUser"];
dreadRoomType.Close();
return roomType;
}
dreadRoomType.Close();
return null;
}
让我困惑的是拆箱部分,根据的说法,装箱和拆箱相当昂贵,应该避免。我知道我可以用
int.Parse(dreadRoomType["RoomTypeID"].ToString())
而不是
roomType.RoomTypeID = (int)dreadRoomType["RoomTypeID"];
问题是,是否还有比这两种方法更有效的方法来转换这些数据?如果没有可能的方法,您更喜欢使用这两种方法中的哪一种。提前感谢您接受所有帮助和建议:)您可以使用它来避免再次转换/解析为int
,因此您必须知道整数在所选列中的索引位置:
roomType.RoomTypeID = dreadRoomType.GetInt32(0);
您可以使用以避免再次转换/解析为int
,为此,您必须知道整数在所选列中的索引位置:
roomType.RoomTypeID = dreadRoomType.GetInt32(0);
拳击没那么贵
其他的选择也无济于事;一旦有了对象
,它就已经装箱了。特别是字符串解析可能比装箱要昂贵得多。(虽然我没有测量) 如果存在类型化API,您可以使用它来避免装箱(例如,调用
GetInt32
)。(尽管这些类型化方法有时只是非类型化方法的包装,因此它们也会装箱)
底线:别担心 该指南告诉您,首先要避免装箱,尽可能使用类型化(泛型)集合装箱并不昂贵 其他的选择也无济于事;一旦有了
对象
,它就已经装箱了。特别是字符串解析可能比装箱要昂贵得多。(虽然我没有测量) 如果存在类型化API,您可以使用它来避免装箱(例如,调用
GetInt32
)。(尽管这些类型化方法有时只是非类型化方法的包装,因此它们也会装箱)
底线:别担心
该指南告诉您,首先要避免使用类型化(泛型)来装箱在可能的情况下,集合的装箱和拆箱成本没有解析字符串和提取int值那么高。请在进行过早优化之前进行分析。装箱和拆箱成本没有解析字符串和提取int值那么高。请在进行过早优化之前进行分析。如果装箱/拆箱“缓慢”(它真的不是)…为什么转换为字符串并返回不会非常慢?(这真的是一种浪费:装箱/取消装箱要快得多。)然而,在担心它之前,我会首先确保存在性能问题 根据我的经验,对于一次加载数千项的数据,我发现通过预先确定列索引可以获得更高的性能(但使用
GetOrdinal
!)可以动态执行),然后我就不用担心其余的:)
对于一个项目,根据这篇文章,我甚至不担心序数:这是一个完全不同的用例,“昂贵”的部分是与数据库对话
愉快的编码。如果装箱/拆箱“慢”(实际上不是)。。。为什么转换为字符串并返回不会非常慢?(这真的是一种浪费:装箱/拆箱速度明显加快。)不过,在担心性能问题之前,我会先确保存在性能问题
private static void GetValue<T>(object o, ref T defaultValue)
{
try
{
if (defaultValue == null)
{
throw new Exception("Default value cannot be null");
}
else if (o != null)
{
if ((o is T))
{
defaultValue = (T)o;
}
}
}
catch (Exception)
{
throw;
}
}
根据我的经验,对于一次加载数千项的数据,我发现通过预先确定列索引可以获得更高的性能(但使用GetOrdinal
!)可以动态执行),然后我就不用担心其余的:)
对于一个项目,根据这篇文章,我甚至不担心序数:这是一个完全不同的用例,“昂贵”的部分是与数据库对话
快乐编码。私有静态void GetValue(对象o,ref T defaultValue)
private static void GetValue<T>(object o, ref T defaultValue)
{
try
{
if (defaultValue == null)
{
throw new Exception("Default value cannot be null");
}
else if (o != null)
{
if ((o is T))
{
defaultValue = (T)o;
}
}
}
catch (Exception)
{
throw;
}
}
{
尝试
{
if(defaultValue==null)
{
抛出新异常(“默认值不能为null”);
}
如果(o!=null),则为else
{
如果((o是T))
{
默认值=(T)o;
}
}
}
捕获(例外)
{
投
}
}
您可以使用上述方法将对象转换为任何基本数据类型,如下所示。转换为日期时间
public static DateTime GetDateTime(object o, DateTime defaultValue)
{
try
{
GetValue<DateTime>(o, ref defaultValue);
return defaultValue;
}
catch (Exception)
{
throw;
}
}
publicstaticdatetime GetDateTime(对象o,DateTime默认值)
{
尝试
{
GetValue(o,参考默认值);
返回默认值;
}
捕获(例外)
{
投
}
}
转换为整数
public static int GetInteger(object o, int defaultValue)
{
try
{
GetValue<int>(o, ref defaultValue);
return defaultValue;
}
catch (Exception)
{
throw;
}
}
publicstaticintgetinteger(对象o,intdefaultvalue)
{
尝试
{
GetValue(o,参考默认值);
返回默认值;
}
捕获(例外)
{
投
}
}
请参阅并下载包含所有基本数据类型的完整代码
私有静态void GetValue(对象o,ref T defaultValue)
{
尝试
{
if(defaultValue==null)
{
抛出新异常(“默认值不能为null”);
}
如果(o!=null),则为else
{
如果((o是T))
{
默认值=(T)o;
}
}
}
捕获(例外)
{
投
}
}
您可以使用上述方法将对象转换为任何基本数据