C# 与循环中的值关联的可为null的Int类型-您最喜欢的方法是什么?
我使用C#和ASP.NET 我在我的应用程序中使用了下面粘贴的代码,没有任何问题,但我想知道是否有更好的方法来实现相同的结果 我需要做的是: 我需要使用循环设置变量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以便我可以将其设置为空值。。(在我看来语义上是正确的)你会推荐这个
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
也就是说,正如其他人所指出的,这是疯狂的。