Mono 之 HelloWorld

前言

  使用Mono可以让程序员在Linux上使用C#语言。

第一个程序

  尊早约定,让我们使用C#实现Hello World的输出吧——可以参照:http://mono-project.com/Mono_Basics

进入Linux系统,输入 

vi HelloWorld.cs

在Vim 里敲入以下代码:

using System;

public class HelloWorld

{

  public static void Main()

    {

        Console.WriteLine("Hello Mono World");

    }

}

利用:qw保存后退出

这样我们就有了C#的源文件了,接下来需要将源文件编译一下。

利用Gmcs可以将源文件直接编程成 .exe 文件

 gmcs HelloWorld

输入 命令 

ll Hello*

可以看到以下结果:

-rw-r--r-- 1 root     root      115  5月 29 09:24 HelloWorld

-rwxrwxr-x 1 root    root 3072  5月 29 11:07 HelloWorld.exe*

最后输入

./HelloWorld.exe



Hello Mono World

以上就是HelloWorld的简单例子。

 素数输出

  接下来我们写一个较为复杂一点的程序,该程序根据输入的一个最大值输出素数(使用的是打表法)。这次我们利用Vs2010编写程序。

PrimeGenerator
  1 using System;

  2 using System.Diagnostics;

  3 

  4 namespace GeneratePrimes

  5 {

  6     /// <summary>

  7     /// 使用Eratosthenes的筛选发 技术按素数

  8     /// 

  9     /// 算法概要:对于一个开始与2的整数,划掉2的倍数,找到下一个未被划掉的整数,划掉它所有的倍数,如此反复,知道找到传入最大值的平方根为止。

 10     /// </summary>

 11     /// <param name="p"></param>

 12     /// <returns></returns>

 13     public class PrimeGenerator

 14     {

 15 

 16 

 17         private static bool[] crossedOut;

 18         private static int[] result;

 19         private static Stopwatch timeCalculation=new Stopwatch();

 20 

 21         public static int[] GeneratePrimeNumbers(int maxValue)

 22         {

 23             if (maxValue < 2)

 24             {

 25                 return new int[0];

 26             }

 27             else

 28             {

 29                 StartTiming();

 30                 UncrossIntegersUpTo(maxValue);

 31                 CrossOutMultiples();

 32                 PutUncrossedIntegersIntoResult();

 33                 EndTiming();

 34                 return result;

 35             }

 36         }

 37 

 38         private static void StartTiming()

 39         {

 40             timeCalculation.Reset();

 41             timeCalculation.Start();

 42         }

 43 

 44         private static void EndTiming()

 45         {

 46             timeCalculation.Stop();

 47             CalElapse = timeCalculation.ElapsedMilliseconds; 

 48         }

 49 

 50         private static void PutUncrossedIntegersIntoResult()

 51         {

 52 

 53             result = new int[NumberOfUncrossedIntegers()];

 54 

 55             for (int i = 2, j = 0; i < crossedOut.Length; i++)

 56             {

 57                 if (NotCrossed(i))

 58                     result[j++] = i;

 59             }

 60         }

 61 

 62 

 63         private static int NumberOfUncrossedIntegers()

 64         {

 65             int count = 0;

 66             for (int i = 2; i < crossedOut.Length; i++)

 67             {

 68                 if (NotCrossed(i))

 69                     count++;

 70             }

 71             return count;

 72         }

 73 

 74 

 75         private static void CrossOutMultiples()

 76         {

 77 

 78             int maxPrimeFactor = DetermineIterationLimit();

 79             for (int i = 2; i < maxPrimeFactor + 1; i++)

 80             {

 81                 if (NotCrossed(i))

 82                 {

 83                     CrossOutputMultiplesOf(i);

 84                 }

 85             }

 86         }

 87 

 88 

 89         private static void CrossOutputMultiplesOf(int i)

 90         {

 91             for (int multiple = 2 * i;

 92                 multiple < crossedOut.Length;

 93                 multiple += i)

 94                 crossedOut[multiple] = true;

 95         }

 96 

 97         private static bool NotCrossed(int i)

 98         {

 99             return crossedOut[i] == false;

100         }

101 

102         private static int DetermineIterationLimit()

103         {

104             double iterationLimit = Math.Sqrt(crossedOut.Length) ;

105             return (int)iterationLimit;

106         }

107 

108         private static void UncrossIntegersUpTo(int maxValue)

109         {

110 

111             crossedOut = new bool[maxValue + 1];

112             for (int i = 2; i < crossedOut.Length; i++)

113             {

114                 crossedOut[i] = false;

115             }

116         }

117 

118         public static long CalElapse { get; private set; }

119 

120     }

121 }

PrimeGenerator 类来至于:Robert C. Martin & Micah Martin 的 《Aglie Principles,Patterns,and Practices in C#》 P30 ,我在两位大牛的基础上加上了一点运行时间的计算。

 class Program

    {

        static void Main(string[] args)

        {

            int max = getMaxNumbersFromArgs(args);

           

            PrimeGenerator pg = new PrimeGenerator();

            int[] text = PrimeGenerator.GeneratePrimeNumbers(max);



            Console.WriteLine("Elapsse:{0}ms", PrimeGenerator.CalElapse);

            

            for (int i = 0; i < text.Length; i++)

            {

                Console.Write("{0},", text[i]);

            }

            Console.Read();

        }





        private static int getMaxNumbersFromArgs(string[] args)

        {

            int maxNumbers = 3000;

            if (args != null && args.Length > 0)

            {

                int parseResult;

                if (int.TryParse(args[0], out parseResult))

                {

                    maxNumbers = parseResult;

                }

            }

            return maxNumbers;

        }

    }

主函数用于接收最大输入值和打印素数。

以上代码全部在Vs2010 上编写并编译生成.exe 文件

MoMA

   MoMA 是一个在.net 平台下开发的应用程序迁移到Mono平台时,进行兼容性检查的工具。这是个非常有用的工具,使用它检查.dll或.exe 的代码是否符合 ECMA CLI标准。

工具使用起来很简单选择好要分析的程序集文件,点击next即可。如果结果全部为绿色的勾,那么恭喜你全部通过了!

   将程序拷贝到 Linux 里 然后 输入 ./GeneratePrimes.exe  30000   就可以看到素数不断的打印出来了。如果您感兴趣可以试试:多次在Windows 和Linux 运行该程序,对比一下每次计算的耗时。

 

你可能感兴趣的:(helloworld)