代码之家  ›  专栏  ›  技术社区  ›  fearofawhackplanet

空值的显式赋值

c#
  •  50
  • fearofawhackplanet  · 技术社区  · 15 年前
    string s1;
    string s2 = null;
    
    if (s1 == null) // compile error
    if (s2 == null) // ok
    

    我真的不明白为什么需要明确的任务。空变量和未赋值变量有什么区别?我总是假设未分配的变量只是被运行时/编译器分配为空。如果它们不是空的,那么它们是什么?

    7 回复  |  直到 15 年前
        1
  •  73
  •   Mark Byers    15 年前

    未分配 自动初始化为其默认值(在 string ).

    未分配 局部变量 未分配任何值,并且尝试访问可能未分配的变量将导致编译错误。

        2
  •  12
  •   Tseng    15 年前

    需要显式赋值的原因非常简单。当人们试图使用未分配/未初始化的变量时,这通常是错误的来源。

    通过强制开发人员这样做,它消除了当开发人员忘记初始化变量时发生的错误。通过初始化,你可以控制它。

    真是件好事!我不知道我在一些脚本语言中有多少未初始化或未定义的变量,这些语言花了相当长的时间才被发现^^

        3
  •  7
  •   Jon Hanna    15 年前
    1. 如果你有一个未赋值的局部值,你很可能会做一些愚蠢的事情。更糟糕的是,你在做那些聪明人在最热的时候能做的蠢事(每个人每天都做一些蠢事)。

    2. 与导致警告的某些事情不同,在特定的显著情况下使用未分配值没有可能的优势。

    3. 允许未分配的本地值或假设特定值之间的唯一成本差异是几次击键(通常 = null; 最多可能是 = default(SomeType);

        4
  •  4
  •   tanascius    15 年前

    看看规格: 5.3 Definite assignment

    在下列情况下,明确的分配是一项要求:
    必须在获得变量值的每个位置明确指定一个变量。

    s1和s2最初未分配( 5.3.1 Initially assigned variables ),但仅s2 被认为是在一个特定的地点确定的, [因为]

    • 一种简单的赋值(7.13.1节),其中变量是左操作数。

    如你所见, 无效的 在这种情况下是不相关的。重要的是任务本身,而不是价值。

        5
  •  4
  •   Daniel Daranas    15 年前

        6
  •  2
  •   onedaywhen    15 年前

    从未赋值的变量包含 未定义 价值。在最坏的情况下,大多数语言中都有,这意味着 值,因为它处理一些内存位,这很可能是以前用于其他用途的,甚至可能是由其他程序使用的。一些语言确保所有变量都初始化为一些合理的默认值。然而,这可能只是一种浪费,因为最终它是一个写操作,这可能不是必需的,在默认情况下这样做是浪费时间。

        7
  •  0
  •   Kirk    15 年前

    在方法内部移动,很有可能在初始化变量之前测试变量时忘记了一些东西。

    我看到的另一个警告是字符串默认为什么?(更重要的是,这是一个不会改变的规范吗?请记住,空字符串与空分配字符串不同。不过,有一种方法可以替代string.IsNullOrEmpty(S1)进行测试。