C# 为什么需要typeof?
我一直在想:为什么C#中需要运算符类型?编译器难道不知道,C# 为什么需要typeof?,c#,C#,我一直在想:为什么C#中需要运算符类型?编译器难道不知道,公共类Animal只是一个定义上的类型吗?当我需要引用类型时,为什么我需要指定SomeMethod(typeof(Animal))。当您可以检查类型本身时,就可以使用许多可能性,而不必只知道它公开了什么,或者它是否存在。typeof(Class)是将类型表示为文本的唯一方法。当你写Class.SomeField时,你指的是静态字段。当你写typeof(Class)时,SomeField你引用ClassType对象的字段,该对象代表你的类。
公共类Animal
只是一个定义上的类型吗?当我需要引用类型时,为什么我需要指定SomeMethod(typeof(Animal))
。当您可以检查类型本身时,就可以使用许多可能性,而不必只知道它公开了什么,或者它是否存在。typeof(Class)
是将类型表示为文本的唯一方法。当你写Class.SomeField时,你指的是静态字段。当你写typeof(Class)时,SomeField
你引用ClassType
对象的字段,该对象代表你的类。Animal
只是类型的名称,typeof(Animal
)返回实际的类型对象(System.Type
实例)。当然,可能只是让类型名在代码中返回类型对象,但这会使编译器/解析器的工作更加困难(识别类型名何时意味着typeof或其他内容)-因此存在typeof
关键字。它还可以使代码更清晰易读。typeof()允许我获取类型对象的实例,而不必手头有目标对象的实例。这反过来让我可以在没有实例的情况下询问有关类的问题。那么,如果不使用typeof operator,如何在不先实例化类的情况下获得系统。类的类型?很简单,你不能:D
由于您可以仅使用System.Type执行许多反射操作,因此此运算符非常方便。没有typeof确实会导致歧义:
class foo
{
public static string ToString()
{
return "Static";
}
}
public class Program
{
private static void Main(string[] args)
{
Console.WriteLine(foo.ToString());
Console.WriteLine(typeof(foo).ToString());
}
}
foo
和typeof(foo)
指的不是同一件事,强迫编译器假装它们是一个坏主意,即使我们忽略了这种歧义。是的,但问题是:为什么?@Daniel Earwicker为什么?区分静态成员和类型的成员。啊,我明白了,错过了答案的那部分,哦+1您还可以为属性命名,如类型(常见于颜色等),这可能会让您更加困惑。事实上。。。它要求编译器非常聪明,以便稍微缩短代码。我相信我们要找的词是“歧义”。有些情况下,someVariable.GetType()==Animal
可能不明确。前面代码段中的Animal
是类定义还是成员?如果未使用typeof
,则Animal
必须是成员。如果使用了typeof
,那么Animal
必须是一个类定义。不确定它是否一定是模糊的……至少在理论上是这样,但不清楚,是的。@Noldorin:请参阅我的答案,了解一个人为的强迫模糊示例。