.Net กับ Java

เนื่องจากเป็นคนที่มีพื้นฐานเดิมเป็น Java เวลาต้องมาเรียนภาษาใหม่ ก็เลยอดที่จะเทียบไม่ได้ เพื่อให้ตัวเองได้เรียนรู้และเข้าใจได้เร็วขึ้น และเลยอยากจะเขียนไว้เผื่อใครจะเจอสถานการณ์เดียวกันค่ะ

C#.NetJava
namespacepackage
using
ซึ่งสามารถเขียนเป็น alias ได้ด้วย
using MessageSource = Microsoft.CSharp.Introduction.HelloMessage;
import
isinstanceof
basesuper
สามารถ pass value-type parameter (หรือ primitive type ใน Java) by reference ได้
using System; 
class Test { 
    static void Swap(ref int a, ref int b) 
   { 
        int t = a; 
        a = b; 
        b = t; 
    } 
    static void Main() 
   { 
        int x = 1; 
        int y = 2; 
        Console.WriteLine("pre: x = {0}, y = {1}", x, y); 
        Swap(ref x, ref y); 
        Console.WriteLine("post: x = {0}, y = {1}", x, y); 
    } 
}
ไม่มีการ pass primitive type by reference
มีการรับ output ทาง parameter ซึ่งสามารถมีได้มากกว่า 1 ตัว (ซึ่งจะคล้ายๆ กับการ pass parameter by reference เพียงแต่ไม่จำเป็นต้อง initialize ค่าตัวแปรที่เป็น output
   static void Divide(int a, int b, out int result, out int remainder) {
      result = a / b;
      remainder = a % b;
   }
เนื่องจากไม่มีการ pass primitive type parameter by reference ดังนั้นการส่งค่า output ทำได้ทางเดียวคือ return ค่ากลับมาซึ่งส่งได้ตัวเดียว การ return กลับมาสามารถส่งกลับมาเป็น Object ก็ได้
สร้าง modifier ที่ต่างกันสำหรับ get กับ set ไม่ได้ เช่น public get กับ private set ไม่ได้
    private string caption; 
    public string Caption { 
        get { return caption; } 
        set { caption = value; } 
    }
    private string caption; 
    public string getCaption() { 
        return caption; 
    } 
    private void setCaption(String caption) {
        this.caption = caption; 
    }
การ override จะต้องกำหนดเป็น virtual method ก่อน และ overriding method จะต้องใส่ override ไว้ด้วย มิฉะนั้นจะถือว่าเป็น method ใหม่ที่ไม่ได้ override ของเดิมมา แต่ในกรณีนี้ compiler จะขึ้น warning แต่ถ้าไม่อยากให้ขึ้น warning และเป็น method ใหม่ที่ไม่ได้ override มา จะต้องใส่ new แทน override
class Class1
{
    public virtual void Test()
    {
        Console.WriteLine("test in class1");
    }
}
class Class2 : Class1
{
    public override void Test()
    {
        Console.WriteLine("test from class2");
    }

}
class Class1 {
    public void test() {
        System.out.println("test in class1");
   }
}
class Class2 extends Class1 {
    public void test() {
        System.out.println("test in class2");
การแปลง String เป็น Enum
public enum CarBrand 
{
    TOYOTA, BENZ
}
public static void main()
{
    CarBrand car = (CarBrand) Enum.Parse(typeof(CarBrand), "BENZ");
}
    
public enum CarBrand {
    TOYOTA, BENZ
}
public static void main() {
    CarBrand c = CarBrand.valueOf("BENZ");
}
สร้าง operator ใหม่ได้
   public static Digit operator+(Digit a, Digit b) {
      return new Digit(a.value + b.value);
   }
ต้องเขียนเป็น method
static constructor
   static Employee() {
      Console.WriteLine("Do in initialize class");
   }
static block
    static {
        System.out.println("Do in static block");
    }
Destructors
   ~CName() {
      Console.WriteLine("Destructed {0}", this);
   }
finalize ซึ่งไม่แนะนำ
    @Override
    protected void finalize() throws Throwable {
        System.out.println("do finalize");
        super.finalize();
    }
สามารถสร้าง class ให้เป็น indexer ได้
   public object this[int index] {
      get {
         return ...;
      }
      set {
         ...
      }
   }
ไม่มี indexer
มี struct ซึ่งคล้ายกับ class แต่ว่าเป็น value type (pass by value) ซึ่งมีข้อดีในเรื่องประสิทธิภาพของระบบในบางกรณี (แต่บางกรณีก็อาจจะทำให้ช้าลง)
struct Point
{
   public int x, y;
   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }
}
ไม่มี struct
สามารถซ่อน method ที่ implement จาก interface ได้ (แต่ยังนึกไม่ออกว่ามีจุดประสงค์เพื่ออะไร)
interface IControl
{
   void Paint();
}
public class EditBox: IControl, IDataBound
{
   void IControl.Paint() {...}
}
class Test
{
   static void Main() {
      EditBox editbox = new EditBox();
      // editbox.Paint();   // error: no such method
      IControl control = editbox;
      control.Paint();   // calls EditBox's Paint implementation
   }
}
method จากการ implement interface จะเป็น public เสมอ
มี Delegate ซึ่งทำหน้าที่เหมือนกับ function pointer และเป็นพื้นฐานของการเขียน Event

delegate void SimpleDelegate();

class Test
{
   static void F() {
      System.Console.WriteLine("Test.F");
   }
   static void Main() {
      SimpleDelegate d = new SimpleDelegate(F);
      d();
   }
}


ไม่มี Delegate ถ้าต้องการเขียน Event อาจจะต้องเขียนเองโดยใช้ Observer Pattern
มี attribute
[AttributeUsage(AttributeTargets.All)]
class HelpAttribute: Attribute
{
   public string Topic = null;
   private string url;

   public HelpAttribute(string url)
   {
      this.url = url;
   }
   public string Url
   {
      get { return url; }
   }
}

[Help("http://www.microsoft.com/.../Class1.htm")]
public class Class1
{
}

public static void main()
{
   Type type = typeof(Example.Attributes.Class1);
   object[] arr = type.GetCustomAttributes(typeof(HelpAttribute), true);
   HelpAttribute ha = (HelpAttribute)arr[0];
   Console.WriteLine("Url = {0}, Topic = {1}", ha.Url, ha.Topic);
}
คล้ายกับ annotation
สามารถ compile เป็น library (.dll) หรือว่า .exe ได้เลย
csc /target:library HelloLibrary.cs 
csc /reference:HelloLibrary.dll HelloApp.cs
compile เป็น .jar อย่างเดียว ต้องทำงานผ่าน java (จาก jvm)
javac -classpath .:/home/avh/classes:/usr/local/java/classes example.java
  • Class ที่ควรรู้ Environment, Enum, DateTime, Color, Font
Reference:

.Net Naming Convention

Microsoft จะแบ่งการตั้งชื่อเป็น 2 แบบคือ
  1. Pascal Casing คือขึ้นต้นด้วยตัวใหม่แล้วตามด้วยตัวเล็ก และคำถัดไปก็ขึ้นต้นด้วยตัวใหญ่อีกครั้ง เช่น PascalCase 
  2. Camel Casing คือขึ้นด้นด้วยตัวเล็กและตามด้วยตัวเล็กคำแรก และคำถัดไปขึ้นด้นด้วยตัวใหญ่ เช่น camelCase
สำหรับอักษรย่อ (Acronym) ที่มี 2 ตัว และจะใช้เป็นตัวแรกแบบ Pascal จะใช้เป็นตัวใหญ่ทั้งหมด เช่น IO
สำหรับอักษาย่อที่มี 2 ตัว และใช้แบบ Camel คำแรกจะใช้เป็นตัวเล็กทั้งหมด เช่น dbRate

สำหรับตัวย่อ (Abbreviation ซึ่งจะต่างจาก Acronym เพราะจะย่อแค่คำเดียว เช่น id เป็นตัวย่อของ identifier ส่วน Acronym เช่น HTML ซึ่งย่อมาจาก Hypertext Markup Language) ไม่ควรใช้สำหรับการตั้งชื่อ ยกเว้น ID และ OK

โดยทั่วไปการตั้งชื่อไม่ว่าชื่อ class, method, อื่นๆ จะต้องใช้เป็นแบบ Pascal ยกเว้น parameter เท่านั้นที่จะใช้เป็นแบบ Camel

Reference: