C# 与循环中的值关联的可为null的Int类型-您最喜欢的方法是什么?

C# 与循环中的值关联的可为null的Int类型-您最喜欢的方法是什么?,c#,asp.net,programming-languages,C#,Asp.net,Programming Languages,我使用C#和ASP.NET 我在我的应用程序中使用了下面粘贴的代码,没有任何问题,但我想知道是否有更好的方法来实现相同的结果 我需要做的是: 我需要使用循环设置变量intimageid。 变量imageId它位于循环之外,因此可以在代码的其他部分中使用 我的问题是: 为什么我只使用intimageid编译器抱怨(错误:使用未分配的局部变量'imageId') 我使用了一个可为null的int类型,而不是int-imageId=0以便我可以将其设置为空值。。(在我看来语义上是正确的)你会推荐这个

我使用C#和ASP.NET

我在我的应用程序中使用了下面粘贴的代码,没有任何问题,但我想知道是否有更好的方法来实现相同的结果

我需要做的是:

我需要使用循环设置变量
intimageid
。 变量imageId它位于循环之外,因此可以在代码的其他部分中使用

我的问题是:

  • 为什么我只使用
    intimageid编译器抱怨(错误:使用未分配的局部变量'imageId')
  • 我使用了一个
    可为null的int类型
    ,而不是
    int-imageId=0以便我可以将其设置为空值。。(在我看来语义上是正确的)你会推荐这个吗?如果没有,为什么
  • 你最喜欢用什么方法解决这类问题
谢谢大家的支持

           int? imageId = null;
            foreach (DictionaryEntry valueEntry in e.Keys)
            {
                if (valueEntry.Key.Equals("ImageContentId"))
                {
                    imageId = Convert.ToInt32(valueEntry.Value.ToString());
                    break;
                }
            }

请给我一个你的代码样本谢谢

您可以使用IOrderedDictionary方法。这将允许您完全删除循环构造。e、 g

if( e.Keys.Contains("ImageContentId") )
{
    imageId = Convert.ToInt32( e.Keys["ImageContentId"].ToString() );
}
此外,如果您知道该值是一个字符串,您可能会对该方法感兴趣,例如

int imageId ;
if( Int32.TryParse(e["ImageContentId"].ToString(), out imageId ) )
{ }
您希望使用
int?
的唯一原因是您正在处理的数据可能未初始化。如果您正在解析数据,而数据是垃圾,则有2个选项: (注意:这假设您不希望在错误数据出现时抛出异常)

1) 使用默认值-这有一个好处,即固有地容忍坏数据

2) 使用
int?
构造-这样做的好处是通知代码的其余部分已知数据是错误的,并确保它们被设计为处理空值

至于哪个更好。。。这只能在系统的结构中得到回答。如果您正在与不支持可空类型的外部dll执行互操作,那么决策就相当清楚了

至于编译器错误:如果您在
if
语句中初始化
imageId
,则在某些情况下不会采用初始化分支,例如错误值。为确保始终初始化
imageId
,编译器将强制您在条件代码路径之外对其进行初始化。通常,在声明变量时,我总是尝试初始化它。e、 g

int imageId = 0;

您可以使用IOrderedDictionary方法。这将允许您完全删除循环构造。e、 g

if( e.Keys.Contains("ImageContentId") )
{
    imageId = Convert.ToInt32( e.Keys["ImageContentId"].ToString() );
}
此外,如果您知道该值是一个字符串,您可能会对该方法感兴趣,例如

int imageId ;
if( Int32.TryParse(e["ImageContentId"].ToString(), out imageId ) )
{ }
您希望使用
int?
的唯一原因是您正在处理的数据可能未初始化。如果您正在解析数据,而数据是垃圾,则有2个选项: (注意:这假设您不希望在错误数据出现时抛出异常)

1) 使用默认值-这有一个好处,即固有地容忍坏数据

2) 使用
int?
构造-这样做的好处是通知代码的其余部分已知数据是错误的,并确保它们被设计为处理空值

至于哪个更好。。。这只能在系统的结构中得到回答。如果您正在与不支持可空类型的外部dll执行互操作,那么决策就相当清楚了

至于编译器错误:如果您在
if
语句中初始化
imageId
,则在某些情况下不会采用初始化分支,例如错误值。为确保始终初始化
imageId
,编译器将强制您在条件代码路径之外对其进行初始化。通常,在声明变量时,我总是尝试初始化它。e、 g

int imageId = 0;

您可以使用Linq查找条目:

var foundKey = e.Keys.FirstOrDefault(k => k.Key.Equals('ImageContentId'));
然后使用三元表达式获取值:

int? imageId = foundKey == null ? (int?)null : Convert.ToInt32(foundKey.Value);

但是,值是什么类型的?如果您确定它是一个
int
,您可以强制转换它,而不是调用
Convert.ToInt32
。另外,
Convert.ToInt32
在某些情况下返回0,您可能需要
(int?)null

您可以使用Linq查找条目:

var foundKey = e.Keys.FirstOrDefault(k => k.Key.Equals('ImageContentId'));
然后使用三元表达式获取值:

int? imageId = foundKey == null ? (int?)null : Convert.ToInt32(foundKey.Value);

但是,值是什么类型的?如果您确定它是一个
int
,您可以强制转换它,而不是调用
Convert.ToInt32
。另外,
Convert.ToInt32
在某些情况下返回0,您可能需要
(int?)null

回答您的问题

  • net中的所有值类型都实现为结构。所有结构在使用前都必须初始化
  • 如果您对检查该值是否存在感兴趣,那么nullable是一个正确的选择。否则,
    int-imageId=0没有问题
  • 您可以使用下面的代码

回答你的问题

  • net中的所有值类型都实现为结构。所有结构在使用前都必须初始化
  • 如果您对检查该值是否存在感兴趣,那么nullable是一个正确的选择。否则,
    int-imageId=0没有问题
  • 您可以使用下面的代码

对于这类问题,我最喜欢的方法不是使用有关是否找到值的信息重载值保持变量。我明确地这样做

bool value_present = false;
int imageId;

foreach (DictionaryEntry valueEntry in e.Keys)
{
    if (valueEntry.Key.Equals("ImageContentId"))
    {
        value_present = true;
        imageId = Convert.ToInt32(valueEntry.Value.ToString());
        break;
    }
}
然后在使用
imageId
之前测试
value\u present

也就是说,正如其他人所指出的,这是疯狂的

  • 不要这样循环,只需调用
    e.Keys.Contains()
  • 不要先转换为字符串,然后再转换回int。如果是int,则强制转换它

我最喜欢的解决这类问题的方法不是使用有关是否找到值的信息重载值保持变量。我明确地这样做

bool value_present = false;
int imageId;

foreach (DictionaryEntry valueEntry in e.Keys)
{
    if (valueEntry.Key.Equals("ImageContentId"))
    {
        value_present = true;
        imageId = Convert.ToInt32(valueEntry.Value.ToString());
        break;
    }
}
然后在使用
imageId
之前测试
value\u present

也就是说,正如其他人所指出的,这是疯狂的。