c# null

2016-11-17 14:12:04 wangzhen209 阅读数 3331

string是引用类型;

string str = null 没有创建内存空间,str中存放的是空引用指针;

string str = "" 创建了内存空间,str中存放的是指向堆中的指针。

 

简单地说:

string str ="";

给你一张白纸;

string str = null;

连白纸也没有。

 

string.Empty就相当于"" 

一般用于字符串的初始化 

比如: 

string a; 

Console.WriteLine(a);//这里会报错,因为没有初始化

 

而下面不会报错: 

string a=string.Empty; 

Console.WriteLine(a); 

 

或者用于比较: 

if(a=="") 

if(a==string.Empty) 

上面两句是一样的效果。

 

string.Empty不分配存储空间

""分配一个长度为空的存储空间  

所以一般用string.Empty

 

为了以后跨平台,还是用string.empty

 

 C# 中,大多数情况下 ""  string.Empty 可以互换使用。比如:

string s = "";

string s2 = string.Empty;

 

if (s == string.Empty) {

 // 

if语句成立 

 

判定为空字符串的几种写法,按照性能从高到低的顺序是:

s.Length == 0 优于 s == string.Empty 优于 s == "" 


您关于String.EmptyNull的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty string str2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。textBox1.Text的值为零长度字符串 ""



问题来自于对控件的Text属性理解错误。

一:null和空的区别

1.声明的string类型的变量和属性以及字段在未赋值的情况下均为null,这个null不仅仅表示为无字符,更表示为空的引用。

比如:string userName;此时判断userName是否为空应该是if(userName==null)而不是if(userName==“”),并且使用userName.Equals(null)或userName.Equals(“”)均为错的,因为此时userName是个空引用,根本无法调用Equals()方法。但是如果声明为string userName=“”,则上述方法均成立。但是此时userName并不是null而是空值。

2.所有控件的Text属性的在未赋值的情况下是空值(""), 而不是null。



2017-09-08 10:14:51 sinat_39443940 阅读数 3479

上午在写代码的时候,用到了取服务器控件属性,并判断有没有取值的问题 

           string pictureName = "";

           string uploadName = InputFile.Value;

           if (uploadName != "")           //这里要用"",不能用null

                   {        }

这里判断要用"",而不是用null,用null则会报错。

 

于是查了一些资料:

 

问题来自于对控件的Text属性理解错误。

一:null和空的区别

1.声明的string类型的变量和属性以及字段在未赋值的情况下均为null,这个null不仅仅表示为无字符,更表示为空的引用。

比如:string userName;此时判断userName是否为空应该是if(userName==null)而不是if(userName==“”),并且使用userName.Equals(null)或userName.Equals(“”)均为错的,因为此时userName是个空引用,根本无法调用Equals()方法。

但是如果声明为string userName=“”,则上述方法均成立。但是此时userName并不是null而是空值。

2.所有控件的Text属性的在未赋值的情况下是空值(""), 而不是null。

 

string是引用类型;

string str = "" 创建了内存空间,str中存放的是指向堆中的指针。

string str = null 没有创建内存空间,str中存放的是空引用指针;

简单地说:

string str ="";

给你一张白纸;

string str = null;

连白纸也没有。

 

而string.Empty就相当于"" 

一般用于字符串的初始化 

比如: 

string a; 

Console.WriteLine(a);//这里会报错,因为没有初始化a 

 

而下面不会报错: 

string a=string.Empty; 

Console.WriteLine(a); 

 

或者用于比较: 

if(a=="") 

if(a==string.Empty) 

上面两句是一样的效果。

 

string.Empty不分配存储空间

""分配一个长度为空的存储空间  

所以一般用string.Empty

 

为了以后跨平台,还是用string.empty

 

在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。比如:

string s = "";

string s2 = string.Empty;

if (s == string.Empty) {

 // 

if语句成立 

 

判定为空字符串的几种写法,按照性能从高到低的顺序是:

s.Length == 0 优于 s ==string.Empty 优于 s == "" 

 

关于String.Empty和Null的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty和 stringstr2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。textBox1.Text的值为零长度字符串 ""。


2019-04-07 00:39:00 weixin_33720078 阅读数 1886

一、空值判断效率
string s = "";

  1. if(s == ""){}
  2. if(s == string.Empty){}
  3. if (string.IsNullOrEmpty(s)) {}
  4. if(s != null && s.Length ==0) {}
  5. if((s+"").Length == 0){}

1,2最慢;3较快;4,5最快
1,2几乎没区别;4,5几乎没区别

二、空值和null判断

  1. if (string.IsNullOrEmpty(s)) {}
  2. if(s == null || s.Length == 0) {}
  3. string.IsNullOrWhiteSpace性能更高

推荐用2,3

转载于:https://www.cnblogs.com/wsq-blog/p/10663815.html

2018-08-07 13:32:24 qq_36664495 阅读数 2756

一、含义:

可以为null的类型,表示为该值在该类型范围中,还可以取null值。

比如:int值是-2,147,483,648 到 2,147,483,647 ,默认值是 0,不包含null值,但是int? a=null;就包含null值。

二、声明格式:

可以通过如下两种方式申明可为空的类型:

  1. System.Nullable<T> variable;
  2. T?variable;

T 是可以为 null 的类型的基础类型。 T 可以是包括 struct 在内的任意值类型;它不能是引用类型,引用类型已经支持为null。引用类型可以设置为空,表示它未初始化。

三、特征:

  1. 可以为 null 的类型表示可以向其赋值 null 的值类型变量。 

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

  3. 向可以为 null 的类型赋值的方法与向一般值类型赋值的方法相同,如 int? x = 10;double? d = 4.108;也能够向可以为 null 的类型赋值 nullint? x = null;

  4. 使用 Nullable<T>.GetValueOrDefault 方法可返回分配的值或基础类型的默认值(如果值为 null 的话)。例如,int j = x.GetValueOrDefault();

  5. 使用 HasValueValue 只读属性可测试是否存在 null 值并检索值,如以下示例所示:if(x.HasValue) j = x.Value;

    1. 如果变量包含值,则 HasValue 属性返回 true;如果值为 null,则返回 false

    2. 如果已赋值,则 Value 属性返回值。 否则,将会引发 System.InvalidOperationException

    3. HasValue 的默认值为 falseValue 属性没有默认值。

    4. 还能将 ==!= 运算符与可以为 null 的类型结合使用,如以下示例所示:if (x != null) y = x;

  6. 将当前值为 null 的可为 null 的类型赋值给不可为 null 的类型时,可以使用 ?? 运算符赋予默认值,例如 int? x = null; int y = x ?? -1;

  7. 不得嵌套可以为 null 的类型。 无法编译下面的一行代码:Nullable<Nullable<int>> n;

注:参考https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/nullable-types/index

2019-07-10 22:54:29 qq_34573534 阅读数 230

在C#中,int、bool、DateTime 等值类型的数据不可以为 null 。

值类型的特点:值传递。

string、person 等属于引用类型,其值可以为 null 。

值类型和引用类型的区别是:传递数据时,值类型是值传递(拷贝传递),可以为 null ;引用类型是引用传递,不可以为 null 。

----------------------------------------------------

注意:以上是在C#中。在数据库中,int、bool、DateTime 等是可以为 null 的。

----------------------------------------------------

如果数据库里面存的是 NULL,那么在 C# 中用 row["TelPhone"] 取出来的数据的值是 DBNull.value , 这是ADO.Net 对于 C# 中 int 不可以为 null 、数据库中int可以为 null 的一个权衡。DBNull.Value 不等于 null 。

以下两行代码的效果是一样,但是推荐使用第二行,因为代码量比较少。

            if (row["TelPhone"]==DBNull.Value)//在ado.net中判断字段值是否为null的标准方法
            if (row.IsNull("TelPhone"))//更简单的判断数据库中字段值为null的方法

在值类型后加?就成为了可空类型。如:

int? i = null; //加了?了,所以这里的i是可控类型
i = 90;
i++;

再比如:

        public static int? GetAge()
        {
            if (DateTime.Now.Second % 2 == 0)
            {
                return 20;
            }
            else
            {
                return null;
            }
        }

 

C# DBNull和null说明

阅读数 7995