Just algorithm!
ความสามารถลับ ๆ ที่คุณยังไม่รู้ใน C#

เอามาจาก stackoverflow.com นะครับ
ที่จริงอยากแปลไทยให้หมดเลย
แต่มีเยอะมากครับ
เลยเขียนย่อ ๆ ให้ก็แล้วกัน
อันไหนอยากให้อธิบายเพิ่มก็ถามได้ครับ

จริง ๆ ก็มี hidden features ของภาษาอื่น ๆ อีกเพียบเลยครับ
ลองกดเข้าไปดู

สรุปคร่าว ๆ นะครับ ถ้าผิดแย้งด้วยครับไม่ได้รู้ทุกอัน

กลุ่ม keyword

yield

method ที่เป็น IEnumerable จะสามารถคืนค่าได้มากกว่า 1 ค่า
yield return จะเป็นคำสั่งคืนค่าแต่ละค่า
ส่วน yield break จะเป็นคำสั่งหยุดการคืนค่า
(ดูตัวอย่างได้ที่ Post แรก และ Post ที่แล้ว)

var

คุณสามารถประกาศตัวแปรเป็น var แทนที่จะระบุ type ได้เลย
(บางคนคิดว่าประกาศตัวแปรเป็น var แล้วจะสูญเสีย performance จริง ๆ ไม่เสียนะครับ
compiler จะ resolve type ของตัวแปรให้ตั้งแต่ตอน compile)

using

เป็นคำสั่งตั้งชื่อ namespace ใหม่ หรือตั้งชื่อ class ใหม่
มีประโยชน์มากถ้าชื่อมันยาวมาก

readonly

คำสั่งประกาศ field ว่าอ่านได้อย่างเดียว
คุณสามารถกำหนดค่าของ field ที่เป็น readonly ได้ตอนที่ class กำลัง construct เท่านั้น
(readonly ไม่ทำให้ performance เพิ่ม แต่ทำให้มั่นใจว่า field นี้จะไม่โดนแก้ไข)

as

คำสั่งแปลง type ถ้า class นั้น compatible กับ type ที่จะแปลง
ถ้าผ่านจะได้ object ที่แปลง type แล้ว ถ้าไม่ผ่านจะได้ null
ไม่สามารถใช้กับ struct ได้ ใช้กับ class เท่านั้น

is

คำสั่งทดสอบว่า class นั้น compatible กับ type ที่จะทดสอบหรือเปล่า
ไม่สามารถใช้กับ struct ได้ ใช้กับ class เท่านั้น

default(T)

ถ้าใช้กับ type ที่เป็น class จะได้ null
ถ้าใช้กับ type ที่เป็น struct จะได้ 0 หรือค่าเริ่มต้นของ struct นั้น
ใช้ใน generic type ซึ่งเราไม่รู้ว่า type นั้นเป็น class หรือ struct

global::

เป็นการเรียก namespace ตั้งแต่ระดับ root ออกมา
ใช้ในกรณีตั้งชื่อ class ซ้ำกับ namespace เช่น System

using()

object ที่อยู่ในส่วนของ using จะ dispose อัตโนมัติเมื่อออกจาก block ของ using

volatile

ใช้กับ field เป็นการแจ้ง compiler ว่าไม่ต้อง optimize field นี้ในการอ่านข้อมูล
ใช้กับ field ที่โดนแก้ไขแบบ multi-thread และไม่โดน lock
เพื่อให้การอ่านข้อมูลได้ข้อมูลล่าสุดอยู่เสมอ

extern alias

เป็นคำสั่งเรียกใช้ namespace ที่ reference และตั้ง alias ไว้
ใช้ในกรณี Program มี reference library ประเภทเดียวไว้ 2 versions


กลุ่ม attribute

DefaultValue

ใช้ตอนสร้าง Custom Control เป็นการระบุว่า
Property นี้ ค่า Default Value คือเท่าไหร่

Obsolete

เป็นการแจ้ง compiler ว่า สิ่งที่คุณระบุว่า Obsolete
จะไม่มีใน version ถัดไปแล้ว ให้เลิกใช้ซะ
โดยสามารถกำหนดได้ว่าจะให้ขึ้นเตือน หรือบังคับให้ compile ไม่ผ่าน

DebuggerDisplay

ทำให้สิ่งที่คุณระบุ แสดงผลตอน Debug ตามที่คุณต้องการ
(ซึ่งโดยปกติค่าที่แสดงตอน Debug จะเอามาจาก method ชื่อ ToString)

DebuggerBrowsable

เป็นการระบุว่า คุณจะซ่อน Field หรือ Property ไหนตอน Debug

DebuggerStepThrough

เป็นการทำให้ Debugger ข้าม Class หรือ Method ที่คุณระบุตอนกำลัง Debug
(แต่คุณก็ยังสามารถตั้งค่า break point ใน Class หรือ Method นั้นได้)

