什么是?c#中类型声明后的操作符

本文关键字:声明 操作符 类型 什么 | 更新日期: 2023-09-27 18:15:45

我有一些c#代码,其中包含以下数组声明。注意Color后面是单个的?

private Color?[,] scratch;

在我的调查中,我发现如果你有这样的代码:

int? a;

未初始化变量a。你会在何时何地使用这个?

什么是?c#中类型声明后的操作符

?只是语法糖,这意味着该字段是空的。它实际上是Nullable<T>的缩写。

在c#和Visual Basic中,可以使用? 值类型后面的符号。例如,int?c#还是Integer?在Visual Basic中声明了一个可赋值的整数值类型null。

不能将null赋值给值类型,int作为值类型不能保存null的值,而int?可以存储空值。

Color的情况相同,因为它是一个结构(因此值类型),它不能保存空值,与Color?[,]你正在制作一个可空的颜色数组。

对于您的问题:

变量'a'没有初始化。何时何地使用这个吗?

通过使用?与变量并不使它与null或任何其他值初始化,它仍然必须初始化。

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

这意味着定义的类型是可空的。点击此链接获取更多信息。

对于可空值,您可以这样做:

int? i = null;

当然还有null检查:

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

Color?Nullable Color,相当于Nullable<Color>

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

可空类型

语法T?是System的简写。空的,其中T是一个值类型。这两种形式是可以互换的。

http://msdn.microsoft.com/en-us/library/1t3y8s4s (v = vs.80) . aspx

这是一个可空结构

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

也是一个副本https://stackoverflow.com/questions/5407552/what-does-question-mark-after-a-type-name-mean-in-c

这意味着对象在正常范围之外可以有一个null -值。

从MSDN:

空类型是Nullable结构体的实例。可空类型可以表示其基础值类型的正确值范围,再加上一个额外的空值。例如,一个Nullable(发音为"Nullable of Int32")可以被赋值为-2147483648到2147483647之间的任何值,也可以被赋值为空值。

例子
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);
        }
    }
}

?Operator表示紧接在操作符前面的值类型的值可能为null。

考虑它的一种方式,绝不是一个正式的定义,是它是一个"例外"。值如何"正常"赋值

操作符的一个经典用例是在web应用程序中的一个简单控制器中。假设我们有一个典型的DB,它存储了一个电影列表。我们可以通过在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);
}