ครบ 1 ปี จาก Visual Basic ไป C#

posted on 30 Nov 2007 12:33 by ninkungz  in Programming

พรุ่งนี้เมื่อ 1 ปีที่แล้ว (งงมั้ย?) เป็นวันที่ผมโหลด Visual C# (แน่ล่ะ Express Edition) มาลองเขียนโปรแกรมเล่น จะเป็นอย่างไรถ้าคนที่เขียน ภาษา Basic มาทั้งชีวิต ต้องก้าวเข้าสู่โลกของปีกกา (จริง ๆ ก็ลองก้าวไปบ้างแล้วสมัยเรียน ไหนจะ PHP กะ Action Script อีก) ต่อไปนี้คือประสบการณ์ที่จะเอามาบอกเล่ากัน ซึ่งอาจจะเป็นประโยชน์กับบางคนที่ไม่รู้จะเล่น Visual Basic หรือ C# ดี (มันคือ Visual Basic vs. C# แบบนึงว่างั้นเถอะ)

เรื่องวุ่น ๆ ของเซมิโคล่อนและวงเล็บ

แน่ล่ะ Visual Basic มันใช้เซมิโคล่อน (;) กะเขาที่ไหนกัน ใครย้ายจาก
VB ไป C# (หรือภาษาอื่น ๆ ที่คล้าย ๆ กัน) ย่อมจะลืมเซมิโคล่อนเป็นกิจวัตร กินเวลานานโขกว่าจะชิน (ตอนนี้ชินแล้ว) อีกตัวที่ลืมบ่อยไม่แพ้กันคือวงเล็บครับ วงเล็บเปิดปิดต่อท้าย Method นั่นแล ปกติ VB มันไม่ค่อยสนใจครับว่าจะมีไอ้วงเล็บนี่มั้ย บางครั้งยังเติมให้เราเองซะอีกแน่ะ แต่ C# ไม่ยอมครับ แถมเวลาลืมยังไม่ยอมบอก ต้องให้รอลุ้นตอนรันนู้น เฮ้อ~

นี่หรือคือ for

คำสั่ง For ของ Basic เป็นอะไรที่ดูครั้งแรกก็ยังเข้าใจ

    For i = 1 to 10
        --- บลา ๆ ๆ --
    Next

แต่พอมา C# ...

    for (int i = 1; i <= 5; i++)
    {
        --- บลา ๆ ๆ --;
    }

จริง ๆ ไม่ได้เห็นครั้งแรกที่ C# หรอก เห็นครั้งแรกที่ภาษา C เลย แน่นอนว่าแว้บแรกเป็นงง ต่อมาไม่นานก็เข้าใจ แต่พอทิ้งไปก็ลืมอีก มันไม่ปิ๊งแล้วรู้เรื่องเลยแบบ for ของ VB แฮะ และไอ้ตรงส่วนที่ใช้ประกาศเงื่อนไข (ไอ้ i <= 5 นั่นน่ะ) มันเป็นบั๊กได้บ่อย ๆ (เป็นโรคไม่ถูกกับเครื่องหมายมากกว่าน้อยกว่า) ผมล่ะกลัวจริง ๆ (แล้วภาษาอื่น ๆ อีกมากมายก็ดันใช้ for แบบนี้ด้วย
)

 

การแปลงชนิดข้อมูลอันแสนเข้มงวด

ไม่ใช่ว่าไม่มีนะครับ จริง ๆ การแปลงชนิดข้อมูลนี่ VB มีมาตั้งแต่ก่อนยุค .NET แล้ว แต่ก็ไม่ได้เข้มงวดอะไร ซ้ำยังมีตัวแปรชนิด Variant ที่ปลอมตัวเป็นข้อมูลชนิดไหนก็ได้มาอำนวยความ(มักง่าย)สะดวกอีกต่างหาก ซึ่งไอ้เรื่องแบบนี้ C# ไม่ยอมง่าย ๆ ครับ แค่แปลงจาก Char Array ไปเป็น String ยังไม่ง่ายเลย ดังนี้..

VB
ตัวแปรString = ตัวแปรCharArray 'ก็จบแล้ว

C#
string ตัวแปร = new string(ตัวแปรCharArray); //ต้องสร้าง string ใหม่จาก CharArray ตรงนั้นเลย

ที่เห็นนี่ VB ตั้ง Option strict เป็น on แล้วนะครับ หรือพูดง่าย ๆ คือให้เข้มงวดกับการแปลงชนิดข้อมูลมากขึ้นน่ะล่ะ ซึ่งพอตั้งให้เข้มงวดขึ้นแล้ว
VB ยังอุตส่าห์มีตัวช่วย (ดังภาพ)

 

