C#中的`default`关键字有什么用途?

92
  1. C# 中的 default 关键字有什么用?
  2. 它是在 C# 3.0 中引入的吗?

https://dev59.com/vnRC5IYBdhLWcg3wP-Zh - Josh Lee
请查看此链接:http://msdn.microsoft.com/zh-cn/library/vstudio/83fhsxwc.aspx - MasterMastic
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default - Owen Johnson
6个回答

122

default 关键字是有多种用途的,它具有上下文含义。我猜测你指的是其新的 C# 2 意义,即返回类型的默认值。对于引用类型来说,这是 null,对于值类型来说,这是一个全零实例。

以下是一些示例,以说明我的意思:

using System;

class Example
{
    static void Main()
    {
        Console.WriteLine(default(Int32)); // Prints "0"
        Console.WriteLine(default(Boolean)); // Prints "False"
        Console.WriteLine(default(String)); // Prints nothing (because it is null)
    }
}

85

您可以使用default来获取泛型类型的默认值。

public T Foo<T>()
{
    .
    .
    .
    return default(T);
}

36
最常见的用法是与泛型一起使用;虽然它可以用于“常规”类型(即default(string)等),但在手写代码中这种情况很少见。
然而,当进行代码生成时,我会使用这种方法,因为这意味着我不需要硬编码所有不同的默认值 - 我只需要找出类型并在生成的代码中使用default(TypeName)
在泛型中,经典的用法是TryGetValue模式:
public static bool TryGetValue(string key, out T value) {
    if(canFindIt) {
        value = ...;
        return true;
    }
    value = default(T);
    return false;
}

在这里,我们需要给出一个值来退出方法,但调用者并不关心它是什么。你可以将其与构造函数约束进行对比:

public static T CreateAndInit<T>() where T : ISomeInterface, new() {
    T t = new T();
    t.SomeMethodOnInterface();
    return t;
}

1
在 where T : new() 和 default(T) 之间,我更喜欢使用 where T : new(),因为它会调用泛型类的完整构造函数。但当 new() 约束无法满足时,default(T) 非常有用。例如不可变/单例禁止 new()。 - Robert J. Good

14

5

“default”关键字(除了 switch-case)可帮助您初始化类、列表等对象的实例。它被使用是因为其通用属性,当您不知道其值时,它可以帮助您分配类型的默认值,以避免在将来的代码中出现错误。


1
回声和强调它在泛型中的使用,除了代码生成几乎没有其他用途。
如果必须进行默认初始化(在我看来已经有点可疑了),请明确说明。只需这样做即可。

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