C#中的??是啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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#

参考技术A 如果不赋予初值,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);
本回答被提问者采纳
参考技术B !在C like语言中的意思是取反的意思。
例如:==这是比较“等于”,"!="就是比较"不等于"
再例如 t = true; !t则表示false.
参考技术C 字段和属性是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不一样 为了两种语言风格统一 你可以采用下划线的方式进行区分 这只是开发风格的问题
参考技术D 这是 .NET3.0以后的新特性 Lambda表达式

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

的意思可以翻译为

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

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

C#中的“var”是啥意思? [复制]

【中文标题】C#中的“var”是啥意思? [复制]【英文标题】:What does "var" mean in C#? [duplicate]C#中的“var”是什么意思? [复制] 【发布时间】:2011-05-17 11:41:30 【问题描述】:

在 C# 中,关键字 var 是如何工作的?

【问题讨论】:

【参考方案1】:

这意味着数据类型是从上下文中派生(隐含)的。

来自http://msdn.microsoft.com/en-us/library/bb383973.aspx

从 Visual C# 3.0 开始,变量 在方法范围内声明的可以 有一个隐式类型 var。一个 隐式类型的局部变量是 强类型,就像你有 自己声明了类型,但是 编译器确定类型。这 以下两个 i 声明是 功能等效:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

var 可用于消除键盘输入和视觉噪音,例如,

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

变成

var x = new MyReallyReallyLongClassName();

但过度使用会牺牲可读性。

【讨论】:

【参考方案2】:

这意味着被声明的本地的类型将由编译器根据其第一次赋值来推断:

// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";

值得注意的是,var 没有将变量定义为动态类型。所以这是不合法的:

var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints

var只有两种用途:

    声明变量需要更少的输入,尤其是在将变量声明为嵌套泛型类型时。 在存储对匿名类型对象的引用时必须使用它,因为无法预先知道类型名称:var foo = new Bar = "bar" ;

您不能将var 用作除本地人以外的任何类型。所以你不能使用关键字var 来声明字段/属性/参数/返回类型。

【讨论】:

@cdhowie 如果说var foo = new Foo()foo 可以是Foo 类型或其任何超类。这怎么可能合法? @Djack 这不合法,事实并非如此。 var foo = new Foo();Foo foo = new Foo(); 是一回事,这意味着foo 可以包含Foo 引用,或者对任何Foo 对象的引用sub 类型,not Foo 超级类型。【参考方案3】:

“var”表示编译器将根据使用情况确定变量的显式类型。例如,

var myVar = new Connection();

会给你一个 Connection 类型的变量。

【讨论】:

【参考方案4】:

你曾经讨厌编写这样的变量初始化器吗?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

因此,从 C# 3.0 开始,您可以将其替换为

var xmlSerializer = new XmlSerialzer(typeof(int))

一个通知:类型在编译期间被解析,所以性能没有问题。但是编译器应该能够在构建步骤中检测类型,所以像var xmlSerializer; 这样的代码根本无法编译。

【讨论】:

【参考方案5】:

它根据初始化时分配给它的内容声明一个类型。

一个简单的例子就是代码:

var i = 53;

将检查 53 的类型,并基本上将其重写为:

int i = 53;

请注意,虽然我们可以:

long i = 53;

var 不会发生这种情况。虽然它可以:

var i = 53l; // i is now a long

同样:

var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.

这对于复杂的类型来说可能是一个小小的便利。匿名类型更重要:

var i = from x in SomeSource where x.Name.Length > 3 select new x.ID, x.Name;
foreach(var j in i)
  Console.WriteLine(j.ID.ToString() + ":" + j.Name);

这里没有其他方法可以定义ij,而是使用var,因为它们所拥有的类型没有名称。

【讨论】:

【参考方案6】: 顾名思义,var 是没有任何数据类型的变量。 如果您不知道任何方法会返回哪种类型的数据,这种情况下使用 var 比较好。 var 是隐式类型,这意味着系统将自行定义数据类型。编译器将根据“=”运算符右侧的值推断其类型。 int/string 等是由您明确定义的显式类型。 Var 只能在方法中定义为局部变量 不能在单个语句中声明和初始化多个变量。例如,var i=1,j=2;无效。
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

【讨论】:

【参考方案7】:

var 是 C# 中的“上下文关键字”,这意味着您只能在使用该变量的同一类的上下文中隐式地将其用作局部变量。如果您尝试在从“Main”或其他外部类或接口调用的类中使用它,您将收到错误 CS0825 https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs0825 >

请参阅此处的文档中有关何时可以使用和不能使用它的备注:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables#remarks >

基本上,您应该只在声明具有隐含值的变量时使用它,例如“var myValue = “This is the value”;与说“字符串”相比,这可以节省一点时间,但恕我直言节省了大量时间,并限制了项目的可扩展性。

【讨论】:

以上是关于C#中的??是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

C#中的“对象被枚举”是啥意思?

C、C++ 和 C# 中的 void 是啥意思?

c#中的_Default关键字是啥意思

T-Sql 中的时间戳在 C# 中是啥意思?

C#中的??是啥意思

c#中的class是啥