Revision Difference
From_Lua_to_CSharp#529963
<cat>Code.Misc</cat>
<title>From Lua to C#</title>
# What is this guide
This is meant to give an idea of the major differences between Lua and C#.
This is meant to give an idea of some major differences between Lua and C#.
⤶
This isn't a complete guide to C# and it doesn't cover many of the topics. It's meant to be brief, simple and illustrative. If you want to learn C# in more depth, you can use the [official C# language reference](https://docs.microsoft.com/en-us/dotnet/csharp/).⤶
# Comments
```lua
-- Lua comments start with two minus signs
--[[
Lua multiline comment
example
--]]
```
```csharp
// C# comments start with two slashes, like most other languages
/*
C# multiline comment
example
*/
```
# Global Variables
```lua
-- you can define globals anywhere in Lua
globalVar = 100
```
```csharp
public class MyClass
{
// in C# globals need to be in a class
public static int GlobalVar = 100;
}
```
# Variable Types
```lua
-- variables in Lua don't have a static type and can store any data
local a = 100
a = "Hello"
a = function() print( "Hi" ) end
```
```csharp
var a = 100; // translated as "int a = 100;" because 100 is an int
a = "Hello"; // error: can't assign a string to an int
```
# Type conversion
```lua
local a = 123
local b = tostring( a ) -- "123"
local c = tonumber( b ) -- 123
```
```csharp
var a = 123;
var b = a.ToString(); // "123"
var c = int.Parse( b ); // 123, will throw an exception if 'b' isn't int-ish
// operator 'as' converts an object reference or returns 'null' on failure
var vehicle = new Car() as Vehicle; // downcast Car reference to Vehicle
var car = vehicle as Car; // upcast Vehicle reference to Car
```
# Numbers
```lua
local a = 100
a = 5.5
a = -300.1
```
```csharp
// integer types are sbyte, byte, short, ushort, int, uint, long, ulong
int a = -300;
uint b = 333333;
// decimal types are float, double, decimal
double d = -500.888;
```
# Strings
```lua
local str = "Hello"
local str2 = 'Hello2'
local multilineStr = [[
Hello
Multiline
]]
print( #str ) -- 5, string length
local concated = "I have " .. 3 .. " apples!"
local formatted = string.format( "I have %d apples!", 3 )
```
```csharp
var str = "Hello";
var singleChar = 'a'; // single quotes are for a single character, not a string
var multilineStr = @"
Hello
Multiline
"; // putting '@' before a string literal makes it a verbatim string literal
Console.WriteLine( str.Length ); // 5, string length
var concated = "I have " + 3 + " apples!";
// {0} and {1} here correspond to the order of value arguments
// argument number 0 is '3' and argument number 1 is '2'
var formatted = string.Format( "I have {0} apples and {1} oranges!", 3, 2 );
// putting '$' before a string allows interpolating values into it using '{value}'
var interpolated = $"I have {3} apples!";
```
# Collections
```lua
local stuff = {
1, 2, 3,
"Oh", "Hi", "Mark",
{ myFunc = function() end }
}
⤶
local arr = { 'a', 'b', 'c' }⤶
⤶
print( arr[1] ) -- will print 'a' since array indices in Lua start from 1⤶
```
```csharp
var numbers = new int[3] { 1, 2, 3 };
var strings = new List<string> { "Oh", "Hi", "Mark" };
var functions = new Dictionary<string, Action>
{
["myFunc"] = () => { }
};
⤶
var arr = new string[3] { "a", "b", "c" };⤶
⤶
Console.WriteLine(arr[1]); // will print "b" since array indices in C# like most languages start from 0⤶
```
# Loops
```lua
for i = 1, 10, 2 do
print( i ) -- 1, 3, 5, 7, 9
end
local a = 10
repeat
print( a ) -- 10, 8, 6, 4, 2, 0
a = a - 2
until a < 0
local t = {
a = 5,
b = 10,
c = 15
}
for k, v in pairs( t ) do
print( k .. ' = ' .. v ) -- b = 10, a = 5, c = 15
end
```
```csharp
for ( var i = 1; i < 10; i += 2 )
{
Console.WriteLine( i ); // 1, 3, 5, 7, 9
}
var a = 10;
do
{
Console.WriteLine( a ); // 10, 8, 6, 4, 2, 0
a -= 2;
} while ( a >= 0 );
var t = new Dictionary<string, int>
{
{ "a", 5 },
{ "b", 10 },
{ "c", 15 },
};
foreach (var kv in t)
{
Console.WriteLine( $"{kv.Key} = {kv.Value}" ); //a = 5, b = 10, c = 15
}
```
# Member Access
In Lua anything is accessible from anywhere as long as you have a reference.
```lua
-- myFile.lua
myTable = {
field = 100
}
```
```lua
-- otherFile.lua
print( myTable.field ) -- 100
```
In C# things can be **public**, **private**, **protected** and **internal**.
```csharp
// MyClass.cs
public class MyClass
{
public static void PublicMethod() { ... }
protected static void ProtectedMethod() { ... }
private static void PrivateMethod() { ... }
}
```
```csharp
// OtherClass.cs
public class OtherClass : MyClass
{
public static void Test()
{
MyClass.PublicMethod(); // OK
MyClass.ProtectedMethod(); // we inherit from MyClass so OK
MyClass.PrivateMethod(); // error: PrivateMethod is private
}
}
```