Q:

Whats the point of #define?

They have to be placed on the top of your .cs file. You cant create those guys dynamically at runtime and you cant give them a value or change their value because there is no value at all so whats the point of #define keyword?
Here is an example:
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}

Both are defined on top so why having all those ifs anyway?
Can somebody tell me scenarios where define is usefull?
Sorry if this is a duplicate just let me know in comments if so and I ll remove this question.

A:

The point is condiional compialtion. 
Like: 
#ifdef x64     
.... 
#else
....
#endif

#ifdef KIOSK
   fullScreen  =true; 
#else
   fullScreen  =false;
#endif 

You create condition for compile time, so your binaries will not change at runtime, but
will fit exact requirements of your target ambient you are compiling for.It could be whatever you want, it's up to you decide name and semantics of what you #define.
EDIT. 
Example: you have a program that acess low level windows API, and you have to support 
x86 and x64 versions. In this case you may want that in binaries (so after compilation) of your program for 32bit, there is no any evidence of 64bit functions. So you may write 
#ifdef x64 //conditional compilation symbol defined by YOU 
   DriverInfo GetDriverInfo64(..) {...} //64bit 
#else
   DriverInfo GetDriverInfo(..) {...}   //32bit
#endif

