C# ? and ??
来源:互联网 发布:易语言用数据库做登录 编辑:程序博客网 时间:2024/05/19 15:24
Nullable Types in C#
One of the "late breaking" features in C# 2.0 is what is known as "Nullable Types". The details can be found in the C# 2.0 language spec.
Nullable types address the scenario where you want to be able to have a primitive type with a null (or unknown) value. This is common in database scenarios, but is also useful in other situations.
In the past, there were several ways of doing this:
- A boxed value type. This is not strongly-typed at compile-time, and involves doing a heap allocation for every type.
- A class wrapper for the value type. This is strongly-typed, but still involves a heap allocation, and the you have to write the wrapper.
- A struct wrapper that supports the concept of nullability. This is a good solution, but you have to write it yourself.
To make this easier, in VS 2005, we're introducing a new type named "Nullable", that looks something like this (it's actually more complex than this, but I want to keep the example simple):
struct Nullable<T>{ public bool HasValue; public T Value;}
You can use this struct directly, but we've also added some shortcut syntax to make the resulting code much cleaner. The first is the introduction of a new syntax for declaring a nullable type. Rather than typing:
Nullable<int> x = new Nullable<int>(125);
I can write:
int? x = 125;
which is much simpler. Similarly, rather than needed to write a null test as:
if (x.HasValue) {...}
you can use a familiar comparison to null:
if (x != null) {...}
Finally, we have support to make writing expressions easier. If I wanted to add two nullable ints together and preserve null values, if I didn't have language support, I would need to write:
Nullable<int> x = new Nullable<int>(125);Nullable<int> y = new Nullable<int>(33);Nullable<int> z = (x.HasValue && y.HasValue) ? new Nullable<int>(x.Value + y.Value) : Nullable<int>.NullValue;
At least I think that's what I'd have to write - it's complex enough that I'm not sure this code works. This is ugly enough that it makes using Nullable without compiler support a whole lot of work. With the compiler support, you write:
int? x = 125;int? y = 33;int? z = x + y;
Mark:Becuase of "?" we can know the value is zero or not inited。The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand.
A nullable type can contain a value, or it can be undefined.
The ?? operator defines the default value to be returned when a nullable type is assigned to a non-nullable type.
If you try to assign a nullable type to a non-nullable type without using the ?? operator,
you will generate a compile-time error.
If you use a cast, and the nullable type is currently undefined, an InvalidOperationException exception will be thrown.
// nullable_type_operator.csusing System;class MainClass{ static int? GetNullableInt() { return null; } static string GetStringValue() { return null; } static void Main() { // ?? operator example. int? x = null; // y = x, unless x is null, in which case y = -1. int y = x ?? -1; // Assign i to return value of method, unless // return value is null, in which case assign // default value of int to i. int i = GetNullableInt() ?? default(int); string s = GetStringValue(); // ?? also works with reference types. // Display contents of s, unless s is null, // in which case display "Unspecified". Console.WriteLine(s ?? "Unspecified"); }}
- C# ? and ??
- Excel Exchange and C#
- C# and API
- Script and C#
- C# ref and out
- P2P And C#
- Excel Exchange and C#
- C# AND API
- Core C# and .NET
- C# and ActiveX DLLs
- C# get and set
- C# virtual and overide
- C# GetPixel and SetPixel
- Java and C# NOTE
- Java and C# Comparison
- Java and C# Comparison
- C# Infinity and NaN
- Java and C# Comparison
- Android -SQLite 操作第一章 SQLiteOpenHelper
- 更改对于登录“sa”失败,无法设置主体“sa”的凭据
- cygwin *** 多个目标匹配。 停止
- log4j配置多个日志文件,输出特定的日志信息
- rtp协议分析
- C# ? and ??
- TCP三次握手、四次挥手
- Rotate List
- 拿来主义:与大家分享,关于wifi连接信息、管理、设置的CLASS
- 通过Sahara部署Hadoop集群
- C/C++中产生随机数(rand,srand用法)
- IrCut相关
- luncene 各种Query类详解实例
- JAVA连接Shake方法