Desde perguntas simples sobre as vantagens do C# até a ex­pli­ca­ção de di­fe­ren­tes elementos da linguagem de pro­gra­ma­ção e como eles podem ser usados, criamos uma lista das 10 perguntas mais im­por­tan­tes para uma en­tre­vista de emprego em C#.

Este artigo destaca dez perguntas comumente feitas em uma en­tre­vista de emprego para um cargo de de­sen­vol­vi­mento. Também incluímos respostas para cada uma dessas perguntas. Embora essas perguntas abranjam uma série de tópicos, de simples a de­ta­lha­dos, há muitas outras perguntas possíveis sobre C# e seus recursos especiais.

Este artigo fornece uma visão geral inicial das di­fe­ren­tes perguntas que podem ser feitas, desde as mais diretas até as mais es­pe­cí­fi­cas e que pedem de­ter­mi­na­dos detalhes. Este artigo também pode ajudá-lo a entender como se preparar para uma en­tre­vista que visa a testar seu co­nhe­ci­mento de uma linguagem de pro­gra­ma­ção es­pe­cí­fica.

Pergunta 1: Quais são os recursos especiais do C# e que vantagens a linguagem de pro­gra­ma­ção oferece?

Com seu ambiente de de­sen­vol­vi­mento especial Visual Studio, o C# é fun­da­men­tal­mente projetado para ve­lo­ci­dade. Como uma linguagem de pro­gra­ma­ção orientada a objetos, o C# também ganha pontos com seu de­sen­vol­vi­mento de apli­ca­ti­vos simples e moderno, que é versátil e poderoso. É por isso que muitos de­sen­vol­ve­do­res optam pelo C# ao decidir qual linguagem de pro­gra­ma­ção aprender.

O C# é fun­da­men­tal­mente es­tru­tu­rado em torno de classes e objetos, aderindo for­te­mente aos prin­cí­pios de tipagem. Ela oferece fun­ci­o­na­li­da­des como abstração, en­cap­su­la­mento e herança. A linguagem de pro­gra­ma­ção é destinada prin­ci­pal­mente ao de­sen­vol­vi­mento dentro do ecos­sis­tema Microsoft .NET.

Devido ao seu ali­nha­mento com a estrutura .NET, o C# tem sua própria estrutura, em que muitos tipos dentro das es­tru­tu­ras .NET herdam da classe de objeto. Como resultado, essas classes herdam métodos, pro­pri­e­da­des, campos e eventos. Essa estrutura hi­e­rár­quica facilita a con­sis­tên­cia e a in­te­ro­pe­ra­bi­li­dade no ecos­sis­tema .NET.

Pergunta 2: O que significa a clas­si­fi­ca­ção “objeto” em C#?

A com­pre­en­são dos objetos em C# depende da com­pre­en­são dos prin­cí­pios fun­da­men­tais da linguagem. Em sua essência, o C# é uma linguagem de pro­gra­ma­ção orientada a objetos, na qual as classes servem como base. Uma classe delineia a estrutura dos dados e determina como eles são ar­ma­ze­na­dos, ge­ren­ci­a­dos e trans­fe­ri­dos em C#. Es­sen­ci­al­mente, ela serve de modelo para todas as outras es­tru­tu­ras de dados.

Os objetos são elementos reais no C# que também ocupam valores reais na memória dis­po­ní­vel. Todas as entidades equipadas com ca­rac­te­rís­ti­cas muito es­pe­cí­fi­cas ou que executam uma tarefa es­pe­cí­fica no software podem ser con­si­de­ra­das objetos. O tipo de objeto é definido por uma classe, e as ins­tân­cias de classe formam a estrutura para sua estrutura adicional.

Por exemplo, digamos que estamos pro­je­tando um programa centrado em uma televisão. Primeiro, pre­ci­sa­mos definir uma entidade como ponto de partida. Nesse caso, po­de­ría­mos criar a classe “Te­le­vi­sion”. Dentro dessa classe, queremos definir cinco pro­pri­e­da­des: fa­bri­cante, modelo, cor, tamanho e preço. Essas pro­pri­e­da­des são membros da classe. Outros membros da classe podem ser eventos, métodos ou campos, os quais, em conjunto, formam um objeto.

Para programar uma Sony Bravia como uma instância de uma TV, podemos es­pe­ci­fi­car Sony, Bravia, Black, 50 e 500 como pro­pri­e­da­des ao criar esse objeto. Isso define as in­for­ma­ções sobre fa­bri­cante, modelo, cor, tamanho e preço. Portanto, a televisão Sony é uma instância da classe Te­le­vi­sion. Para tornar essa classe acessível, é im­por­tante defini-la como public e não como private or protected.

Pergunta 3: Qual é a diferença entre código ge­ren­ci­ado e não ge­ren­ci­ado em C#?

Código ge­ren­ci­ado

O código ge­ren­ci­ado em C# é todo código criado usando o .NET Framework. Esse tipo de código é executado di­re­ta­mente pelo Common Language Runtime (CLR). O CLR gerencia o ciclo de vida do código, inclusive a criação de objetos, a alocação de memória e o descarte de objetos.

