Sobes.tech
Senior

Questions about C# and .NET: async/await without await, reference and value types, class differences.

sobes.tech AI

Answer from AI

async/await without await

If a method is declared with async but contains no await operator inside, then the method executes synchronously, and the compiler will issue a warning. The return value will be wrapped in Task or Task<T>, but there will be no actual asynchrony.

async Task<int> GetNumberAsync()
{
    return 42; // no await, method executes synchronously
}

Reference and value types

  • Value types (struct, enum, primitives) are stored on the stack or inline in objects, and are copied entirely when assigned.
  • Reference types (class, interface, delegate) are stored on the heap, and the variable contains a reference to the object.

Example:

int a = 5;
int b = a; // copy of the value
b = 10;
// a is still 5

class Person { public string Name; }
Person p1 = new Person { Name = "Alice" };
Person p2 = p1; // copy of the reference
p2.Name = "Bob";
// p1.Name is also "Bob"

Difference of classes

In C#, classes are reference types. They support inheritance, polymorphism, can have constructors, destructors, properties, methods, etc. When passing a class to a method, a reference is passed, not a copy of the object.

Structures (struct) are value types, do not support inheritance (except interfaces), and are usually used for small, lightweight objects.


Thus, async/await without await does not create asynchrony, reference types are passed by reference, value types by value, and classes are the foundation of object-oriented programming in C#.