Revision Difference
From_Lua_to_CSharp#528894
<cat>Dev.Intro</cat>
<title>From Lua to C#</title>
<warning>This article is a work in progress. Please consider not making any changes to it at the moment.</warning>
# What is this guide
This is a C# starter guide meant for developers who are well familiar with Lua. There are some comparisons and code examples that will help you understand how to do things using C#.⤶
⤶
## Why S&Box uses C# instead of Lua⤶
⤶
While Lua is flexible to an extent, easy to learn and build simple systems with, it lacks certain capabilities for creating solid scalable projects which are offered by C#. Lua was the best option at the time when Garry's Mod came around, but now it's the time to make a step further.⤶
⤶
# Comparison⤶
⤶
Not all of these code examples will compile and run as-is, some constructs are missing or simplified for less distraction and easier understanding of covered topics.⤶
⤶
# Top-level statements⤶
⤶
Things you can write in a file on the top level⤶
⤶
## Lua example⤶
This is mean to give an idea of the major differences between C# and Lua⤶
⤶
# Comments⤶
```lua
-- In lua you can have any code in a file on the top level,⤶
-- it will get executed when the file is processed.⤶
⤶
print('Hello!')⤶
⤶
function foo()⤶
return 100⤶
end⤶
⤶
print(foo())⤶
⤶
myGlobalTable = {⤶
hello = 'hello'⤶
}⤶
-- Lua comments start with two minus signs⤶
```⤶
⤶
```⤶
// csharp comments start with two slashes, like most other languages⤶
```
⤶
## C# example⤶
⤶
```csharp⤶
// Currently in C# all you can have on the top level is imports⤶
// and type defenitions (classes, interfaces, enums, etc., possibly⤶
// scoped in namespaces).⤶
// You'll need to wrap all of your code into types, classes and their⤶
// methods in order to actually do something. It's simple - on the top⤶
// of the file you can only define things, but not allocate variables⤶
// or execute expressions.⤶
⤶
enum MyEnum⤶
{⤶
One,⤶
Two⤶
}⤶
⤶
namespace Boo⤶
{⤶
public class Foo⤶
{⤶
public int myInt;⤶
}⤶
}⤶
⤶
// The below code isn't allowed as a top-level expression and will not⤶
// compile⤶
int a = 100;⤶
Something.DoStuff();⤶
```⤶
⤶
# Local and global variables⤶
⤶
## Lua example⤶
# Global Variables⤶
```lua
-- Global variales are accessed from anywhere in the code⤶
-- you can define globals anywhere⤶
globalVar = 100
⤶
-- Local variables are accessed in the current lexical scope⤶
local localVar = 100⤶
⤶
-- You can also use 'do' and 'end' on their own to delimit⤶
-- an arbitrary scoped code section⤶
do⤶
local scopedVar = 200⤶
end⤶
```
⤶
## C# example⤶
```csharp
// MyClass.cs⤶
⤶
// No global variables, if you want a globally-accessed variable⤶
// you'll have to define it as a public static class member⤶
⤶
public class MyClass⤶
public class MyClass⤶
{
public static int staticVar = 100;⤶
⤶
public static void DoStuff()
{⤶
// This variable is local to the DoStuff method scope⤶
int a = 200;⤶
⤶
// You can also use '{' and '}' on their own to delimit⤶
// an arbitrary scoped code section⤶
{⤶
// This variable is local to the current arbitrary scope⤶
int a = 300;⤶
}⤶
⤶
Console.WriteLine(a); // 200⤶
}⤶
// globals need to be in a class⤶
public static int GlobalVar = 100;
}
```
⤶
```csharp⤶
// Example.cs⤶
⤶
// We need to import the class in order to access its members⤶
using MyClass;⤶
⤶
public class Example⤶
{⤶
public void DoMoreStuff()⤶
{⤶
// This can be accessed from anywhere like this⤶
int boo = MyClass.staticVar;⤶
⤶
// This variable is local to the DoMoreStuff method scope⤶
int a = 100;⤶
}⤶
}⤶
```⤶
⤶
# Accessibility⤶
In Lua you have global and local variables and table fields as ways of accesing variables.⤶
⤶
In C# you have more deliberate control over what can be accessed from where with namespaces, classes, access modifiers, local scopes, readonly modifier and more.⤶
⤶
## Lua example⤶
⤶
```lua⤶
-- Can be accessed from anywhere⤶
globalVar = 100⤶
⤶
-- globalTable, globalTable.a, globalTable.b can also be accessed⤶
-- from anywhere⤶
globalTable = {⤶
a = 100⤶
}⤶
⤶
globalTable.b = 200⤶
⤶
-- boo can be accessed in its definition scope (current file,⤶
-- function, condition or other code block)⤶
local boo = 300⤶
⤶
```⤶
⤶
## C# example⤶
⤶
```csharp⤶
⤶
// This is how you define a namespace⤶
namespace MyStuff⤶
{⤶
// Namespaces can be nested⤶
namespace BestStuff⤶
{⤶
// internal means that this class can be accessed from anywhere in⤶
// the current assembly, but not from other assemblies⤶
internal class Foo⤶
{⤶
// private means that this member is only accessible within class Foo⤶
private int privateMember = 100;⤶
⤶
// protected means that this member is only accessible within class Foo⤶
// and its decendants (classes that inherit from Foo)⤶
protected int protectedMember = 200;⤶
⤶
// public means that this member can be accessed from any other code⤶
public int publicMember = 300;⤶
⤶
// readonly in this case means that this field value can not be changed⤶
// after initialization⤶
public readonly int readonlyMember = 400;⤶
}⤶
}⤶
}⤶
```