Table of Contents

C# Basic

using System; // like python, need to import sys,os for some basic function
int i = 1; // like c++, statement needs ends with ;
const int age = 100;
float amount = 1;
float amountDetail = 1.2f; // for . number, you need put f behind;
double noNeedEnd = 1.2; // for double, no need extra, opt with d;
decimal superDetail = 1.2m; // m to indicate deciMal
 
char letter = 'A'; string name = "test"; book isWorking;
var i=1; // like javascript, you can use var for c# to auto detect as int for the value.
 
int[] intArray = {5,2,3}; // fix size array, unlike mixed python intArrayExtra=[5,2,3,'ok']
int[] intEmpty = new int[3]; // 3 slot
Array.Sort(intArray);
foreach (int i in intArray)
{
  Console.WriteLine(i);
}
 
// extra lib
using System.Linq;
Console.WriteLine("max: "+intArray.Max());
Console.WriteLine("min: {0}; sum: {1} ", intArray.Min(), intArray.Sum()); // python .format like print
// python like list, no fix size, need extra lib
using System.Collections.Generic;
List<int> numberList = new List<int>();
numberList.Add(32); // like python append
// write out list as string
Console.WriteLine( string.Join(", ", selected.ToArray() )
 
 
int[] extraArray = {10,11,12};
numberList.AddRange(extraArray); // like python extend
numberList.Insert(0, 100); // insert at index
numberList.Remove(10); // find number 10 and remove 1st instance
numberList.RemoveAt(3); // Remove 3rd item
numberList.Clear(); // empty, like python .clear()
numberList.IndexOf(100); //
numberList.Sort();
numberList.Reverse();
int index = numberList.BinarySearch(100);
 
// python like: stack ; append(56), pop(), use Stack object instead
if(numberList.Any()){
    numberList.RemoveAt(numberList.Count - 1); // no return though
}
// python like: queue; append(56), pop(0), use Queue object instead
numberList.RemoveAt(0); // no return though
 
// however, apart from List, 
// c# has Queue object for Enqueue() and Dequeue(), 
// c# has Stack object for Push() and Pop()
// c# extra: SortedSet, HashSet

C# and Visual Studio Community edition

Get Started in Visual Studio with C#

action shortcut
move line up/dn alt+arrow up/dn
comment cmd+/

Mac and Visual Studio with C#

Problem and Solution

GTK and Mono compile commandline

method: launch script

method: mac app auto build script

.NET framework install requirement for your C# app

Target framework version C# version default
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7.3
.NET Standard 1.x C# 7.3
.NET Framework all C# 7.3

Problem and Solution:

.Net UI frameworks options

Check dotnet version installed

dotnet --list-sdks

ref: https://www.youtube.com/watch?v=8NdJaztrNk8

C# Cross platform UI options

Web: 
    > Blazor
Desktop:
    > Cross-Platform:
          -- MAUI
    > Non Cross-Platform:
          --WinUI3
          -- WPF

develop app without using .NET framework

My Test Code

test.cs
using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
 
namespace TestRun
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hellow World.");
            string reply = Console.ReadLine();
            if (reply != ""){
                Console.WriteLine("Got it:" + reply);
            }
            else{
                Console.WriteLine("nothing");
            }
            int num1 = int.Parse(Console.ReadLine());
            int num2 = int.Parse(Console.ReadLine());
            Console.WriteLine(num1+num2);
            Console.WriteLine(mult(num1,num2));
            reply = Console.ReadLine();
        }
 
        public static float mult(float n1, float n2)
        {
            float result = n1 * n2;
            return result;
        }
    }
}

My App - Output Selected Item in Top Most Explorer in CSharp

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
/*
ListSelection: (By Shining Ying)
  * v0.1: (2022.05.01) list selected item in top most explorer
 
use with python:
import subprocess
app = r"D:\Projects\Dev\ListSelection\ListSelection\bin\Release\ListSelection.exe"
info=subprocess.Popen( '{0}'.format(app),stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE )
out, err = info.communicate()
result_list = [x.strip() for x in out.split('\n') if x.strip()!='' and not x.strip().startswith('#') ]
 
 */
namespace ListSelection
{
 
    class Program
    {
        // need user32 to use get foreground window
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr GetTopWindow(IntPtr hWnd);
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool IsWindowVisible(IntPtr hWnd);
 
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
 
        enum GetWindow_Cmd : uint
        {
            GW_HWNDFIRST = 0,
            GW_HWNDLAST = 1,
            GW_HWNDNEXT = 2,
            GW_HWNDPREV = 3,
            GW_OWNER = 4,
            GW_CHILD = 5,
            GW_ENABLEDPOPUP = 6
        }
 
        // stathread needed to fix unable to cast com object error, as it needs sta thread to use shell object
        // https://stackoverflow.com/questions/31403956/exception-when-using-shell32-to-get-file-extended-properties
        [STAThread]
        static void Main(string[] args)
        {
            List<IntPtr> order_list = new List<IntPtr>();
            /*IntPtr fg_handle = GetForegroundWindow();*/
            IntPtr top_handle = GetTopWindow((IntPtr)null);
            if (top_handle != IntPtr.Zero)
            {
                //Console.WriteLine((int)top_handle);
                if (IsWindowVisible(top_handle))
                {
                    order_list.Add(top_handle);
                }
            }
 
            IntPtr top_next = GetWindow(top_handle, 2);
            while (top_next != IntPtr.Zero) {
                //Console.WriteLine((int)top_next);
                if (IsWindowVisible(top_next)) { 
                    order_list.Add(top_next);
                }
                top_next = GetWindow(top_next, 2);
            }
            /*
            Console.WriteLine("===========================");
            Console.WriteLine("Order:");
            for (int i = 0; i < order_list.Count; i++)
            {
                Console.WriteLine((int)order_list[i]);
            }
            */
 
 
            Shell32.Shell shell = new Shell32.Shell();
            // fix reference: right click project, Add > Reference; in COM, check on Microsoft Shell Controls and Automation
            List<int> win_list = new List<int>();
            foreach (SHDocVw.InternetExplorer window in shell.Windows())
            {
                win_list.Add(window.HWND);
            }
            /*
            Console.WriteLine("===========================");
            Console.WriteLine("win:");
            for (int i = 0; i < win_list.Count; i++)
            {
                Console.WriteLine(win_list[i]);
            }
            */
 
            // top most explorer
            int top_explorer = 0;
            for (int i = 0; i < order_list.Count; i++)
            {
                if (win_list.Contains((int)order_list[i])) {
                    top_explorer = (int)order_list[i];
                    break;
                }
            }
 
            List<string> selected = new List<string>();
            foreach (SHDocVw.InternetExplorer window in shell.Windows())
            {
                // fix SHDocVw: right click project, Add > Reference; in COM, check on Microsoft Internet Controls
                if (window.HWND == top_explorer)
                {
                    Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
                    foreach (Shell32.FolderItem item in items)
                    {
                        selected.Add(item.Path);
                        Console.WriteLine(item.Path);
                    }
                }
            }
 
            Console.WriteLine("# By Shining Ying. - 2022/05/01");
            //return (string.Join(", ", selected.ToArray()));
 
        }
    }
}