C# Tutorial ตอนที่ 2 (โครงสร้างพื้นฐานของภาษา)
posted on 04 Jun 2005 21:40 by tidno1 in csharp-and-dotnetComment
คือข้อความที่ถูกแทรกเข้าไปในโปรแกรม เพื่ออธิบายให้ผู้อ่านสามารถเข้าใจโปรแกรมนั้นได้ง่ายขึ้น หรือเพื่อบันทึกข้อมูลที่เกี่ยวข้องกับโปรแกรมนั้น ข้อความที่เป็น comment จะไม่มีผลต่อการทำงานของโปรแกรม ภาษา C# มี comment อยู่ 3 แบบ
- เหมือนภาษา C คือ เริ่มต้นด้วย /* และจบด้วย */ แบบนี้สามารถ comment ได้หลายบรรทัด เช่น /* This is multiple
line comment */ - แบบเดียวกับ C++ คือเริ่มต้นด้วย // ไปจนจบบรรทัดนั้น โดยไม่ต้องมีตัวปิด
- แบบที่สามขึ้นต้นด้วย /// ข้อความในนี้จะถูกนำไปทำเป็น xml documentation
Keyword
คือคำ ที่ถูกกำหนดความหมายไว้แล้ว ในภาษาส่วนใหญ่นั้น รวมทั้ง C# จะถือว่า keyword เป็น reserved word (คำสงวน) นั่นคือไม่สามารถนำไปใช้ในความหมายอื่น นั่นคือห้ามนำไปใช้ เป็นชื่อตัวแปร ชื่อฟังก์ชัน หรือชื่อคลาส ภาษา C# มี keyword ทั้งหมดดังนี้
| abstract | as | base | bool | break |
| byte | case | catch | char | checked |
| class | const | continue | decimal | default |
| delegate | do | double | else | enum |
| event | explicit | extern | false | finally |
| fixed | float | for | foreach | goto |
| if | implicit | in | int | interface |
| internal | is | lock | long | namespace |
| new | null | object | operator | out |
| override | params | private | protected | public |
| readonly | ref | return | sbyte | sealed |
| short | sizeof | stackalloc | static | string |
| struct | switch | this | throw | true |
| try | typeof | uint | ulong | unchecked |
| unsafe | ushort | using | virtual | void |
| volatile | while |
Identifier
คือชื่อที่ผู้เขียนโปรแกรมตั้งขึ้นได้ อาจเป็นชื่อของคลาส ตัวแปร ฟังก์ชัน ชื่อที่ถูกต้องจะต้องไม่เป็น keyword อาจจะประกอบด้วย ตัวอักษรตัวใหญ่, ตัวเล็ก, ตัวเลข และ underscore identifier ที่ถูกต้อง เช่น ThisIsABook, num1, _x, System,Int32 โดยชื่อที่ถูกต้องห้ามขึ้นต้นด้วยตัวเลข และจะมีความยาวเท่าไรก็ได้ ภาษา C# นั้นเป็นภาษาที่ case-sensitve นั่นคือ ตัวเล็ก กับ ตัวใหญ่จะตีความไม่เหมือนกัน เช่น WriteLine กับ Writeline นั้นเป็นคนละตัวกัน
verbatim identifier
verbatim identifier คือ identifer ที่นำเอา keyword มาตั้งชื่อได้ โดยการเติมตัวอักษร @ เข้าไปข้างหน้า
example:
public static void @static(bool @bool) {
if (@bool)
System.Console.WriteLine("true");
else
System.Console.WriteLine("false");
}
}
- ตั้งให้สื่อความหมาย
- ใช้ตัวเล็กตัวใหญ่เพื่อแบ่งคำ
- ถึงแม้ การตั้งชื่อด้วยคำเดียวกันแต่ต่างกันที่ตัวอักษรใหญ่ เล็ก ต่างกันจะทำได้ แต่เราก็ไม่ควร เนื่องจาก .NET นั้นสามารถเรียกใช้ คลาสหรือฟังก์ชันข้ามภาษากันได้ ดังนั้นภาษาที่ case-insensitive เช่น VB.NET อาจจะไม่สามารถใช้งาน identifier แบบนี้ได้
Naming Guidelines
ตัวอย่างแบบคร่าว ๆ นะครับ ที่เหลือแบบเต็ม ๆ ไปหาอ่านได้ใน .NET Framework General Reference Naming Guidelines
Capitalization Styles
Pascal Caseตัวอักษรขึ้นต้นของทุก ๆ คำให้เป็นตัวอักษรตัวใหญ่ เช่น
WriteLineCamel Case
BackColor
ตัวอักษรตัวแรกของ identifier เป็นตัวอักษรตัวเล็ก ต่อจากนั้นเป็นตัวใหญ่ ทุก ๆ คำ เช่น
getStringcamel case นี้เป็น style การตั้งชื่อ method(function) ในภาษา Java ใน .NET ไม่ได้ใช้ style นี้นัก
parseInt
Literal
คือลำดับของตัวอักษรที่ใช้แสดงค่าคงที่ใน source code แบ่งออกเป็น
-
Integral literal คือค่าคงที่ของเลขจำนวนเต็ม เขียนได้ 3 แบบ
- ตัวเลขล้วน ๆ ที่ไม่ขึ้นต้นด้วยเลข 0 จะถูกตีความเป็นเลขฐาน 10
- ตัวเลข 0-7 ที่ขึ้นต้นด้วยเลข 0 จะถูกตีความเป็นเลขฐาน 8 เช่น 0400 คือ 256 ในเลขฐาน 10
- ตัวเลข 0-9 และอักษร A-F(หรือ a-f) ที่ขึ้นต้นด้วย 0X(หรือ 0x) จะถูกตีความเป็นเลขฐาน 16 เช่น 0X7F คือ 127 ในเลขฐาน 10
class IntegerConstant {ผลลัพธ์
public static void Main() {
System.Console.WriteLine(20);
System.Console.WriteLine(020);
System.Console.WriteLine(0x20);
System.Console.WriteLine(12345678901234);
System.Console.WriteLine(12345678901234L);
}
}20
16
32
1942892530
12345678901234 -
Floating-point Literal คือค่าคงที่เลขทศนิยม เขียนได้สองแบบ
- แบบมาตรฐาน เช่น 17.357810
- แบบวิทยาศาสตร์ เช่น 2.997E8(2.997 * 108) หรือ 9.1093897e-31 (จะใช้ e หรือ E ก็ได้)
class FloatAndDouble {ผลลัพธ์
public static void Main() {
float floatPI = 3.1415926535897896f
double doublePI = 3.1415926535897896d
System.Console.WriteLine(floatPI);
System.Console.WriteLine(doublePI);
}
}3.1415927
3.1415926535897896 -
Boolean Literal คือค่าคงที่ความจริง (truth value) มีค่าเป็น true หรือ false
class BooleanLiteral {ผลลัพธ์
public static void Main() {
System.Console.WriteLine(true);
System.Console.WriteLine(false);
System.Console.WriteLine(1 < 2);
System.Console.WriteLine('a' == 'b');
}
}true
false
true
false -
Character Literal คือค่าคงทีตัวอักษร
โดยทั่วไปแล้ว จะถูกแสดงอยู่ใน single quote เช่น 'a' และ '0' หากเป็นอักษรพิเศษ เช่นพวก control character จะต้องถูกนำหน้าด้วย \ (backslash) โดยจะถูกเรียกว่า escaped characterclass EscapedCharacter {ผลลัพธ์
public static void Main() {
System.Console.WriteLine("new line [{0}]", '\n');
System.Console.WriteLine("tab [{0}]", '\t');
System.Console.WriteLine("single quote [{0}]", '\'');
}
}new line [โดย C# ยังมีวิธีแสดงค่าคงที่ตัวอักษร อีกแบบหนึ่งคือ escaped sequence ของ unicode character โดยเขียน \u ตามด้วย เลขฐาน 16 จำนวน 4 หลัก
]
tab [ ]
single quote [']class UnicodeCharacter{ผลลัพธ์
public static void Main() {
System.Console.WriteLine('\u0061');
System.Console.WriteLine("\u0048\u0065\u006c\u006c\u006f");
System.Console.WriteLine('\u0e01');
}
}a
Hello
ก -
String Literal มีรูปแบบคล้าย ๆ กับ character ต่างกันที่จะถูกแสดงอยู่ใน double quote และการจะแสดงเครื่องหมาย single quote ไม่จำเป็นต้องใช้ escaped character
class StringLiteral{ผลลัพธ์
public static void Main() {
System.Console.WriteLine("character is 'a', 'b', ..., 'z'");
System.Console.WriteLine("hello, world");
System.Console.WriteLine(@"hello, world");
System.Console.WriteLine("hello \t world");
System.Console.WriteLine(@"hello \t world");
System.Console.WriteLine("Joe said \"Hello\" to me");
System.Console.WriteLine(@"Joe said ""Hello"" to me";);
System.Console.WriteLine("\\\\server\\share\\file.txt");
System.Console.WriteLine(@"\\server\share\file.txt");
System.Console.WriteLine("C:\\WINDOWS\\SYSTEM32\\edlin.exe");
System.Console.WriteLine(@"C:\WINDOWS\SYSTEM32\edlin.exe");
}
}character is 'a', 'b', ..., 'z'
hello, world
hello, world
hello world
hello \t world
Joe said "Hello" to me
Joe said "Hello" to me
\\server\share\file.txt
\\server\share\file.txt
C:\WINDOWS\SYSTEM32\edlin.exe
C:\WINDOWS\SYSTEM32\edlin.exe
Operator
- Assignment operator ในภาษา C# นั้นก็ได้นำความคิดมาจากภาษา C นั่นคือ เครื่องหมาย = เป็น operator ที่สามารถนำมาใช้ได้ใน expression ปกติได้ เช่น x + (y = 1) นั่นคือมีการกำหนดค่า y ให้เท่ากับ 1 ก่อนแล้วจึงนำไป + กับ x
-
Arithmetic operator แบ่งย่อยออกเป็น
-
Integer & Floating-point operator ได้แก่ +, -, *, /, %(modulus) โดยถ้า operand ทั้งสองของ operator / เป็น integer number, operator / จะถูกตีความเป็น div(หารแบบปัดเศษ) แต่ถ้ามี operand ตัวใดตัวหนึ่งเป็น floating-point number, operator / จะถูกกระทำแบบการหารปกติ
ในภาษา C# จะเหมือนกับ Java นั่นคือ modulus operator นั้นจะสามารถใช้กับ floating-point number ได้ด้วยclass Arithmetic{ผลลัพธ์
public static void Main() {
System.Console.WriteLine(23 / 3);
System.Console.WriteLine(13 % 5);
System.Console.WriteLine(11.5 % 3.1);
}
}7
3
2.2 - Arithmetic assignment operator ได้แก่ +=, -=, *=, /=, %= มีไว้ช่วยเขียน ประโยค assignment ให้อ่านง่ายขึ้น เช่น x = x + 7 สามารถเขียนได้เป็น x += 7 อ่านได้ว่า เพิ่มค่า x อีก 7
-
Increment and Decrement operator ได้แก่ operator 2 ตัว คือ ++ และ -- ซึ่งเขียนได้ทั้งแบบ prefix และ postfix โดย operator นี้ เป็น operator ที่ใช้เพิ่มหรือลดค่าตัวแปรอีกทีละ 1
โดยจุดเริ่มต้นของ operator นี้มาจากภาษา C เพราะคำสั่งประเภทนี้จะถูกแปลเป็นคำสั่ง INC, DEC ในภาษา assembly ซึ่งจะทำงานได้เร็วกว่า ADD และ SUB แต่ในการใช้งานจริงแล้ว ประโยชน์ของมันคือการที่ code อ่านง่ายขึ้นclass IncDec {ผลลัพธ์
public static void Main() {
int x = 0, y;
System.Console.WriteLine(x++);
System.Console.WriteLine(++x);
x = 0;
y = x++;
System.Console.WriteLine("x = {0} y = {1}", x, y);
x = 0;
y = ++x;
System.Console.WriteLine("x = {0} y = {1}", x, y);
}
}0
2
x = 1 y = 0
x = 1 y = 1
-
Integer & Floating-point operator ได้แก่ +, -, *, /, %(modulus) โดยถ้า operand ทั้งสองของ operator / เป็น integer number, operator / จะถูกตีความเป็น div(หารแบบปัดเศษ) แต่ถ้ามี operand ตัวใดตัวหนึ่งเป็น floating-point number, operator / จะถูกกระทำแบบการหารปกติ
-
Bitwise operator เป็น operator ที่จะกระทำกับทุก ๆ bit ของ operand ในชนิด integral type(sbyte, short, int, long, byte, ushort, uint, ulong)
- Boolean bitwise operatorได้แก่ ~(bitwise unary NOT), &(bitwise AND), | (bitwise OR), ^(bitwise XOR), <<(shift left), >>(shift right)
- Assignment bitwise operator เช่นเดียวกับ Arithmetic assignment operator คือนำเอา Boolean bitwise operator มารวมกับเครื่องหมาย = ได้เป็น operator ดังนี้ ~=, &=, |=, ^=, <<=, >>=
-
Relational operator ได้แก่ ==(equal to), !=(not equal to), >(greater than), >= (greater than or equal), <(less than), <=(less than or equal) ใช้ในการเปรียบเทียบกับ operand ที่มีประเภท ตัวเลข, ตัวอักษร(char) , ข้อความ(string), bool โดยข้อมูลประเภทที่ไม่ใช่ตัวเลขนั้น จะสามารถเปรียบเทียบโดยใช้ operator == และ != ได้เท่านั้น และต้องเปรียบเทียบกับข้อมูลประเภทเดียวกันเท่านั้น
โดยผลลัพธ์ของการเปรียบเทียบนั้นจะได้ออกมาค่า boolean(true กับ false) -
Logical operator เนื่องจากว่าในภาษา C# มี boolean type แล้ว ดังนั้น operator ในกลุ่มนี้ จึงสามารถกระทำกับ operand ที่เป็น boolean เท่านั้น(เช่นเดียวกับ Java)
- Boolean Logical operator ได้แก่ &(logical AND), |(logical OR), ^(logical XOR) และ !(logical NOT) จะสังเกตได้ว่า operator เหล่านี้จะใช้เครื่องหมายเดียวกับ bitwise operator โดย compiler จะดูจาก operand ว่าเป็นชนิดใด จึงจะตัดสินใจใช้ operator ในความหมายเหล่านั้น
- Short-Circuit Logical operatorได้แก่ &&(short-circuit AND) และ ||(short-circuit OR) ต่างกับ Boolean Logical operator ตรงที่ว่าจะหยุดคำนวณเมื่อ ผลลัพธ์ของทั้ง expression นั้นสามารถระบุค่าได้แล้ว เช่น
class ShortCircuit{
public static void Main() {
int x = 0, y =0;
System.Console.WriteLine((y != 0) && (++x >0));
System.Console.WriteLine(x);
}
}ลองรันแล้วดูผล
จากนั้นลองเปลี่ยนจาก && เป็น & แล้วลองรันอีกที
- Conditional operator จริง ๆ ไม่อยากเขียนเรื่องนี้เลยเพราะยังทำความเข้าใจกับรูปประโยคค่อนข้างยาก เอาเป็นว่ามันคือ if clause แบบใช้สัญลักษณ์ละกันclass ConditionalOp{
public static void Main() {
int x = 10, y = 5;
System.Console.WriteLine((a > b) ? a : b);
}
}ลองรันแล้วดูผลเองละกันครับแล้วจะเข้าใจ
สงสัยจะต้องต่อตอน 2 พรุ่งนี้ล่ะครับ วันนี้ละเอียดจัด คงจบไม่ไหว

#1 By zkan on 2005-06-04 21:58