ThreadStatic

เป็นการระบุ Static Field ที่กำหนดว่า จะมีค่าแยกกันแต่ละ Thread
ใช้เมื่อต้องการให้ Thread แต่ละ Thread เก็บข้อมูลแยกกัน

Flags

ใช้กับ enum เป็นการระบุว่า enum นั้นสามารถมีค่าเป็น combination ได้
เช่น FileAcces มี Read กับ Write และสามารถ set เป็น Read Or Write ได้
(อย่างไรก็ตามตอนระบุ enum คุณต้องตั้งค่าแต่ละอันให้เป็น 1,2,4,8,… ไปเรื่อย ๆ)

Conditional

ใช้กับ method กับ class เป็นการระบุว่า
ถ้าไม่ได้ DEFINE ชื่อ condition ตอน compile
ให้ยกเลิกการเรียก method หรือ class นั้นไปได้เลย


กลุ่ม syntax

??

ใช้หาค่าที่ไม่ใช่ Null อันแรก เช่น a ?? b ?? c
ถ้า a กับ b เป็น Null จะ return c

number flag

Decimal = M
Float = F
Double = D
Long = L
เช่น 30D เป็นการสร้างค่า double ที่มีค่า 30.0
(จริง ๆ แล้ว compiler ฉลาดพอที่จะแปลงค่า constant เป็น type เดียวกับที่เรากำลัง assign เช่น double d = 10;
10 ควรจะเป็น int แต่ตอน compile จะได้ 10.0D อัตโนมัติ ไม่เสีย Performance)

where T :

เป็นการจำกัด Generic Type โดยเติม keyword ด้านล่างต่อท้าย syntax
struct: Generic Type ต้องเป็น struct เท่านั้น
class: Generic Type ต้องเป็น class เท่านั้น
new(): Generic Type ต้องมี public constructor แบบไม่มี parameter
<Base Class>: Generic Type ต้องเป็น Type ที่ derived มาจาก base class ที่กำหนด
<Interface>: Generic Type ต้อง implement interface ที่กำหนด
U: Generic Type ต้อง Derived หรือ implement Type U (ในกรณีมี Type Parameter หลายตัว)

Type Inference

อันนี้เป็น feature ใหม่ C# 3.0
ปกติ method ที่เป็น generic ต้องกำหนด Type Parameter ด้วย
แต่ C# ใหม่ ถ้าคุณกำหนด Parameter ซึ่งระบุ Type นั้นแล้ว ก็ไม่ต้องระบุ Type Parameter
อ่าน Post เก่า เพิ่มเติม

Lambda

feature ใหม่ C# 3.0
เป็นการสร้าง anonymous method แบบสั้น ๆ
อ่าน Post เก่า เพิ่มเติม

Anonymous Type

feature ใหม่ C# 3.0
สร้าง Type แบบ Inline ไม่ต้องเสียเวลาเขียน class
อ่าน Post เก่า เพิ่มเติม

Object/Collection Initializer

feature ใหม่ C# 3.0
เป็นการ set property และ add items แบบ inline
อ่าน Post เก่า เพิ่มเติม

Auto Properties

feature ใหม่ C# 3.0
Post เก่าไม่ได้เขียนถึง เนื่องจากปกติเราต้องกำหนด field ให้ Property อยู่แล้ว
ใช้ Auto Properties ทำให้ไม่ต้องสร้าง field เช่น
public int Name { get; private set; }
จะเห็นว่าไม่ต้องอ้างถึง field หลัง Property Name
และ get กับ set ยังสามารถกำหนด scope ที่ต่างกันได้เหมือนเดิม

@ (string literals)

ปกติ string เรากำหนดอย่างนี้ “…”
แต่เราก็สามารถกำหนดอย่างนี้ก็ได้ @“…”
ต่างกันคือ แบบแรกจะมีรหัสต่าง ๆ เช่น n ขึ้นบรรทัดใหม่
แต่แบบที่ 2 ไม่ต้องมีรหัส จะเก็บ string ตามที่เราพิมพ์ทำให้อ่านง่าย
(เวลาจะ escape เครื่องหมายคำพูดใช้ “” เครื่องหมายคำพูด 2 ที)

enum underlining type

Type ประเภท enum สามารถกำหนด Type หลักได้ด้วยนะ
ถ้าไม่กำหนดจะเป็น int
โดยสามารถกำหนดเป็น number แบบต่าง ๆ เช่น byte, short, long (เฉพาะเลขจำนวนเต็ม)

@variable name

เราสามารถกำหนดชื่อ variable/class หรืออะไรก็ตามแต่
ที่ซ้ำกับ keyword ของ C# ได้ เช่น object โดยต้องมี @นำหน้า เช่น @object
โดยเวลา reflect ออกมาจะได้ชื่อนั้นแบบไม่มี @

event

