สำหรับใครที่เป็นแฟนพันธุ์แท้ C# จะรู้ว่าความสามารถใหม่ (เมื่อนานมาแล้ว) จะสามารถเขียน Functional เหมือนกับภาษา F# หรือ Scala ได้ ซึ่งมันเป็นอะไรที่ว้าวมาก... (โดยเฉพาะผมที่พึ่งได้มีเวลาพักหายใจ)
เข้าเรื่องกันเลยดีกว่า
I know the Greek C# already know the new feature of her. Her have the functional feature like F# or Scala. But for me, this feature is Wowww.
Ok, let's start.
เริ่มแรกผมจะสร้าง Console App ขึ้นมาโดยจะเลือก Target Framework ไปที่ 4.8 ส่วนชื่อโปรเจคก็ตามใจชอบ หลังจากสร้างโปรเจคใหม่แล้ว ตัว Visual Studio ก็จะเปิดไฟล์ Program.cs ขึ้นมา ซึ่งรูปแบบคำสั่งเองก็จะมีลักษณะ ดังนี้
First I will create the console application and select the project target to .Net Framework 4.8, but for the project name; I think you can enter from your need. After create, We will get the code like this.
จากนั้นเราก็มา Re-Factor Code กันใหม่นิดหนึ่ง (ซึ่งเอาจริงๆ ไม่ต้องทำก็ได้ ข้ามไปเลยก็ได้ ฮ่าๆ)
Now, I have re-factor the code by removing unused code. and this is the result of re-factor. or you can skip this step.
หลังจากไร้สาระกันไปแล้ว ต่อไปเราก็จะเริ่มเขียนฟังกชั่นง่ายๆ ตัวนึงขึ้นมา โดยที่โค๊ดจะมีดังนี้
Next, I have writing some functional like this.
และเมื่อเราทดลองรันโปรแกรมของเราดู ก็จะได้ผลลัพท์ เท่ากับ 3 ...
ว่าแต่.. Dev.to ทำใมใส่รูปได้แค่รูปเดียวเองแหะ... เอาเป็นว่าลองไปรันคำสั่งใน dotnetfiddle เอานะครับ
And when I executed. the result is 3.
I don't know why 'Dev.to' can insert only 1 image. Don't worry, please use the below link to test on the Dotnet Fiddle.
https://dotnetfiddle.net/Widget/NHqzJa
จากโค๊ด ... เราได้กำหนดให้ฟังก์ชัน f รับค่า x เข้ามาและนำ x ไปบวกด้วย 2 ซึ่งถ้าเราป้อนค่าให้กับ x โดนกำหนดให้เป็น 1 ผลลัพธ์ที่ได้ก็จะมีค่าเท่ากับ 3 นั่นเอง
From the Functional... I create the f function has the x parameter, and take him to add 2. and when I set x value is 1, the result is 3.
ทีนี้เราจะมาลองเขียนโค๊ดชุดนี้กันแบบสั้นๆ โดยจะเขียนคำสั่งดังนี้
Next, I will create a short functional like this.
และหลังจากทดลองรันดูแล้ว ผลลัพธ์ที่ได้ก็จะเท่ากับ 3 เหมือนกับข้างบน
After executed. The result is 3. Why the result like the previous function?
https://dotnetfiddle.net/Widget/B4yI3i
โอ้ววววว ไม่ต้องใส่ Func นำหน้า f ก็สามารถทำงานได้เหมือนกัน แจ่มปะละ ซึ่งก็จะรวมไปถึง i ที่เมื่อรับค่าจาก f แล้วก็ไม่จำเป็นต้องใส่ int เพราะค่าที่ได้ยังไงก็ได้กลับมาเป็น int แน่นอน
Because of the c# can use the shortcode.The 'f' gets the 'x' parameter and add '2' to 'x';
when I set 'i' to get the value from 'f', The 'i' will get the result from 'f'.
นี่ละที่เป็นความสามารถใหม่ที่ทำให้ว้าวจริงๆ เอาเป็นว่าพอแค่นี้ก่อนดีกว่าง่วงนอนมากกก ไว้ว่างๆ มีเวลาหายใจเดี๋ยวค่อยมาลองเขียน function ใหม่ๆ กันดู
I think this feature is very new for me haha.
ส่งท้ายขยายความ... Func คืออะไร...
Finally, What is the 'Function'?
Func => Function
และค่าที่อยู่ใน <> จะมีความหมายคือ..
โดยที่ input type จะสามารถรับได้ที่ 16 ตัว และ Result 1 ตัว
Func is from Function and the first type in '<>' is the input type and the final type is always is the result type.
Func < T1, T2, T3, ... T16, Result > (พิมพ์ติดแล้วกลายเป็น markdown / I cannot type without space, because this code will change to the markdown.)
ในตัวอย่าง Func f = (x) => x + 2; นั้น หากเราเอามาเขียนเป็น Full Function ก็จะได้คำสั่งแบบนี้
From this function 'Func f = (x) => x + 2;'. If we want to create the full function. This is the code. Haha.
Top comments (1)
จริงๆ Func มีมานานแล้วนะครับ และจริงๆ มันคือ delegate type ที่สามารถรับค่าในรูปแบบฟังก์ชั่นได้
ขอเสริมส่วนที่
ไม่ต้องใส่ Func นำหน้า f ก็สามารถทำงานได้เหมือนกัน
เพราะ f นั้นถูกประกาศเป็น type Func ข้างบนอยู่แล้ว
และ จากบรรทัด
f = (x) => x + 2;
มันคือการ mutate โดยการเอา ฟังก์ชั่นx + 2
มาเขียนทับใน fดังนั้นมันก็ไม่จำเป็นต้องประกาศใหม่
อารมณ์เหมือนประกาศ
int x = 1;
แล้วเรา mutate มันด้วยx = 1;
อีกรอบนั้นเอง