Wiki Help

Revision Difference

From_Lua_to_CSharp#530490

<cat>test</cat>⤶ <title>From Lua to C#</title>⤶ ⤶ # What is this guide⤶ ⤶ ⤶ 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⤶ }⤶ }⤶ ```