C# - 检查变量是否已初始化

Sup*_*est 16 c# initialization

我想检查变量是否在运行时以编程方式初始化.为了使这个不太神秘的原因,请看以下不完整的代码:

string s;

if (someCondition) s = someValue;
if (someOtherCondition) s = someOtherValue;

bool sIsUninitialized = /* assign value correctly */;

if (!sIsUninitialized) Console.WriteLine(s) else throw new Exception("Please initialize s.");
Run Code Online (Sandbox Code Playgroud)

并完成相关位.

一个hacky解决方案是使用默认值初始化s:

string s = "zanzibar";
Run Code Online (Sandbox Code Playgroud)

然后检查它是否发生了变化:

bool sIsUninitialized = s == "zanzibar";
Run Code Online (Sandbox Code Playgroud)

但是,如果someValuesomeOtherValue恰好是"桑给巴尔"呢?然后我有一个bug.有更好的方法吗?

McG*_*gle 16

如果编译器知道某个变量尚未初始化,则代码甚至不会编译.

string s;
if (condition) s = "test";
// compiler error here: use of unassigned local variable 's'
if (s == null) Console.Writeline("uninitialized");
Run Code Online (Sandbox Code Playgroud)

在其他情况下,default如果可能尚未初始化变量,则可以使用关键字.例如,在以下情况中:

class X
{ 
    private string s;
    public void Y()
    {
        Console.WriteLine(s == default(string));  // this evaluates to true
    }
}
Run Code Online (Sandbox Code Playgroud)

文档指出default(T)将为null引用类型和0值类型提供.正如评论中指出的那样,这与检查null非常相似.


这一切都掩盖了这样一个事实,即你应该null在第一次声明变量时真正初始化变量.

  • @dbaseman,我不同意.它混淆了众所周知的对"null"的理解. (12认同)
  • 不是`s == default(string)`一种说's == null`的奇特方式? (4认同)
  • @dasblinkenlight很好,基本上,但是我认为这使意图更加明确。 (2认同)
  • @KirkWoll 我从来没有这样想过,也许你是对的。 (2认同)

Dav*_*d W 10

使用C#2.0,您可以使用Nullable运算符,为以前的值类型设置初始值null,允许执行以下操作:

int? x = null;

if (x.HasValue)
{
    Console.WriteLine("Value for x: " + num.Value); 
}
Run Code Online (Sandbox Code Playgroud)

产生:"x的值:空".

  • 这不适用于字符串,因为它已经是引用类型. (3认同)
  • 不要在检查中使用布尔文字,写"if(x.HasValue)".布尔文字仅在初始化时有意义(或作为参数传递时) - 不在其他地方. (2认同)

Vyt*_*lyi 5

null默认分配它,而不是字符串值