quiz Informatique · 10 questions

Fundamentals of C# Language

help_outline 10 questions
timer ~5 min
auto_awesome AI-generated
0 / 10
Score : 0%
1

Which keyword must be used to declare a method that can be called without creating an instance of its class?

2

In C#, what is the effect of declaring a method parameter with the keyword 'ref'?

3

Which of the following statements about C# structs is true?

4

When overriding a virtual method in a derived class, which keyword must be used in the method declaration?

5

What is the purpose of the 'using' directive in a C# source file?

6

Which C# feature enables a class to provide a custom indexer allowing array-like access to its instances?

7

What happens when a C# program attempts to cast an object to an incompatible reference type using the 'as' operator?

8

Which statement correctly describes the behavior of a 'foreach' loop in C#?

9

In C#, what is the purpose of implementing the IDisposable interface in a class?

10

Which of the following correctly describes the effect of the 'sealed' keyword on a class in C#?

menu_book

Fundamentals of C# Language

Review key concepts before taking the quiz

Fundamentals of C# Language: Core Concepts Explained

Welcome to this comprehensive guide on the Fundamentals of C#. Whether you are a beginner or need a quick refresher, this course covers the essential topics that appear in many quizzes and real‑world projects. Each section explains a key concept, provides practical examples, and highlights common pitfalls to avoid.

1. Static Methods – Calling Code Without an Instance

In C#, a method declared with the static keyword belongs to the type itself rather than to any particular object. This means you can invoke the method directly using the class name, without creating an instance first.

  • Syntax: public static ReturnType MethodName(parameters) { … }
  • Typical uses: utility functions, factory methods, and entry points such as Main.

Example:

public class MathHelper
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

int sum = MathHelper.Add(3, 5); // No "new MathHelper()" required

Remember that static members cannot access instance members directly because they do not have a this reference.

2. The ref Keyword – Passing Arguments by Reference

When you declare a method parameter with ref, the argument is passed by reference. This allows the method to modify the caller's variable, and the changes persist after the method returns.

  • Requirement: The variable must be initialized before it is passed.
  • Declaration: void UpdateValue(ref int number)
  • Call site: UpdateValue(ref myNumber);

Example:

void Increment(ref int value)
{
    value += 1; // Modifies the original variable
}

int counter = 10;
Increment(ref counter);
// counter is now 11

Using ref is different from out, which does not require the variable to be initialized but forces the method to assign a value before returning.

3. Structs – Value Types on the Stack

In C#, structs are value types. They are stored directly on the stack (or inline within other objects) and are copied on assignment. This behavior contrasts with classes, which are reference types allocated on the heap.

  • Key characteristics:
    • Cannot inherit from another struct or class (except System.ValueType).
    • Can implement interfaces.
    • Can contain fields, properties, methods, and constructors (but must have a parameterless constructor implicitly).
  • When to use: small, immutable data structures such as Point, Complex, or KeyValuePair.

Example:

public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y) : this()
    {
        X = x; Y = y;
    }
}

Point p1 = new Point(2, 3);
Point p2 = p1; // p2 is a copy, not a reference
p2.X = 10; // p1.X remains 2

Because structs are copied, be mindful of performance when they become large; a large struct can incur a noticeable overhead.

4. Overriding Virtual Methods – The override Keyword

When a base class declares a method as virtual, derived classes can provide a new implementation using the override keyword. This enables polymorphic behavior at runtime.

  • Base declaration: public virtual void Display()
  • Derived implementation: public override void Display()
  • If a derived class wants to prevent further overriding, it can mark the method as sealed override.

Example:

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Animal sound");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof!");
    }
}

Animal a = new Dog();
a.Speak(); // Outputs "Woof!" because of overriding

Using new instead of override would hide the base method rather than replace it, which is rarely the intended design.

5. The using Directive – Simplifying Namespace Access

The using directive at the top of a C# file tells the compiler to import a namespace, allowing you to reference its types without fully qualifying them.

  • Typical form: using System.Text;
  • It does not import DLLs or create a scope for resource disposal (that is the using statement).
  • Multiple using statements can be stacked, and they can be placed inside a namespace block for tighter scope.

Example without using:

System.Collections.Generic.List<int> numbers = new System.Collections.Generic.List<int>();

With using:

using System.Collections.Generic;

List<int> numbers = new List<int>();

This improves readability and reduces boilerplate code, which is especially valuable in large projects.

6. Indexers – Enabling Array‑Like Access to Objects

An indexer lets a class or struct behave like an array, using the this keyword with a parameter list. Clients can then read or write elements using square‑bracket syntax.

  • Declaration pattern: public ReturnType this[int index] { get; set; }
  • Indexers can be overloaded with different parameter types (e.g., string keys).
  • They are often used in collection classes, such as Dictionary or custom data structures.

Example:

public class SimpleList
{
    private int[] _items = new int[10];

    public int this[int index]
    {
        get => _items[index];
        set => _items[index] = value;
    }
}

SimpleList list = new SimpleList();
list[0] = 42; // Calls the set accessor
int first = list[0]; // Calls the get accessor

Remember to validate the index inside the accessor to avoid IndexOutOfRangeException.

7. The as Operator – Safe Casting

The as operator attempts to cast an object to a reference type. If the conversion is not possible, it returns null instead of throwing an exception.

  • Only works with reference types and nullable types.
  • Typical pattern: MyClass obj = someObj as MyClass; followed by a null check.

Example:

object o = "hello";
string s = o as string; // s is "hello"

object num = 123;
string bad = num as string; // bad is null, no exception thrown

If you need an exception when the cast fails, use the traditional cast syntax (MyClass)o. The as operator is especially useful in polymorphic code where the exact runtime type may be uncertain.

8. The foreach Loop – Iterating Over IEnumerable

The foreach statement provides a concise way to iterate over any collection that implements IEnumerable (or IEnumerable<T> for generic collections). The compiler translates the loop into calls to GetEnumerator(), MoveNext(), and Current.

  • It works with arrays, lists, dictionaries, custom collections, and even strings.
  • The iteration variable is read‑only; attempting to assign to it directly results in a compile‑time error.
  • Modifying the underlying collection (e.g., adding or removing items) during iteration typically throws an InvalidOperationException.

Example:

int[] numbers = { 1, 2, 3, 4 };
foreach (int n in numbers)
{
    Console.WriteLine(n);
}

List<string> names = new List<string> { "Alice", "Bob" };
foreach (var name in names)
{
    Console.WriteLine(name.ToUpper());
}

The foreach loop guarantees that each element is visited exactly once, making it ideal for read‑only processing of collections.

Conclusion – Mastering the Basics

By understanding these eight foundational topics—static methods, ref parameters, structs, method overriding, the using directive, indexers, the as operator, and foreach loops—you will be well‑equipped to tackle most introductory C# quizzes and real‑world coding challenges. Practice each concept by writing small programs, and soon the syntax will become second nature.

Keep exploring advanced features such as generics, async/await, and LINQ to deepen your C# expertise. Happy coding!

Stop highlighting.
Start learning.

Join students who have already generated over 50,000 quizzes on Quizly. It's free to get started.