那是什么?在类型声明后,C#中的运算符是什么意思?

时间:2013-05-27 13:05:31

标签: c# nullable

我有一些带有以下数组声明的C#代码。请注意?之后的单Color

private Color?[,] scratch;

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

int? a;

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

7 个答案:

答案 0 :(得分:17)

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

  

在C#和Visual Basic中,使用。将值类型标记为可为空   ?值类型后的表示法。例如,int?在C#或整数?   在Visual Basic中声明可以分配的整数值类型   空。

您无法将null分配给值类型,int作为值类型无法保留null值,int?另一方面可以存储空值。

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

对于你的问题:

  

变量'a'未初始化。你何时何地使用   此?

通过将?与变量一起使用,不会使用null或任何其他值进行初始化,仍然需要对其进行初始化。

int? a = null; 

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

答案 1 :(得分:4)

这意味着定义的类型可以为空。查看this link了解详情。

你可以使用nullables:

int? i = null;

当然还有空检查:

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

答案 2 :(得分:0)

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

来自MSDN

  

Nullable类型是Nullable结构的实例。可空类型可以表示其基础值类型的正确值范围,以及额外的空值。例如,可以为发音为“Nullable of Int32”的Nullable分配从-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);
        }
    }
}

答案 3 :(得分:0)

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

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

Nullable Types

答案 4 :(得分:0)

  

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

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

答案 5 :(得分:0)

答案 6 :(得分:0)

?运算符表示紧接在运算符之前的值类型可能具有 null 值。

一种思考方式,绝不是一个正式的定义,它是如何“正常”分配值的“例外”。

运算符的一个经典用例是网络应用中的简单控制器。假设我们有一个典型的数据库来存储电影列表。我们可以通过在 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);
}