จะเห็นว่า VB บอกวิธีแปลงชนิดข้อมูลให้เห็นกันจะ ๆ ในขณะที่ C# แค่บอกว่า "เฮ้ย ทำแบบนี้ไม่ได้นะ" แต่ไม่บอกว่าต้องทำยังไง


 

วิถีแบบเดิม ๆ ใช้ไม่ได้ใน C#

วันหนึ่ง ผมเปิด C# เพื่อจะลองเขียนเกมเล็ก ๆ เล่นดู ซึ่งหัวใจของเกมเล็ก ๆ ก็คือการสุ่มตัวเลขครับ ซึ่งคนที่โตมากับ Basic อย่างผมรู้ดีว่าต้องใช้ฟังก์ชั่น Rnd น่ะสิ แบบนี้

    Dim value As Integer = CInt(Int((6 * Rnd()) + 1))

ก็แก้โค้ดให้เป็นสไตล์ C# แล้วรันดู....ไม่ผ่าน! เพราะว่า C# มันไม่มี!! (Rnd เป็นมรดกตกทอดเฉพาะภาษา Basic สินะ) ไปค้น ๆ ดูก็พบว่า C# มันใช้ของใหม่แสนสะดวกอย่าง Class Random ซึ่งใช้ง่ายซะ แบบนี้

    Random rndNum = new Random();
    int Result;
    Result = rndNum.Next(ค่าต่ำสุด,ค่าสูงสุด);

ไม่ต้องจำสูตรมากมายแบบภาษา Basic แล้ว!! (แน่นอนว่า VB ก็ใช้ได้) นอกจากนี้หลาย ๆ อย่างที่ VB รับมรดกมาก็ใช้ใน C# ไม่ได้อีกมากมาย แต่ขี้เกียจกล่าวถึง

เอกสารที่โคตรลำเอียง



และถ้าดูหัวข้อ Reference (Visual Basic) ใน MSDN Express จะพบว่ามีการสรุปทุกสิ่งทุกอย่างเอาไว้อย่างครบถ้วน ไม่ว่าจะเป็น คีย์เวิร์ด ฟังก์ชั่น ชนิดข้อมูล ค่าคงที่ เป็นต้น เรียกได้ว่าสรุปทุกสิ่งทุกอย่างไว้ในนี้ล่ะ แต่ใน C# Reference จะมีแต่คีย์เวิร์ด โอเปอเรเตอร์ และ คอมไพเลอร์ออพชั่นของตัวเอง ไม่พบอะไรพวกนี้อยู่เลย ทั้ง ๆ ที่บางอย่าง C# ก็ใช้ได้เหมือนกัน คงคิดว่าไปหาเอาจาก .NET Framework Reference แทนก็ได้มั้ง (ก็ C# มันเป็นแก่นแท้ของ .NET นี่นา)

สรุปเลยดีกว่า...

ใช้ VB เถอะ ถ้า...

  • ชอบสีฟ้า
  • ไม่สนใจว่า Code จะหน้าตาน่าเกลียดแค่ไหน (ล้นไปนอกจอก็ช่างมัน)
  • ขี้ลืม (เอกสารมันรวบรวมมาให้ค้นทวนความจำได้ง่าย ๆ)
  • ชอบเครื่องอำนวยความสะดวก (มีมากมายทั้งในส่วนของภาษา และ IDE)
  • ไม่คิดมาก (ไม่ได้หมายความว่าสิ้นคิดนะ )

ใช้ C# ไปเลย หากว่า...
  • ชอบสีเขียว
  • Code ต้องดูงดงามสะอาดตา
  • ชอบทำอะไรด้วยตนเอง
  • ชอบอะไรที่มันย่อ ๆ
  • โดนบังคับเรียน

จบล่ะ (ดูเหมือนจะมีสาระ แต่ดันไม่มีแฮะ
)

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

C# .... เห็นแล้วไม่เป็นมิตรเลยนะครับ....

#1 By นิเกะ on 2007-11-30 13:41

ใช้ VB เถอะ ถ้า...
* ชอบสีฟ้า
C# ไปเลย หากว่า...
* ชอบสีเขียว
<<<<<<<<<<
ฮ่าๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ
บังเอิญดีจริง ผมชอบสีเขียว cry

MSDN รุ่นล่าสุด มีคลาสไลบรารี่และทุกอย่างของ C# ครบถ้วนนะครับ (แต่ใหญ่ชิบหายเลย)

ตั้งแต่ผมใช้ C++ จนถึงตอนนี้ใช้ C# ก็ลืม ; บ่อยๆเหมือนกันเหอๆ

