[NET]C#中的using和as操作符的用法

C#中的using和as操作符的用法

1、using

  按照msdn的解释:

  using 语句定义对象的有效范围,在此范围的末尾销毁对象。

  举例:

class TestUsing:IDisposable
{
 public void Dispose()
 {
  Console.WriteLine("Dispose");
 }

 public void Method()
 {
  Console.WriteLine("Do a method");
 }
}


  调用这个类:

using(TestUsing tu=new TestUsing())
{
 tu.Method();
}

  可以看到先后输出了Do a method和Dispose。

  备注:实例化的对象必须实现 System.IDisposable 接口

  2、as

  msdn这么说:

  as 运算符用于执行可兼容类型之间的转换。

  as 运算符类似于类型转换,所不同的是,当转换失败时,as 运算符将产生空,而不是引发异常。在形式上,这种形式的表达式:

expression as type

   等效于:

expression is type ? (type)expression : (type)null

  只是 expression 只被计算一次。

  请注意,as 运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用 cast 表达式来代替其执行。

  举例:

object [] arr=new object[2];
arr[0]=123;
arr[1]="test";
foreach(object o in arr)
{
 string s=(string)o;
 Console.WriteLine(s);
}

  这样的代码在转换类型失败的时候引发异常,代码修改成:

object [] arr=new object[2];
arr[0]=123;
arr[1]="test";
for(int i=0;i<arr.Length;i++)
{
 string s=arr[i] as string;
 if(s!=null)Console.WriteLine(i+":"+s);
}

  可以看到输出了1:test,虽然arr[0]处转换失败但是没有引发异常而是返回了null

  备注:as必须和引用类型一起使用(int等值类型不能使用)。  
虽然 C# 不支持直接重载 `=` 赋值操作符,但是我们可以通过实现 `IEquatable<T>` 接口和 `Clone` 方法来实现类的赋值操作。下面是一个例子: ```csharp using System; public class Person : IEquatable<Person>, ICloneable { public string Name { get; set; } public int Age { get; set; } public bool Equals(Person other) { if (other == null) return false; return (this.Name.Equals(other.Name) && this.Age == other.Age); } public override bool Equals(object obj) { if (obj == null) return false; Person personObj = obj as Person; if (personObj == null) return false; else return Equals(personObj); } public override int GetHashCode() { return this.Name.GetHashCode() ^ this.Age.GetHashCode(); } public object Clone() { return new Person { Name = this.Name, Age = this.Age }; } public static bool operator ==(Person person1, Person person2) { if (((object)person1) == null || ((object)person2) == null) return Object.Equals(person1, person2); return person1.Equals(person2); } public static bool operator !=(Person person1, Person person2) { if (((object)person1) == null || ((object)person2) == null) return !Object.Equals(person1, person2); return !(person1.Equals(person2)); } } ``` 在这个例子,我们重载了 `==` 和 `!=` 运算符来比较两个 `Person` 对象是否相等。我们也实现了 `IEquatable<T>` 接口和 `Equals` 方法来比较两个 `Person` 对象是否相等。还实现了 `ICloneable` 接口和 `Clone` 方法来实现对象的克隆。这样,我们就可以在需要时使用 `=` 赋值操作符进行类的赋值操作了。例如: ```csharp Person person1 = new Person { Name = "Tom", Age = 20 }; Person person2 = new Person { Name = "Tom", Age = 20 }; Person person3 = person1.Clone() as Person; Console.WriteLine(person1 == person2); // true Console.WriteLine(person1 == person3); // true person1.Age = 30; Console.WriteLine(person1.Age); // 30 Console.WriteLine(person3.Age); // 20 person3 = person1; Console.WriteLine(person1 == person3); // true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值