Respostas:
As respostas diferentes aqui têm dois significados diferentes.
Se você deseja verificar se uma instância é de um tipo exato ,
if (c.GetType() == typeof(TForm))
é o caminho a percorrer.
Se você quiser saber se cé uma instância TForm ou subclasse , use is/ as:
if (c is TForm)
ou
TForm form = c as TForm;
if (form != null)
Vale a pena ficar claro em sua mente sobre qual desses comportamentos você realmente deseja.
ise ascom a correspondência de padrões:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
ou se você planeja usar ccomo a TForm, use o seguinte exemplo:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
O segundo exemplo só precisa verificar se cé do tipo TFormuma vez. Onde você verifica se cé do tipo e TFormdepois o lança, o CLR passa por uma verificação extra. Aqui está uma referência .
Edit: Roubado de Jon Skeet
Se você quiser ter certeza de que cé TForme não uma classe herdada TForm, use
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Sim, a palavra-chave "é":
if (c is TForm)
{
...
}
Veja detalhes no MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Verifica se um objeto é compatível com um determinado tipo. Por exemplo, pode ser determinado se um objeto é compatível com o tipo de sequência como este:
Além disso, um pouco na mesma linha
Type.IsAssignableFrom(Type c)
"True se c e o tipo atual representam o mesmo tipo, ou se o tipo atual está na hierarquia de herança de c, ou se o tipo atual é uma interface que c implementa, ou se c é um parâmetro de tipo genérico e o tipo atual representa uma das restrições de c. "
A partir daqui: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())semelhante ao instanceofoperador Java .
T1.IsAssignableFrom(T2)retorna trueem situações em que o asoperador retorna um valor não nulo, dadas as instâncias desses tipos.
Um pouco mais compacto que as outras respostas, se você quiser usar c como um TForm:
if(c is TForm form){
form.DoStuff();
}
Como outros já mencionaram, a palavra-chave "é". No entanto, se mais tarde você o converter nesse tipo, por exemplo.
TForm t = (TForm)c;
Então você deve usar a palavra-chave "as".
por exemplo TForm t = c as TForm.
Então você pode conferir
if(t != null)
{
// put TForm specific stuff here
}
Não combine como é porque é uma verificação duplicada.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
ou mais simples
bool isValid = c.GetType() == typeof(TForm);
==). Em objetos ou linguagens orientadas que suportam herança, a menos que você saiba que seu tipo específico nunca será herdado de, por exemplo, uma sealedclasse. Além disso: o uso de um operador ternário retornando valores booleanos (estáticos / constantes) me incomoda, eu ficaria menos incomodado se fosse uma switchdeclaração.
instanceofe C #issão maneiras muito melhores de fazê-lo.