เชื่อมั้ยว่า ผมไม่เคยใช้ for
ใช้แต่ while กับ foreach เท่านั้น ผมว่าใช้ while แล้วโค้ดเป็นระเบียบดูแลง่ายกว่านะ
แถมในตระกูล C ถึงสั่งทำงานเหมือนกัน while จะเร็วกว่า for ด้วย
ป.ล. เอนทรี่นี้ไม่มีนินคุงเรนเจอร์มาเปิดรึ??
ป.ล.2 ผมชอบปีกกามากกว่า begin end ครับ
ป.ล.3 ผมว่า strong type มันดูดีมีระเบียบกว่า weak type แฮะ
ลืมนินคุงเรนเจอร์จริง ๆ ด้วย (ใส่ไปล่ะ)

#4 By NinkungZ on 2007-11-30 14:04

ตั้งสติแล้วมาตอบไทน่า

* ชอบสีเขียว <<
ดูสี Blog นี้ให้ดี big smile ไหนจะนินคุงตัวที่เป็นสัญลักษณ์ Programming อีก

* MSDN รุ่นล่าสุด มีคลาสไลบรารี่และทุกอย่างของ C# ครบถ้วนนะครับ <<
MSDN Express 2008 ก็มีครับ แต่มันไม่ได้อยู่ตรง C# Reference แต่ไปอยู่ตรง .NET Framework Class Library (ซึ่งตรงนี้ก็มีเนื้อหาของ VB อยู่เช่นเดียวกัน) และ VB Reference นี่มันมีพวกฟังก์ชั่นต่าง ๆ พวกทางคณิตศาสตร์ สตริง รีจิสตรี้ แบ่งเป็นหมวดหมู่ให้เลยนะ

เชื่อมั้ยว่า ผมไม่เคยใช้ for <<
เชื่อสิ

ผมว่า strong type มันดูดีมีระเบียบกว่า weak type แฮะ <<
VB ก็เขียนให้ Strong ได้นะ และส่วนตัวผมก็ชอบวิธีแปลงชนิดข้อมูลของ C# มากกว่า (ของ VB มันจำยาก)

#5 By NinkungZ on 2007-11-30 14:24

ดูคำสรุปแล้ว โดนใจดีจริงๆ confused smile

ผมชอบอะไรเรียบร้อยๆนะฮะ แต่ผมว่า VB มันสะดวกสบายกว่าจริงๆแหละ big smile

#6 By closes on 2007-11-30 14:41

อะไรๆ ใน C# มันเป็นคลาสเกือบหมดน่ะสิครับ ไม่มี Function ลอยๆนอกคลาสเลยแม้แต่อย่างเดียว นอกจากคำสั่งพื้นฐาน if else while

ขนาด int ยังต้อง using System เลยมั้ง ถึงจะใช้ได้ (จริงๆ int float char ก็เป็น alias อีกตะหาก)

เสียอย่างเดียวที่ต้องเขียน Main เป็น static void Main แบบจาว่า sad smile
มาเขียน java กับผมมั้ย มึนตึ๊บ

#8 By กวีปิศาจ on 2007-11-30 16:04

ชอบสีฟ้า

มิน่าล่ะ ชื่อคลาสใน VB ถึงไม่เป็นสีตามที่ตั้งใน setting มันเป็นสีน้ำเงินตลอดเวลาเลย open-mounthed smile

#9 By T!D on 2007-11-30 16:05

อะไรๆ ใน C# มันเป็นคลาสเกือบหมดน่ะสิครับ ไม่มี Function ลอยๆ

^== ตามนั้น

จริง ๆ ฟังก์ชั่นลอย ๆ ของ VB มาจาก NameSpace : Microsoft.VisualBasic ครับ อย่างฟังก์ชั่นทางคณิตศาสตร์ก็มาจาก Microsoft.VisualBasic.VBMath

แต่เจ้า VBMath นี่เป็นแค่ Module ครับ ไม่ได้เป็น Class (โมดูลใน VB มันก็แค่อะไรที่ยัด ๆ ฟังก์ชั่นลงไปนะ)

#10 By NinkungZ on 2007-11-30 16:49

โดยส่วนตัว เคยเล่น perl เคยเรียน C,JAVA แล้วถนัด PHP
ถ้าคิดจะเล่น .NET ก็คงไม่พลาด C# เป็นแน่ เคยแต่เขี่ยๆมันดู แต่ยังไม่มีโอกาสได้ศึกษาต่อเลย อยากเล่นเป็นเหมือนกัน เหอๆ

#11 By ฟิวส์ on 2007-11-30 16:54