C# มี event ด้วยนะ หลายคนไม่รู้
เราสามารถ subscribe และ unsubscribe event ได้
และสามารถกำหนด code ตอน add/remove event ได้
(ลองหาข้อมูลเอาเอง มันเยอะมาก)

string format

เราสามารถ format ให้แสดงวงเล็บปีกกาได้ ดูตามตัวอย่างเลยครับ
int foo = 3;
string bar = 'blind mice';
String.Format('{{i am in brackets!}} {0} {1}', foo, bar);
//outputs '{i am in brackets!} 3 blind mice'

? :

Conditional Operator สะดวก เวลาจะเขียน if else แล้วกำหนดค่า เช่น
int foo = (trueOrFalse) ? 1 : 2;


อูย... เหนื่อยหรือยังครับ  ผมเริ่มเหนื่อยละ นี่แค่สรุปนะเนี่ย Smiley

จริง ๆ มีอีกเยอะนะ ขี้เกียจทำละ (ตกม้าตายซะงั้น Smiley )
ตามไปอ่านที่ stackoverflow.com ละกัน

ที่ยังไม่ได้เขียน ขอสรุปอันที่แจ๋ว ๆ ละกัน
- C# มี keyword พิเศษที่ไม่ได้บอกใคร คือ __makeref __reftype __refvalue กะ __arglist (ใช้ทำไรผมก็ไม่รู้)
- คุณสามารถทำ partial method ได้นะ (ประกาศ method file นึง, แล้วเขียน method อีก file นึง)
- คุณสามารถ overload true กะ false ได้นะ (ใช้กำหนดว่าเมื่อไหร่ evaluate เป็น true หรือ false)
- คุณสามารถทำ weakreference ได้ (ใช้ใน program ที่ใช้ resource เยอะ ๆ เช่น tree list ตอนเลิกใช้ก็กำหนดเป็น weakref. แทนที่จะทำลาย เมื่อกลับมาใช้ใหม่ถ้าใช้ทันก่อนโดนทำลาย ก็ไม่ต้องสร้างใหม่)
- ใช้ list.ForEach เร็วกว่าใช้ foreach statement (ไม่เชื่ออะเด่ะ ต้องลอง)
- compare string ใช้ตัวใหญ่เร็วกว่าใช้ตัวเล็ก เช่น s.ToUpper() == "HELLO" เร็วกว่า s.Lower() == "hello" (จริงอ่ะ ?)
- ปกติ anonymous type ใช้ในระดับ class ไม่ได้ใช่มะ แต่มี technic ที่ทำให้ใช้ได้ (ตามไปอ่านเอาเอง)
- มีวิธีทำให้ assembly นึง ประกอบด้วยภาษามากกว่า 1 ภาษาได้ เช่นใน team มีถนัด vb กะ c# ก็แยกกันเขียนแล้วมารวมกัน (ทำไง ?)
- มีวิธีทำให้ .NET 2.0 ซึ่งไม่มี LINQ ใช้ LINQ ได้ (นั่นดิ ทำไง?)
- Parallel Linq ออกเป็น CTP ละ เขียน Linq ธรรมดาแต่ Process แบบ Multi-Thread ได้เลยนะ ไม่ต้องเขียนเอง

สุดท้ายเพิ่มเติมอีกนิดหน่อย นอกเหนือจากใน stackoverflow
- .NET มีออก Package ใหม่ชื่อ Azure ยก SQLServer, WCF, WFF ไป host บน web เฉยเลย
- และ C# ออก spec version 4.0 แล้ว ภาษาเริ่มหลุดโลกขึ้นทุกที

หัวแตกละ...จบ Smiley




Create Date : 13 ธันวาคม 2551
Last Update : 13 ธันวาคม 2551 1:19:53 น. 3 comments
Counter : 8200 Pageviews.

 
- มีวิธีทำให้ .NET 2.0 ซึ่งไม่มี LINQ ใช้ LINQ ได้ (นั่นดิ ทำไง?)

ลงตัว ctp สำหรับ 2.0 ไงครับ


โดย: vista IP: 124.120.70.82 วันที่: 5 มกราคม 2552 เวลา:9:58:02 น.  

 
hhhhhhh hhhhhhhh hhhhhhhhhhhh


โดย: fffffffffffffffffff IP: 124.121.101.171 วันที่: 3 สิงหาคม 2552 เวลา:21:15:31 น.  

 
สุดยอดเลย... บางอย่างคิดไม่ถึงนะนี่
แต่วิธีทำต้องเข้าไปอ่านภาษาอังกฤษ... ตาลาย


โดย: ปปปป IP: 125.27.27.101 วันที่: 8 พฤศจิกายน 2553 เวลา:0:59:00 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

chaowman
Location :
กรุงเทพฯ Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 8 คน [?]





New Comments
Group Blog
 
All Blogs
 
Friends' blogs
[Add chaowman's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.