Código não ge­ren­ci­ado

O código de­sen­vol­vido fora do .NET Framework é chamado de código não ge­ren­ci­ado. Essa categoria abrange todos os apli­ca­ti­vos que não são exe­cu­ta­dos sob o controle do CLR.

O .NET Framework fornece uma função que pode converter código não ge­ren­ci­ado em código ge­ren­ci­ado e vice-versa. Esse recurso é par­ti­cu­lar­mente útil, pois facilita a in­te­gra­ção perfeita da criação e execução de objetos, bem como o descarte de código dentro da estrutura.

Pergunta 4: Qual é a diferença entre struct e class?

Em C#, os termos class (class) e structure (struct) referem-se a tipos de dados definidos pelo usuário. No entanto, esses tipos de dados têm algumas di­fe­ren­ças fun­da­men­tais.

Estrutura

  • Como um tipo de valor em C#, as es­tru­tu­ras sempre herdam im­pli­ci­ta­mente de System.ValueType.
  • As es­tru­tu­ras não podem ser derivadas de outros tipos.
  • Em geral, uma estrutura é usada para quan­ti­da­des menores de dados.
  • As es­tru­tu­ras não podem ser abstratas e, portanto, exigem im­ple­men­ta­ção direta.
  • Não é possível atribuir um cons­tru­tor padrão a uma estrutura.
  • A criação de um objeto usando a new palavra-chave não é obri­ga­tó­ria.

Classe

  • Como um tipo de re­fe­rên­cia em C#, as classes sempre herdam im­pli­ci­ta­mente de System.Object.
  • As classes podem ser derivadas de outras classes, o que permite a herança.
  • Em geral, uma classe é usada para grandes quan­ti­da­des de dados ou es­tru­tu­ras mais complexas.
  • As classes podem ser abstratas, o que significa que não permitem ins­tan­ci­a­ção direta.
  • Em contraste com as es­tru­tu­ras, as classes podem ter um cons­tru­tor padrão, se ne­ces­sá­rio.
Dica

Embora as lin­gua­gens de pro­gra­ma­ção sejam di­fe­ren­tes em muitos aspectos, elas também têm muito em comum, es­pe­ci­al­mente quando se trata do que constitui um código ruim. Você pode encontrar mais in­for­ma­ções sobre práticas re­co­men­da­das de co­di­fi­ca­ção em nosso Guia Digital.

Pergunta 5: Qual é a diferença entre uma interface e uma classe abstrata em C#?

In­ter­fa­ces (in­ter­fa­ces) e classes abstratas (classes abstratas) ambos es­pe­ci­fi­cam classes de contrato de código, por exemplo, pré-condições ou in­va­ri­an­tes de objetos, para classes derivadas. Apesar dessa se­me­lhança, há muitas di­fe­ren­ças, como mostra a fun­ci­o­na­li­dade das in­ter­fa­ces e das classes abstratas.

As classes de contrato de código podem ser usadas para es­pe­ci­fi­car pré-condições, pós-condições e in­va­ri­an­tes de objeto. As condições prévias são re­qui­si­tos que devem ser atendidos ao entrar em um método ou pro­pri­e­dade.

Em termos de herança, as classes abstratas podem conter métodos com código im­ple­men­tado, além de métodos abstratos, enquanto as in­ter­fa­ces exigem que todos os métodos sejam abstratos. Por esse motivo, as classes abstratas precisam da palavra-chave abstract para de­cla­ra­ção.

Como o C# não oferece suporte à herança múltipla de classes, uma classe não pode herdar de mais de uma classe abstrata. En­tre­tanto, várias in­ter­fa­ces podem ser im­ple­men­ta­das por uma classe para permitir a herança múltipla de in­ter­fa­ces.

Uma classe abstrata pode ter cons­tru­to­res que podem ser invocados por classes derivadas. As in­ter­fa­ces não podem conter cons­tru­to­res porque não são ins­tân­cias e, portanto, não podem ser ini­ci­a­li­za­das.

Pergunta 6: O que são pro­pri­e­da­des em C#?

Em C#, as pro­pri­e­da­des são um elemento de uma classe que permite que você leia, grave ou calcule o valor de um campo declarado de forma privada. As pro­pri­e­da­des podem ser usadas para acessar in­ter­fa­ces públicas ou permitir al­te­ra­ções nos dados ar­ma­ze­na­dos em uma classe.

As pro­pri­e­da­des são um aspecto fun­da­men­tal da pro­gra­ma­ção orientada a objetos em C e são comumente usadas em apli­ca­ti­vos para fornecer acesso limpo e seguro aos dados da classe.

Elas são de­cla­ra­das usando os get e set acessores, que definem o com­por­ta­mento de leitura ou con­fi­gu­ra­ção do valor da pro­pri­e­dade. O get acessor recupera o valor da pro­pri­e­dade, enquanto o set acessor define o valor da pro­pri­e­dade. Uma pro­pri­e­dade pode ter um ou ambos os acessores. Isso depende do fato de a pro­pri­e­dade ser (ou dever ser) apenas leitura ou leitura/gravação.