เอาจริง ๆ แล้ว module ก็เป็นคลาสนะ static class เลยแหละ ลองใช้ ildasm ดู il ของ module ได้ครับ

#12 By T!D on 2007-11-30 22:34

ผมไม่ชอบ VB เพราะเป็นภาษาที่ต้องพิมพ์เยอะเกินไปโดยไม่จำเป็นอ่ะครับ
เช่น
Dim value As Integer ใช้ int value; สบายกว่า
หรือ Begin End ก็พิมพ์ซะเหนื่อย หรือต้องรอ intellisense ช้าอ่ะ พิมพ์ {} สะดวกกว่าเยอะน๊า
แล้วอื่นๆ อีก confused smile
การที่ code ทำงานแบบเดียวกันแล้วดูไม่สะอาดตา
ผมว่าทำให้ดูยากอ่ะ

ไทน่า: ผมว่า ถ้า for เพื่อใช้ count ดูง่ายกว่านะ
while บางคนอาจจะลืม i++ ได้
อีกอย่าง while เร็วกว่า for นี่ ผมเคย test
มันต้องใช้เป็นพันล้านรอบเลยนะถึงจะเห็น
ผมว่าน่าจะขึ้นกับ compiler ด้วยนะครับ
อย่างการประกาศตัวแปร register int i
ก็ไม่ได้ช่วยให้ทำงานเร็วขึ้นเลยอ่ะครับ

#13 By kaze on 2007-12-02 21:15

ที่ผมว่า while ง่ายกว่า for เพราะมันทำงานแบบเห็นชัดน่ะครับ

int i = 0;
while(i < 10)
{
//ตรงนี้ใช้ตามปกติ
i++;
//ถ้าต้องการใช้ค่า 1 - 10 ก็มาทำตรงนี้
}

ซึ่ง for ใช้ซินแท็กซ์แบบซับซ้อนวุ่นวาย โดยเฉพาะเวลาที่ไม่ได้ใช้ count แบบปกติ แต่ while มันซินแท็กซ์ปกติตรงไปตรงมา และอเนกประสงค์กว่าด้วย

ผมคิดว่า ถ้ามีอะไรที่คล้ายๆกันสองอย่าง แล้วอันไหนกว้างกว่า ใช้อันนั้นให้ชินมือจะสบายกว่าน่ะครับ
เพราะไม่งั้นต้องจำทั้งสองอัน

ป.ล. เรื่องลืม i++ ก็เป็นอะไรที่ผมลืมบ่อย แต่ปกติผมพิมพ์พร้อมกันน่ะครับ
โดยรวมแล้ว ผมว่ามันต่างกับ for แค่ว่ามันกินบรรทัดมากกว่า 2 บรรทัด
ชอบใช้ VB งะครับ ตอนเรียน C กันอยู่ยังแอบไปเล่น VB เลยอะ sad smile
ปล. ชอบสีน้ำเงินมากๆ open-mounthed smile

#15 By xViStA on 2008-01-06 20:06

#2 คุณ ไทน่า หมาป่าตัวเขียว

การใช้ foreach เปลือง resource นะ เพราะ มันจะ implement IEnumerator การทำงานของมันคือจะเรียก method bool MoveNext() และจากนั้นค่อยเรียก Current()

ป.ล. อธิบายคร่าวๆ ไม่ว่ากันนะครับ
ป.ล. 2 ผมชอบสีเขียว : D

#16 By pongneng (58.10.152.178) on 2008-03-17 12:43

รู้สึกได้เหมือนกันครับ ว่า foreach เปลืองกว่าลูปปกติ มากจริงๆ

พยายามเลิกใช้อยู่เหมือนกันครับ
foreach อันนี้ไม่แน่ใจนะเพราะยังไม่เชี่ยวชาญ แต่รูสึกว่ายังไงก็เลิกลำบากถ้าเราใช้ Collection จำพวก List<>,ArrayList<> ก็จำเป็นต้องใช้ foreach(มันสะดวกสุดแล้ว)อยู่ดี ถ้ายิ่งใช้ List เก็บ obj จะยิงสะดวก **ปล.ขอเตือนว่าจะ Remove List item ออกจากList ใน foreach ไม่ได้นะครับ

#18 By จอม (125.26.1.206) on 2008-04-22 07:37

สาวก vb คนหนึ่งครับ เพราะชอบลืมปีกกา
ฝังลึกมาตั้งแต่ Basic question
ปล.Basic มันเขียนง่ายจริงๆ อ่านแค่ /help
ยังเขียนได้เลย big smile
ปล2.ได้มากับแผ่นผี WinMe เห้อๆquestion

#19 By Richter on 2008-10-07 02:08

NinkungZ View my profile


Favourites


View My Stats