用is和as检查和转换兼容类型
2008-09-01 23:02
281 查看
以前,需要检查一个实例的类型时,我都使用强制转换操作。还在刚Pascal转到C++的时候,是这样写的,感觉有代码有点笨拙。
(C#代码)
bool CheckIsType(object source)
{
try
{
TagClass result = (TagClass)source;
return true;
}
catch
{
return false;
}
}
后来发现了object.GetType(),但是很难去判断实例的类型是否兼容。现在我向大家推荐is和as运算符.
is 检查对象是否与给定类型兼容。
as 运算符用于在兼容的引用类型之间执行转换。
为什么推荐给各位:
as 运算符类似于强制转换操作。如果无法进行转换, as 返回 null ,而强制转换会引发异常。
有些情况下我们也只是想判断类型,没有必要去做转换,那么我们就可以用is了。
以下是as的例子(代码引用自MSDN):
using System;
class Class1
{
}
class Class2
{
}
class MainClass
{
static void Main()
{
object[] objArray = new object[6];
objArray[0] = new Class1();
objArray[1] = new Class2();
objArray[2] = "hello";
objArray[3] = 123;
objArray[4] = 123.4;
objArray[5] = null;
for (int i = 0; i < objArray.Length; ++i)
{
string s = objArray[i] as string;
Console.Write("{0}:", i);
if (s != null)
{
Console.WriteLine("'" + s + "'");
}
else
{
Console.WriteLine("not a string");
}
}
}
}
以下是is的例子(代码引用自MSDN):
using System;
class Class1
{
}
class Class2
{
}
class IsTest
{
static void Test(object o)
{
Class1 a;
Class2 b;
if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;
// Do something with "a."
}
else if (o is Class2)
{
Console.WriteLine("o is Class2");
b = (Class2)o;
// Do something with "b."
}
else
{
Console.WriteLine("o is neither Class1 nor Class2.");
}
}
static void Main()
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Test(c1);
Test(c2);
Test("a string");
}
}
(C#代码)
bool CheckIsType(object source)
{
try
{
TagClass result = (TagClass)source;
return true;
}
catch
{
return false;
}
}
后来发现了object.GetType(),但是很难去判断实例的类型是否兼容。现在我向大家推荐is和as运算符.
is 检查对象是否与给定类型兼容。
as 运算符用于在兼容的引用类型之间执行转换。
为什么推荐给各位:
as 运算符类似于强制转换操作。如果无法进行转换, as 返回 null ,而强制转换会引发异常。
有些情况下我们也只是想判断类型,没有必要去做转换,那么我们就可以用is了。
以下是as的例子(代码引用自MSDN):
using System;
class Class1
{
}
class Class2
{
}
class MainClass
{
static void Main()
{
object[] objArray = new object[6];
objArray[0] = new Class1();
objArray[1] = new Class2();
objArray[2] = "hello";
objArray[3] = 123;
objArray[4] = 123.4;
objArray[5] = null;
for (int i = 0; i < objArray.Length; ++i)
{
string s = objArray[i] as string;
Console.Write("{0}:", i);
if (s != null)
{
Console.WriteLine("'" + s + "'");
}
else
{
Console.WriteLine("not a string");
}
}
}
}
以下是is的例子(代码引用自MSDN):
using System;
class Class1
{
}
class Class2
{
}
class IsTest
{
static void Test(object o)
{
Class1 a;
Class2 b;
if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;
// Do something with "a."
}
else if (o is Class2)
{
Console.WriteLine("o is Class2");
b = (Class2)o;
// Do something with "b."
}
else
{
Console.WriteLine("o is neither Class1 nor Class2.");
}
}
static void Main()
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Test(c1);
Test(c2);
Test("a string");
}
}
相关文章推荐
- swift--使用 is 和 as 操作符来实现类型检查和转换 / AnyObject与Any的区别
- Kotlin 其他(四) --- 类型的检查与转换“is”与“as”
- c# as is 类型转换
- [C#] as 和 is 运算符以及安全的类型强制转换
- 浅谈类型转换操作符is/as
- c# as is 类型转换
- Swift - 类型判断is 与 类型转换as
- c# as is 类型转换
- 《Effective C#》Item 3:使用as和is操作符来做类型转换
- 转:《Effective C#》Item 3:使用as和is操作符来做类型转换
- C#引用类型转换,到底使用is,as还是显式强转?
- 浅谈类型转换操作符is/as
- CLR via 笔记4.2 类型转换 is 与 as 区别
- Swift 类型的检査与转换(is,as,AnyObject,Any)
- c# as is 类型转换
- 数据类型检查(is、as、typeof、in、instanceof)
- C#中数据类型的安全转换(is,as)
- C#中数据类型的安全转换(is,as)
- 数据类型检查(is、as、typeof、in、instanceof)
- 类型转换(二):是使用 is 还是 as