Pergunta 7: O que significa boxing e unboxing em C#?

Boxing e unboxing são usados em C# para con­ver­sões de tipos.

  • A conversão de um tipo de valor para um tipo de re­fe­rên­cia é conhecida como boxing. Isso poderia, por exemplo, converter um tipo de dados simples como int para o tipo de dados object. O boxe é uma conversão implícita.
  • A conversão de um tipo de re­fe­rên­cia para um tipo de valor, por outro lado, é chamada de unboxing. O unboxing só pode ocorrer com o tipo de valor exato que foi ori­gi­nal­mente en­cai­xo­tado, por exemplo, con­ver­tendo object de volta para int.

Pergunta 8: O que é enu­me­ra­ção(enum) e para que ela é usada em C#?

Um enum é um tipo de valor com um conjunto de cons­tan­tes nomeadas re­la­ci­o­na­das. Esse grupo também é chamado de “lista de enu­me­ra­do­res”. Em C#, os enums são tipos de dados enu­me­ra­dos que são pri­mi­ti­vos e definidos pelo usuário. A palavra-chave enum é usada para declarar uma enu­me­ra­ção.

Os enums no .NET Framework são uti­li­za­dos para criar cons­tan­tes numéricas. Cada membro de um enum é do tipo enum, e é ne­ces­sá­rio um valor numérico para cada tipo de enum. Esses valores de enum são imutáveis. Os enums podem ser re­pre­sen­ta­dos como cadeias de ca­rac­te­res e ma­ni­pu­la­dos como números inteiros.

O tipo padrão do elemento de enu­me­ra­ção é int. Por padrão, o primeiro enu­me­ra­dor tem o valor 0 e o valor de cada enu­me­ra­dor sucessivo é aumentado em 1. No entanto, esses valores também podem ser definidos ma­nu­al­mente, por exemplo, 10 = Ligado e 20 = Desligado.

Pergunta 9: Qual é a diferença entre Dispose e Finalize em C#?

Em C#, ambos os métodos são usados para liberar recursos.

O método Dispose libera recursos não ge­ren­ci­a­dos, como conexões de banco de dados que não são ge­ren­ci­a­das au­to­ma­ti­ca­mente pelo host de tempo de execução do .NET. Nor­mal­mente, ele é im­ple­men­tado em uma classe. Essa, por sua vez, im­ple­menta a interface IDis­po­sa­ble, que define o método Dispose.

Esse método é chamado ex­pli­ci­ta­mente pelo código do cliente para liberar recursos que não são mais ne­ces­sá­rios. Como al­ter­na­tiva, ele pode ser chamado im­pli­ci­ta­mente com a instrução using , ga­ran­tindo que o método Dispose seja chamado quando o objeto sair do escopo.

O método Finalize, por outro lado, é empregado para executar operações de limpeza em um objeto ime­di­a­ta­mente antes do processo de coleta de lixo. Como resultado, ele é nor­mal­mente im­ple­men­tado em uma classe que substitui o método Object.Finalize.

Pergunta 10: Quais são as vantagens dos métodos de extensão em C#?

Os métodos de extensão permitem que os de­sen­vol­ve­do­res expandam a fun­ci­o­na­li­dade de um tipo existente sem alterar o tipo original ou criar um novo tipo derivado. Eles permitem que métodos sejam adi­ci­o­na­dos a classes, es­tru­tu­ras, in­ter­fa­ces, enums etc. exis­ten­tes, mesmo que os métodos não tenham sido definidos ini­ci­al­mente no tipo.

Os métodos de extensão são de­cla­ra­dos em uma classe estática e definidos como métodos estáticos, apre­sen­tando um primeiro parâmetro exclusivo chamado this. Esse parâmetro es­pe­ci­fica o tipo que está sendo estendido, per­mi­tindo que o método de extensão seja invocado como se fosse um método de instância desse tipo.

Que tipos de perguntas posso esperar em uma en­tre­vista sobre C#?

Saber quem está en­tre­vis­tando você pode lhe dar mais in­for­ma­ções sobre a natureza das perguntas que lhe serão feitas. Às vezes, os re­cru­ta­do­res não têm o co­nhe­ci­mento ne­ces­sá­rio para dis­cus­sões apro­fun­da­das sobre áreas es­pe­ci­a­li­za­das, como ca­te­go­rias ou objetos em C#. Portanto, se o en­tre­vis­ta­dor for um líder técnico ou um membro da equipe de de­sen­vol­vi­mento, é mais provável que as perguntas da en­tre­vista se apro­fun­dem em conceitos e ha­bi­li­da­des de pro­gra­ma­ção es­pe­cí­fi­cos.

Se o arquiteto líder de software ou o de­sen­vol­ve­dor da Web estiver presente, é provável que ele faça perguntas es­pe­ci­a­li­za­das, prin­ci­pal­mente se você estiver se can­di­da­tando a funções além do nível de entrada. Isso ocorre porque os futuros colegas querem saber como o novo membro da equipe poderá ajudá-los em suas tarefas diárias.

Ir para o menu principal