Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象类型数据转换为值类型的最佳方法_C#_.net_Object_Unboxing - Fatal编程技术网

C# 将对象类型数据转换为值类型的最佳方法

C# 将对象类型数据转换为值类型的最佳方法,c#,.net,object,unboxing,C#,.net,Object,Unboxing,我的任务是创建使用data reader从数据库获取数据的代码,我很好奇下面3种方法之间的最佳实践是什么,我可以使用这3种方法来转换数据读取器中的数据,默认情况下,数据读取器是使用一种对象类型获取的 internal static RoomType SelectRoomType(int roomTypeID) { SqlCommand commRoomTypeSelector = ConnectionManager.MainConnection.CreateCom

我的任务是创建使用data reader从数据库获取数据的代码,我很好奇下面3种方法之间的最佳实践是什么,我可以使用这3种方法来转换数据读取器中的数据,默认情况下,数据读取器是使用一种对象类型获取的

    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;
}
}
}
捕获(例外)
{
投
}
}
您可以使用上述方法将对象转换为任何基本数据