【问题标题】:c# int.tryParse nullable ints how to?c# int.tryParse 可以为空的ints如何?
【发布时间】:2012-06-16 21:28:41
【问题描述】:

我有时需要将 int 的值设置为 null,有时需要设置为实际值。 问题是我需要将该值存储在 SAME 变量中,而不是创建另一个。

int? year;
if(something)
   year = null;
else
   int.tryParse("some string", out year);

"some string" 始终是有效的 int,但问题是我不能在 int 上使用 int.tryParse? 如何解决这个问题?

【问题讨论】:

  • "some string" 永远不是有效的 int。 (可能在使用 Eldritch 文化时除外)
  • 没有。我实际上会有一个 int 值,它来自 dropdownlist.SelectedItem.Value ,它作为字符串返回

标签: c# asp.net null int


【解决方案1】:

如果你的字符串总是一个有效的整数,你应该只使用Parse 方法。

year = int.Parse("some string");

如果它不是一个有效的整数,你会得到一个FormatExceptionOverflowException(不像TryParse,它只返回false)。

【讨论】:

  • 它总是可以通过两个简单的步骤完成。如果这里的性能是一个问题,Parse 会逊色
  • @MareInfinitus:我怀疑它的效率明显低于TryParse(仍然需要执行验证)。它可能比跳过所有验证检查的手动实现效率低,但通常不值得麻烦。
  • 根据一些基准测试,我发现它的速度肯定要慢很多。这里是:blogs.msdn.com/b/ianhu/archive/2005/12/19/505702.aspx 在结论中
  • @MareInfinitus:如果它抛出(通常是抛出异常的情况),它会明显变慢,而不是如果它总是成功。我检查了 ParseTryParse 的内部实现,除了 throwing 和 return false 之外,它们是相同的。
  • @MareInfinitus 选择与意图有关。使用Parse 表示“这将始终有效。如果它无效,我们有一个错误,所以不需要处理这种情况。”而TryParse 说“它有时可能是无效的,我已经为它添加了明确的错误处理”。在大多数情况下,正确的选择是很明显的,并且由于 OP 说该值保证是一个有效的 int,Parse 显然是这里更好的选择。
【解决方案2】:

您可以使用 Convert.ToInt32(year)。

【讨论】:

  • 但是如果字符串不是空的并且不是数字,这个仍然会抛出。
  • 最简单的方法。谢谢。 DB 将确保它始终有一个数字进来,并会尝试捕捉以确保安全
【解决方案3】:

你可以试试这个:

public class NullInt
{
    public void ParseInt(string someString, ref int? someInt)
    {
        int i;

        if (int.TryParse(someString, out i))
        {
            someInt = i;
        }
    }
}

使用起来有点像:

NullInt someInt = new NullInt();
int? targetInt = null;
someInt.ParseInt("42", ref targetInt);

【讨论】:

  • 仅仅因为你没有得到赞成票,请不要去反对所有其他选项。我们都在放弃我们的时间来帮助别人,因为其他人帮助我们。如果你不喜欢我的回答,请在下方评论。如果有人给出了一个愚蠢的答案,那么就投反对票以表明这是一个错误的答案
  • 看起来我是这样的,但我没有,正如你所看到的那样,我并没有失去任何声誉。 (认为​​您因投票而得到-1,或者?)...如果我认为有些问题,我会对此发表评论。你可以在这里看到很多我的cmets... 490进入这里,490离开这里,对我来说没问题,只是想留下对我来说似乎最好的解决方案。
  • 没问题,因为我想知道谁会这样做。讨论总是比直接投反对票好,因为我相信每个人都可以学到一些东西,即使他是双向飞碟或戈斯曼。如果有人认为我认为最好的解决方案有问题,我肯定想知道。
【解决方案4】:

如果“某些字符串”始终是一个有效的 int,那么您可以使用 System.Convert.ToInt32System.Int32.Parse 将其转换为 int

【讨论】:

    【解决方案5】:

    int.tryParse 返回一个布尔值,而不仅仅是输出值 - 你也可以这样做:

    int year;
    int? finalYear;
    if(int.TryParse("some string", out year))
        finalYear = year;
    

    否则,如果“某些字符串”总是返回一个有效的 int,为什么不这样做

    int? year = int.Parse("some string");
    

    【讨论】:

      【解决方案6】:
      public static class StringExtensions
      {
          public static int? AsInt(this string input)
          {
              int number;
              if (int.TryParse(input, out number))
              {
                  return number;
              }
      
              return null;
          }
      }
      

      用法:year = someString.AsInt();

      【讨论】:

        【解决方案7】:

        这似乎也有效:

        int? year;
            if (something)
               year = null;
            else
            {
               int _year;
               int.TryParse(year.SelectedItem.Value, out _year);
               year = _year;
            }
        

        【讨论】:

        • 我相信应该检查 tryparse 的返回值。
        • 在不检查结果的情况下使用TryParse 只是一个好主意,如果您希望值变为default(T),这里不是这种情况。如果发生这种情况,你只是在隐藏一个错误。
        【解决方案8】:

        添加一些错误检测:

        try
        {
           year = int.Parse("some string");
        }
        catch()
        {
           year = null;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-03-24
          • 2017-12-09
          • 2011-11-21
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 1970-01-01
          • 2019-06-11
          相关资源
          最近更新 更多