C#中的??是什么意思

如题所述

可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如string str=null; 是正确的,int i=null; 编译器就会报错。

为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?"来表示,表现形式为"T?"
例如:int? 表示可空的整形,DateTime? 表示可为空的时间。

T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当用到T?时编译器编译 时会把T?编译成System.Nullable的形式。

扩展资料:

C#使用注意事项:

类成员的访问权限:

1、Public:允许外界访问。

2、Private 不允许外界访问,也不允许派生类访问。

3、Protected:不允许外界访问,但允许派生类访问。

4、Internal:允许同一个命名空间中的类访问。

5、在while括号后面不要加分号,因为加分号后,就表示while语句中的循环体代表空语句。不过有时可以将while语句的循环体中的语句放在while后面的括号中去,这时就可在while括号后面加上一个分号。

参考资料来源:百度百科-c#

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-04-29
如果不赋予初值,C#的变量是不允许直接使用的。
但有的时候,让值的类型为空是非常有用的,
比如三态bool,其中一个状态便是未给定值。

泛型使用System.NullAble<T>提供了类型值为空的一种方式。
System.NullAble<T> nullAbleInt;
因为太常用,C#特意给了一个语法快捷
int? nullAbleInt;
简单的例子:
int? nVal1 = new int?();
int? nVal2 = null;
int? nVal3 = 3;
Console.WriteLine(nVal1); // 输出null
Console.WriteLine(nVal2); // 输出null
Console.WriteLine(nVal3); // 输出3

原则:null与任何数数学运算结果为null,null bool 操作任何值结果为 null。

为了减少可空类型的代码量,遇到null的时候
C#提供了??操作符来获取如果为空的默认值。
static void Main(string[] args)
{
int? nVal1 = null;
int? nVal2 = 5;
// nVal1为空,相乘后还是null,输出0作为默认值
Console.WriteLine(2 * nVal1 ?? 0);
// nVal2非空,取计算值输出,输出10
Console.WriteLine(2 * nVal2 ?? 0);
}本回答被提问者采纳
第2个回答  2015-09-24
!在C like语言中的意思是取反的意思。
例如:==这是比较“等于”,"!="就是比较"不等于"
再例如 t = true; !t则表示false.
第3个回答  2015-06-10
字段和属性是C#面向对象模式中的两个概念。

字段(field) 用来存储数值或对象的真正实体 简单说是私有变量(不一定是私有...)
属性(property) 对字段的封装(也不一定- -) 有get段落和set段落 通常是公开的 通常get段和set段执行过程都是轻量的(这是一个语义约定 也是C#不同于java的地方 重量级 耗时的获取也要用函数来表达而不是属性 java就没这种语义了 一律get- -)

字段和属性都属于类的成员
我说的不一定是因为通常它们是这么用的 但是在不同设计模式和上下文场合 字段的私有会造成取值赋值的效率降低 比如你不得不对一个占用64字节的结构体频繁取值赋值 就用公开字段好了...
属性是个非常奇妙的东西 它包含着写段落和读段落所以又叫读写器 正常的意义是field的wapper 因为你可以通过只写get段或set段 对字段达到只读和只写的访问控制 甚至可以对get和set加上访问权限修饰符 比如protected get; private set;
因为get和set段像是两个函数一样 所以你可以在里面写很多奇怪的东西达到不同的设计期望 比如get里可以先判断if (字段==null ) new() return 字段;的这种单例模式设计 set里则可以加上事件触发和有效性判断等逻辑 所以合理的利用属性这种语法对C#程序设计很重要

字段命名加上下划线是类似匈牙利命名法的要求 表示它是private的
不过因为C#是大小写敏感的 你完全可以对字段采用camel命名法 而对属性采用pascal命名法加以区分 但是vb.net不一样 为了两种语言风格统一 你可以采用下划线的方式进行区分 这只是开发风格的问题
第4个回答  2010-06-12
这是 .NET3.0以后的新特性 Lambda表达式

RelayCommand(() => this.AddPerson(), () => this.CanAddPerson());

的意思可以翻译为

RelayCommand(参数一, 参数二);
参数一 :() => this.AddPerson()
参数二 :() => this.CanAddPerson()

() => this.AddPerson() 的意思是 一个没有参数的方法,返回 this.AddPerson() 而这个返回值的类型不用指定 系统会自动判断
同理 () => this.CanAddPerson() 就是 一个没有参数的方法返回this.CanAddPerson()
相似回答