Percursos
/
C#
C#
/
Exercícios
/
Tim do marketing
Tim do marketing

Tim do marketing

Exercício de aprendizagem

Introdução

Anulabilidade

Em C#, o literal null é usado para denotar a ausência de um valor. Um tipo anulável é um tipo que permite valores null.

Antes do C# 8.0, os tipos de referência eram sempre anuláveis e os tipos de valor não. Um tipo de valor pode tornar-se anulável acrescentando-lhe um ponto de interrogação (?).

string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable

int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable

int? nullableValueType = 5; // Define nullable value type
nullableValueType = null;   // Valid as type is nullable

Aceder ao membro de uma variável nula não causa um erro de compilação, mas faz com que seja lançada uma NullReferenceException em tempo de execução:

string sentence = null;

// Throws NullReferenceException at runtime
sentence.Length;

Para contrariar este tipo comum de erro, o C# 8 permite aderir a uma funcionalidade que torna os tipos de referência não anuláveis por predefinição:

string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)

string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable

Para trabalhar em segurança com valores anuláveis, verifica se são null antes de os usar:

string NormalizedName(string? name)
{
    if (name == null)
    {
        return "UNKNOWN";
    }

    // Value is not null at this point, so no compile warning
    // and no runtime NullReferenceException being thrown
    return name.ToUpper();
}

NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"

O operador ?? permite devolver um valor predefinido quando o valor é null:

string? name1 = "John";
name1 ?? "Paul"; // => "John"

string? name2 = null;
name2 ?? "George"; // => "George"

O operador ?. permite chamar membros em segurança num valor que pode ser null:

string? fruit = "apple";
fruit?.Length; // => 5

string? vegetable = null;
vegetable?.Length; // => null

Instruções

Neste exercício vais escrever código para imprimir crachás com o nome dos funcionários da fábrica.

1. Imprime um crachá para um funcionário

Os funcionários têm um ID, um nome e o nome do departamento. Os crachás dos funcionários são formatados da seguinte forma: "[id] - name - DEPARTMENT". Implementa o método (static) Badge.Print() para devolver o crachá de um funcionário:

Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"

Repara que o departamento deve ficar em maiúsculas no crachá.

2. Imprime um crachá para um funcionário novo

Devido a uma particularidade do sistema informático, os funcionários novos às vezes ainda não têm um ID quando começam a trabalhar na fábrica. Como os crachás são obrigatórios, recebem um crachá temporário sem o prefixo do ID. Modifica o método (static) Badge.Print() para suportar funcionários novos que ainda não têm um ID:

Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"

3. Imprime um crachá para o proprietário

Até o proprietário da fábrica tem de usar um crachá em todos os momentos. No entanto, o proprietário não tem departamento. Nesse caso, o crachá deve imprimir "OWNER" em vez do nome do departamento. Modifica o método (static) Badge.Print() para imprimir um crachá para o proprietário:

Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"

Repara que é possível que o proprietário seja também um funcionário novo:

Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Editar via GitHub A ligação abre numa nova janela ou separador
C# Exercism

Estás pronto para começar Tim do marketing?

Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.