("")和(null)有什么区别?

13

在设置验证时,我最初遇到了一些问题:如何检查文本框是否为空。我尝试使用

    private void btnGo_Click(object sender, EventArgs e)
    {
        string name = textLogin.Text;
        if (name == null)
        {
             labelError.Visiblle = true;
             labelError.Text = "Field Cannot be Left Blank"
        }
    }

但是它没有起作用,直到我尝试了这个。

    private void btnGo_Click(object sender, EventArgs e)
    {
        string name = textLogin.Text;
        if (name == "")
        {
             labelError.Visiblle = true;
             labelError.Text = "Field Cannot be Left Blank"
        }
    }

我的问题是我想了解("")和(null)之间的区别以及为什么null无法工作。

提前感谢。


3
string.IsNullOrEmpty() 是您的好朋友,因为在验证时希望将它们视为相同的情况非常普遍。 - millimoose
4
"" 的意思是空杯。null 表示什么都没有。 - Dilshod
前者为空,后者为 null,不是吗?就像空无本身并不存在一样 :D - Pajri Aprilio
10个回答

21
0 和空数组之间的区别相同:它们是不同的值。 "" 是一个空字符串,而这就是一个空文本框所包含的所有文本。 null 表示没有值,并且不是一个空文本框所具有的 Text 值。

如果我理解有误,请纠正我。听起来你是在说空文本框中的值应该保存为''(而不是NULL)到数据库中。如果文本框对于用户可见但不可编辑怎么办?(例如,他们没有权限修改特定属性)。您是否建议无论底层数据库如何都采用相同的方法?(例如,在Oracle中,空字符串和NULL是相同的,您的应用程序将不再正确工作) - Dr Y Wit
@DrYWit:这个问题是关于C#中的null,而不是关于数据库。虽然我并不建议把SQL数据库当做兼容的东西来使用,或者在任何时候使用Oracle数据库。 - Ry-
谢谢。我没有任何意图将这个对话变成数据库比较,但我可以问一下,在哪些方面Oracle缺少能力,使其不适用于任何场景? - Dr Y Wit
@DrYWit:它不是缺少功能,而是你刚才提到的那种怪异和它是专有的(而且昂贵)。 - Ry-

6
在.NET中,System.String数据类型是一个引用类型的。因此,空字符串(""string.Empty)是对值长度为零的引用,而null则不引用实际值,所以任何尝试访问其引用的值都将失败。
例如:
string emptyString = "";
string nullString = null;

Console.WriteLine(emptyString.Length); // 0
Console.WriteLine(nullString.Length);  // Exception!

我建议您在验证代码中使用IsNullOrEmpty (或者IsNullOrWhiteSpace),以处理以下两种情况:

if (string.IsNullOrEmpty(name))
{
     labelError.Visiblle = true;
     labelError.Text = "Field Cannot be Left Blank"
}

5

"" 是一个空字符串,而 null 表示“不存在”。

在您的情况下,您首先将 name 与“不存在”进行比较,但这是错误的,因为 name 存在。然后,您将 name 与空字符串进行比较,这是正确的,因为它具有空字符串的值。


3
TextBox.Text的默认值是String.Empty"",而不是null。因此,你的第一段代码无法运行。null只是用来表示对象没有指向任何东西,它没有分配任何内存空间。请注意保留HTML标记。

2
通俗易懂来说,null 意味着缺少值,而 "" 则表示零长度字符串,它们并不相同。虽然有些软件会将 null 字符串和 "" 等同对待,例如 Console.WriteLine,但这并不能使它们成为同一物。严格来讲,"" == null 表达式在设计上是返回 false 的。在 .NET 框架中,String 类型的等式比较是通过重载 == 运算符 实现的,它不将 null 视为等于 ""

2
null只是表示对象(在本例中为textLogin.Text对象)不存在。为了实现这一点,textLogin对象不能存在。因此,在这种情况下,textLogin对象不为空,因此textLogin.Text也不能为null。
另一方面,""表示空字符串,意思是文本框中没有任何内容。即textLogin.Text中没有任何字符。

1
区别在于""表示空字符串,而null表示不存在。

1

1

简单来说,"" 是一个有效的值,即 String.Empty,但 null 没有任何值。


0

首先,Null和空字符串即“”并不相同。 Null是一个对象引用值。 Null表示没有值,而“”意味着有一个值,这个值是一个空字符。

初始化为Null的对象意味着在内存中该对象没有指向任何东西。它没有价值或值。它只是被声明了。这并不意味着它的值是“”或零。

而初始化为“”的对象意味着在内存中该对象指向“”的字节码。因此,该对象具有一个值。

在TextField的上下文中,TextField接受字符,即字母、标点符号和数字。 TextField对文本进行操作,而不是Null。

如果你说

    String name = textLogin;
    if (name == null){
        }

(也许你需要将textLogin转换为字符串,我不确定)

这样做是可行的,因为textLogin是一个对象。它会返回你想要的结果,因为这个对象可以有一个空引用值。

但这意味着如果你想要这个textLogin的值,在你的“if”语句中你必须说,name = textLogin.Text。这会给你一个textLogin对象内部的内容。

既然你选择使用了

  String name = textLogin.Text;
  if (name == null){
        }

如果TextField为空,则textLogin.Text似乎已经引用了一个空字符串。这是在幕后为您完成的,因此您不必处理NullPointExceptionError。

因此,“name”永远不可能为空。 “name”可以是空字符串或值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接