C#中null和空和的区别

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

           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的值为零长度字符串 ""。


  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
委托和事件是 C# 非常重要的概念,它们可以用于实现事件驱动型编程模型。在 C# ,委托可以被看作是函数指针,它允许将方法作为参数传递到其他方法,并且可以在其他方法调用传递进来的方法。而事件则是一种特殊的委托,它用于在类的内部触发和处理特定的动作或状态变化。 一、委托 1.定义 在 C# ,委托是一种类型,它可以用于存储对方法的引用。委托类型定义的语法如下: ``` delegate returnType methodName(params) ``` 其,returnType 表示方法的返回类型,而 methodName 和 params 分别表示方法的名称和参数列表。 例如,我们可以定义一个委托类型,用于存储一个接受 int 类型参数并返回 string 类型的方法引用: ``` delegate string MyDelegate(int x); ``` 2.使用 定义委托类型之后,我们可以创建委托实例,并将方法作为参数传递给委托实例。例如,假设我们有一个方法: ``` static string MyMethod(int x) { return "Hello, " + x; } ``` 我们可以创建一个 MyDelegate 委托实例,并将 MyMethod 方法作为参数传递给它: ``` MyDelegate del = new MyDelegate(MyMethod); ``` 此时,我们可以通过调用委托实例来调用 MyMethod 方法: ``` string result = del(123); ``` 这将会返回字符串 "Hello, 123"。 3.多播委托 在 C# ,委托还支持多播(multicast)功能,即一个委托实例可以引用多个方法,这些方法将会依次被调用。例如,我们可以定义两个方法: ``` static string Method1(int x) { return "Method1: " + x; } static string Method2(int x) { return "Method2: " + x; } ``` 并将它们作为参数传递给一个委托实例: ``` MyDelegate del = new MyDelegate(Method1); del += new MyDelegate(Method2); ``` 此时,调用委托实例将会依次调用 Method1 和 Method2 方法,并返回它们的结果。 二、事件 1.定义 在 C# ,事件是一种特殊的委托,它用于在类的内部触发和处理特定的动作或状态变化。事件的定义语法如下: ``` public event EventHandler EventName; ``` 其,EventHandler 是一个预定义的委托类型,它的定义如下: ``` public delegate void EventHandler(object sender, EventArgs e); ``` EventHandler 委托类型包含两个参数:一个 object 类型的 sender,表示事件的发送者;一个 EventArgs 类型的 e,表示事件的参数。 例如,我们可以定义一个事件,用于在类的内部触发和处理某个动作: ``` public event EventHandler MyEvent; ``` 2.使用 在类的内部,我们可以通过调用事件来触发特定的动作或状态变化。例如,我们可以定义一个方法,用于触发 MyEvent 事件: ``` protected virtual void OnMyEvent(EventArgs e) { MyEvent?.Invoke(this, e); } ``` 在该方法,我们调用了 MyEvent 委托实例,并传递了当前对象和事件参数。MyEvent?.Invoke() 表示只有在 MyEvent 委托实例不为 null 时才会调用它,这可以避免引用异常。 在类的外部,我们可以注册事件处理程序来处理 MyEvent 事件。例如,假设我们有一个类: ``` class MyClass { public event EventHandler MyEvent; public void DoSomething() { // 触发 MyEvent 事件 OnMyEvent(EventArgs.Empty); } protected virtual void OnMyEvent(EventArgs e) { MyEvent?.Invoke(this, e); } } ``` 我们可以在另一个类注册 MyEvent 事件处理程序: ``` class OtherClass { public void HandleMyEvent(object sender, EventArgs e) { Console.WriteLine("MyEvent has been handled."); } } OtherClass other = new OtherClass(); MyClass myClass = new MyClass(); myClass.MyEvent += new EventHandler(other.HandleMyEvent); ``` 此时,当调用 myClass.DoSomething() 方法时,会触发 MyEvent 事件,并调用 other.HandleMyEvent() 方法来处理它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值