在C#中,类型声明后的问号运算符代表什么?

11

我有一些C#代码,其中包括以下数组声明。请注意,在Color后面有一个单独的?

private Color?[,] scratch;

在我的调查中,我发现如果您的代码类似于:

int? a;
变量a未初始化。什么时候和在哪里会使用这个变量?

如果您正在根据用户输入进行一些数学计算,您需要确保他们已经输入了一个数字,以便方程式不使用默认值。 - Sayse
2
你是如何在不知道?的含义的情况下添加了nullable标签的? - Soner Gönül
我总是惊讶地发现,当问题很简单时,会有很多重复的答案。 - Nolonar
2
可能是在C#中"DateTime?"的含义是什么?的重复问题。 - Sani Huttunen
7个回答

21

?只是语法糖,它表示该字段是可空的。实际上,它是Nullable<T>的简写。

在C#和Visual Basic中,您可以使用值类型后面的?符号将值类型标记为可空。例如,在C#中,int?或在Visual Basic中,Integer?声明了一个整数值类型,可以分配null。

您无法将null赋给值类型,因为int是值类型,无法保存null值,而int?则可以存储null值。

对于Color也是同样的情况,因为它是一个结构体(因此是值类型),无法保存null值,使用Color?[,]可以创建一个可空的颜色数组。

针对您的问题:

变量'a'未初始化。何时何地会使用它?

使用?与变量一起并不会使其初始化为null或任何其他值,它仍然必须进行初始化。
int? a = null; 

int b = null;//error since b is not nullable

在语句中,client?.Close(); 有什么作用? - Rahly
如果仅仅是语法糖,那么 ?Nullable<T> 如何可以互换使用? - dakab
@dakab,在编译时它们会改变,例如,int? 将变成 Nullable<int> - Habib

4
这意味着所定义的类型可以为空。查看此链接以获取更多信息。
使用可空类型,您可以进行以下操作:
int? i = null;

当然,要进行null检查:

if (i == null)
{
    // do stuff here ...
}

0

这意味着对象除了其正常范围外,还可以具有null值。

来自MSDN

可空类型是Nullable结构的实例。可空类型可以表示其基础值类型的正确值范围,以及额外的null值。例如,一个Nullable,发音为“Int32的Nullable”,可以被分配从-2147483648到2147483647的任何值,或者它可以被分配null值。
...

示例

class NullableExample
{
    static void Main()
    {
        int? num = null;

        // Is the HasValue property true? 
        if (num.HasValue)
        {
            System.Console.WriteLine("num = " + num.Value);
        }
        else
        {
            System.Console.WriteLine("num = Null");
        }

        // y is set to zero 
        int y = num.GetValueOrDefault();

        // num.Value throws an InvalidOperationException if num.HasValue is false 
        try
        {
            y = num.Value;
        }
        catch (System.InvalidOperationException e)
        {
            System.Console.WriteLine(e.Message);
        }
    }
}

0

Color?是指一个NullableColor,它等价于Nullable<Color>

Color c = null;//ERROR Color is a struct, cannot be null!
Color? c = null;//OK

可空类型


0

0

你不能只用“?”搜索问题。这就是为什么会出现重复的原因。 - user2425056

0

问号运算符表示紧接在运算符之前的值类型可能具有空值。

一种思考方式,绝不是正式定义,它是对值通常如何被赋值的“异常”的解释。

运算符的一个经典用例是在 Web 应用程序中的简单控制器中。假设我们有一个典型的数据库,存储电影列表。我们可以通过将以下内容添加到 URL 中来访问这些电影的详细信息:

.../Movies/Details?MovieName=TopGun

或者

.../Movies/Details?MovieName=DieHard

但是如果我们想查看电影详细信息,而MovieName的值未定义呢?你会在HTML页面上显示什么?好吧,这个控制器会通知我们请求无效:

看看这个:

// GET: Movies/Details/5
public ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

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