CSharp - 为什么在空字符串上使用tostring ( ) 会导致空错误当为空值时,tostring ( ) 在可以空的int上工作?

  显示原文与译文双语对照的内容
0 0

selectedItem 有两个字段:

  • int? _cost
  • string _serialNumber

在这里示例中,_cost_serialNumberselectedItem 都是 null 。 我正在通过 selectedItem的属性读取它们的字段,并用它们的值填充文本框,当,。

TextBox1.Text = selectedItem.Cost.ToString();//no error
TextBox2.Text = selectedItem.SerialNumber.ToString();//error

我理解 SerialNumber.ToString() 是多余的( 因为它已经是一个字符串),但我不理解为什么这会导致这个异常:

可以空对象必须有一个值。

  • int? _cost 可为空值,并且没有值,但它没有给出异常。
  • string _serialNumber 可以为空,没有价值,但它给我例外。

这个问题触动,人本质上是问同样的事情,但没有指定的答案,也没有解释为什么nullable int? 例如可以在可以为空的int上使用 .ToString(),但不能在空字符串上使用?

时间:原作者:11个回答

0 0

因为类型的stringnull 实际上指向什么,所以内存中没有任何对象。
int? type(nullable) 即使值为 null 仍然指向某些对象。
Jeffrey"通过 C#的richter的clr"如果你读你会发现可空类型只是外观类常见一些incapsulated逻辑为了使用db零更方便。

检查 msdn 以了解可以为空的类型。

原作者:
0 0

Nullable<int>struct,不能是空的。 因此,"空"结构上的方法调用仍然有效。

有一些"编译器魔术"使 _cost == null 成为一个有效的表达式。

原作者:
0 0

int? 实际上不是一个对象,但它是一个 Nullable<int> 对象。

因此,当你声明 int? _Cost 时,实际上是声明 Nullable<int> _Cost_Cost.Value的属性是 undefined 本身而不是 _Cost 对象本身。

它实际上是使用 non nullable 类型的语法糖,比如 intbool 或者 decimal

根据 MSDN:

语法 T? is shorthand for System.Nullable<T>,其中 T 是值类型。 这两种形式是可以互换的。

原作者:
0 0

字符串是引用类型,但可以为空的int是值类型。 下面是 http://www.albahari.com/valuevsreftypes.aspx的一个很好的讨论。

原作者:
0 0

可以空值实际上是公开两个属性的结构: HasValue和值。如果你这样做,你将得到错误:

int? i = null;
i.Value.ToString()

为了检查你的int? 有一个可以访问 i.HasValue的值

原作者:
0 0

我认为原因是,当编译器遇到原始数据类型时,它将它包装到相应的对象中。 toString() 方法调用只是一个间接调用( 包装,然后调用该方法),在那里处理异常。 在字符串的情况下,我们直接调用方法。 当指向空时,方法抛出异常。

原作者:
0 0
TextBox2.Text = selectedItem.SerialNumber.ToString();//error

yiels错误,因为它是调用函数 ToString(),它是 System.String的成员。 这里函数返回 System.String;的这里实例不执行实际转换。 另外,字符串是引用类型。 "引用类型"包含指向存储数据的其他内存位置的指针。

TextBox1.Text = selectedItem.Cost.ToString();//no error

没有产生错误,因为它正在调用函数 ToString(),它是 System.Integer 的成员。 这里函数将这里实例的数值转换为它的等效的字符串表示形式。 同时,整数是一个值类型。 数据类型是一个值类型,如果它持有自己的内存分配中的数据。

相同的函数名 ToString(),但执行不同的任务。

String.ToString 方法

Int32.ToString 方法

值类型和引用类型

原作者:
0 0

原因很简单。int? 或者 Nullable<int>struct还是值类型,零它永远不可能。

那么当我们执行以下操作时:

int? _cost = null;

_cost 将有两个字段 ValueHasValue,当我们将 null 指定给 _cost 时,它的HasValue 标志将被设置为 falseValue 字段将被指定 default(T),以以防万一 int?

现在,当我们在 _cost 上调用 ToString 时,Nullable<T> 具有 ToString的重写定义,如果我们查看提供的microsoft源引用的,则实现如下:

public override string ToString() {
 return HasValue? value.ToString() :"";
 }

因此它返回一个空字符串,因为 _cost 被指定为 null

现在是 string _serialNumber的情况。 string 是引用类型,它可以纯粹null, 如果持有 null 然后调用 ToString 它会产生期望的空引用异常。

你可以看到:值类型和引用类型- MSDN

原作者:
...